- 最新动态
- 功能总览
- 产品介绍
- 计费说明
- 快速入门
- 用户指南
-
最佳实践
- FunctionGraph最佳实践汇总
-
数据处理类实践
- 使用FunctionGraph函数对OBS中的图片进行压缩
- 使用FunctionGraph函数为OBS中的图片打水印
- 使用FunctionGraph函数对DIS数据进行格式转换并存储到CloudTable
- 使用FunctionGraph函数实现通过API方式上传文件
- 使用FunctionGraph函数对IoTDA中的设备坐标数据进行转换
- 使用FunctionGraph函数对OBS中的文件进行加解密
- 使用FunctionGraph函数识别LTS中的异常业务日志并存储到OBS
- 使用FunctionGraph函数对LTS中的日志进行实时过滤
- 使用FunctionGraph函数流对OBS中的图片进行旋转
- 使用FunctionGraph函数流对图片进行压缩和打水印
- 功能应用类实践
- 函数构建类实践
- 开发指南
- API参考
- SDK参考
- 场景代码示例
-
常见问题
-
产品咨询
- 使用FunctionGraph是否需要开通计算、存储、网络等服务?
- 使用FunctionGraph开发程序之后是否需要部署?
- FunctionGraph为函数分配的磁盘空间有多少?
- 是否支持在函数中启动TCP的监听端口,通过EIP接收外部发送过来的TCP请求?
- 函数发起HTTP请求的源地址如何获取?
- FunctionGraph是否支持对上传的zip文件进行反编译?
- FunctionGraph的函数是否支持功能扩展?
- FunctionGraph中的代码是如何隔离的?
- 函数常规信息中的“应用”如何理解?
- 用户需要为函数的冷启动时间付费吗?
- 函数计费中的调用次数,是某一账号下在不同region的所有函数的调用次数总和吗?
- Python语言的函数从V1版本迁移到V2版本时需注意哪些兼容性问题?
- FunctionGraph函数支持哪些编程语言?
- 创建函数
-
配置函数
- 能否在函数环境变量中存储敏感信息?
- FunctionGraph的函数如何读写上传的文件?
- 为函数挂载文件系统时,报“failed to mount exist system path”
- FunctionGraph如何实现域名解析?
- FunctionGraph如何通过域名访问专享版APIG中注册的接口?
- FunctionGraph函数通过域名访问APIG中注册的接口时,报域名无法解析?
- 使用定制运行时语言的函数能操作哪些目录?
- FunctionGraph的函数支持哪些中文字体?
- 能否在函数代码中使用线程和进程?
- 函数如何访问MySQL数据库?
- 函数无法通过VPC连接对应的Redis?
- 如何读取函数的请求头?
- Python语言的函数中,中文注释报乱码错误
-
调用函数
- FunctionGraph的函数执行需要多长时间?
- FunctionGraph的函数执行包含了哪些过程?
- FunctionGraph函数长时间不执行时,相关的实例会如何处理?
- 如何获取函数运行过程中的内存使用量信息?
- 为什么首次调用函数时速度会比较慢?
- 为什么函数实际使用内存大于预估内存,甚至触发内存溢出OOM?
- 函数执行失败返回“runtime memory limit exceeded”时,如何查看内存占用大小?
- 自定义镜像函数执行失败报“CrashLoopBackOff”
- 同步调用函数时,未收到调用响应的可能原因?
- 函数中os.system("command &")命令的执行日志未采集,应如何处理?
- 函数执行超时的可能原因有哪些?
- 使用APIG触发器调用一个返回String的FunctionGraph函数时,报500错误
- Python2.7在执行reload(sys)后无法通过print打印日志
- 运行函数时报错error while loading shared libraries时如何处理?
- 配置触发器
- 配置依赖包
-
产品咨询
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
构建程序
创建API分组
创建函数及添加事件源之前,需要先创建一个API分组,API分组是API的管理单元,用来存放API。
- 登录APIG控制台,在左侧导航栏选择“API管理 > API分组”,单击“创建API分组”。
- 选择直接创建,设置以下分组信息,完成后单击“确定”创建分组。
- 分组名称:输入您自定义的分组名称,例如APIGroup_test。
- 描述:输入对分组的描述。
创建自定义认证函数
前端自定义认证指APIG利用校验函数对收到的API请求进行安全认证,如果您想要使用自己的认证系统对API的访问进行认证鉴权,您可以在API管理中创建一个前端自定义认证来实现此功能。您需要先在FunctionGraph创建一个函数,通过函数定义您所需的认证信息,函数创建成功后,即可对API网关中的API进行认证鉴权。
本示例以Header中的请求参数:event["headers"],为例进行演示。请求参数详细说明请参见请求参数代码定义示例。
- 在服务控制台左侧导航栏,选择“计算 > 函数工作流”,进入函数工作流控制台后,在左侧导航栏选择“函数 > 函数列表”,进入函数列表界面。
- 单击“创建函数”,进入创建函数流程。
- 填写函数配置信息,完成后单击“创建函数”。
- 模板:选择“使用空白模板”。
- 函数类型:事件函数。
- 函数名称:输入您自定义的函数名称,例如:apig-test。
- 委托名称:选择“未使用任何委托”。
- 运行时语言:选择“Python 2.7”。
- 进入函数详情页,在“代码”页签,进行代码在线编辑,复制Header中的请求参数定义代码示例中的代码并单击“部署”,更新函数。
- 配置测试事件,测试用于前端自定义认证的函数。单击“配置测试事件”,选择事件模板。根据实际情况修改后保存测试模板(本示例在"headers"中添加"auth":"abc"),完成后单击“创建”。
图1 配置测试事件
- 单击“测试”,执行结果为“成功”时,表示自定义认证函数创建成功。
图2 查看执行结果
创建自定义认证
在APIG中创建自定义认证,对接前端自定义认证的函数。
- 在服务控制台左侧导航栏,选择“应用中间件 > API网关”登录APIG控制台,在左侧导航栏选择“API管理 > API策略”,在“自定义认证”页签下,单击“创建自定义认证”,弹出“创建自定义认证”对话框。
- 配置自定义认证基础信息,如下图所示。
- 认证名称:输入您自定义的名称,例如Authorizer_test。
- 类型:选择“前端”。
- 函数地址:请选择用于前端自定义认证的函数apig-test。
图3 创建自定义认证
- 完成后单击“确定”,完成自定义认证的创建。
创建后端业务函数
API网关(APIG)支持选择FunctionGraph作为后端服务类型,当请求设置函数工作流为后端服务的API时,API网关会触发相应的函数,函数工作流会将执行结果返回给API网关(APIG)。
- 创建函数方法与上述创建自定义认证函数相同,只需修改函数名称,避免名称重复。
- 在函数详情页的“代码”页签,进行代码在线编辑,并传入如下所示的代码,完成后单击“部署”,更新函数。
# -*- coding:utf-8 -*- import json def handler (event, context): body = "<html><title>Functiongraph Demo</title><body><p>Hello, FunctionGraph!</p></body></html>" print(body) return { "statusCode":200, "body":body, "headers": { "Content-Type": "text/html", }, "isBase64Encoded": False }
请求参数代码定义示例
在FunctionGraph中开发函数,以python2.7语言为例,函数代码需要满足如下条件。
函数有明确的接口定义,如下所示:
- 入口函数名(handler):入口函数名称,需和函数执行入口处用户自定义的入口函数名称一致。
- 执行事件(event): 函数执行界面由用户输入的执行事件参数, 格式为JSON对象。
- 上下文环境(Context):Runtime提供的函数执行上下文,其接口定义在SDK接口说明。
- Header中的请求参数:event["headers"]["参数名"]
- Query中的请求参数:event["queryStringParameters"]["参数名"]
- 您自定义的用户数据:event["user_data"]
- Header中的请求参数:对应自定义认证中参数位置为Header的身份来源,其参数值在您调用使用该前端自定义认证的API时传入
- Query中的请求参数:对应自定义认证中参数位置为Query的身份来源,其参数值在您调用使用该前端自定义认证的API时传入
- 您自定义的用户数据:对应自定义认证中的用户数据,其参数值在您创建自定义认证时输入
- 函数的返回值不能大于1M,必须满足如下格式:
{ "statusCode":200, "body": "{\"status\": \"allow\", \"context\": {\"user\": \"abc\"}}" }
其中,body字段的内容为字符串格式,json解码之后为:
{ "status": "allow/deny", "context": { "user": "abc" } }
“status”字段为必选,用于标识认证结果。只支持“allow”或“deny”,“allow”表示认证成功,“deny”表示认证失败。
“context”字段为可选,只支持字符串类型键值对,键值不支持JSON对象或数组。
context中的数据为您自定义的字段,认证通过后作为认证参数映射到API网关后端参数中,其中context中的参数名称与系统参数名称必须完全一致,且区分大小写,context中的参数名称必须以英文字母开头,支持英文大小写字母、数字、下划线和中划线,且长度为1 ~ 32个字符。
Header中的请求参数定义代码示例:
# -*- coding:utf-8 -*- import json def handler(event, context): if event["headers"].get("auth")=='abc': resp = { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user":"success" } }) } else: resp = { 'statusCode': 200, 'body': json.dumps({ "status":"deny", }) } return json.dumps(resp)
Query中的请求参数定义代码示例:
# -*- coding:utf-8 -*- import json def handler(event, context): if event["queryStringParameters"].get("test")=='abc': resp = { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user":"abcd" } }) } else: resp = { 'statusCode': 200, 'body': json.dumps({ "status":"deny", }) } return json.dumps(resp)
用户数据定义代码示例:
# -*- coding:utf-8 -*- import json def handler(event, context): if event.get("user_data")=='abc': resp = { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user":"abcd" } }) } else: resp = { 'statusCode': 200, 'body': json.dumps({ "status":"deny", }) } return json.dumps(resp)