如需使用流行Web应用框架编写函数代码和构建AI项目,可创建HTTP函数,并根据业务需求完成函数代码、网络配置及函数触发器等必要配置。本章节介绍如何通过控制台创建HTTP函数并提供HTTP使用示例。
FunctionGraph支持创建空白事件函数和HTTP函数,关于事件函数与HTTP函数的选型对比请参考表1。
表1 事件函数与HTTP函数选型对比 对比项 | 事件函数 | HTTP函数 |
|---|
功能 | 用于处理文件和数据流,可以通过各类云产品的事件触发,以及用于处理异步请求,能够追踪并保存每个异步调用的状态。 | 支持流行的Web应用框架和AI项目,可以通过浏览器访问,或通过URL调用。 |
适用场景 | - 云产品集成: OBS实时文件处理、LTS日志加工等。
- ETL数据加工:数据库数据清洗、消息队列处理等。
- 常规任务:定时任务、周期任务、脚本任务等。
- 多媒体处理:音视频转码、直播录制、图片加工等。
| - 快速构建流行Web框架应用:Express、Flask等。
- 快速构建AI模型推理服务:如Stable Diffusion、ComfyUI、DeepSeek等。
- 迁移已有的应用和接口:HTML5网站、REST API接口、移动APP、小程序、游戏结算等。
|
HTTP函数概述
HTTP函数专注于优化 Web 服务场景,用户可以直接发送HTTP请求到URL触发函数执行,从而使用自己的Web服务。HTTP函数支持HTTP/1.1协议。
HTTP函数有以下优势:
- 丰富的框架支持
您可以使用常见的Web框架(例如 Nodejs Web 框架:Express、Koa)编写HTTP函数,也可以将您本地的Web框架服务以极小的改造量快速迁移上云。
- 减少请求处理环节
函数可以直接接收并处理HTTP请求,API 网关不再需要做JSON格式转换,减少请求处理环节,提升Web服务性能。
- 编写体验舒适化
HTTP 函数的编写体验更贴近编写原生Web服务,可以使用Node.js原生接口,保证和本地开发服务体验一致。
HTTP函数公共请求头
HTTP请求头是HTTP协议中用于传递元数据的重要组成部分,在函数调用时可以传递特定的元数据或配置信息,函数默认携带的公共请求头字段如表2所示。
HTTP函数的密钥信息仅能通过请求头传递,如需获取HTTP函数的AK、SK、Token,请参考配置HTTP函数的请求头传入密钥。
表2 默认请求头 字段 | 描述 |
|---|
X-CFF-Request-Id | 当前的请求ID。 |
X-CFF-Memory | 函数分配的内存。 |
X-CFF-Timeout | 函数超时时间。 |
X-CFF-Func-Version | 函数版本。 |
X-CFF-Func-Name | 函数名称。 |
X-CFF-Project-Id | 函数的ProjectID。 |
X-CFF-Package | 函数组。 |
X-CFF-Region | 函数当前所在Region。 |
约束与限制
表3 创建HTTP函数约束限制 限制类别 | 具体限制 |
|---|
创建函数数量限制 | 单个账户下最大允许创建的函数个数默认为400个,如需扩大配额请提交工单。 |
HTTP函数限制 | |
其他限制 | |
前提条件
- 使用函数工作流控制台的所有操作均默认具有操作权限,请确保您登录的用户已有“FunctionGraph Administrator”权限,即FunctionGraph服务所有权限,更多权限的说明请参考权限管理。
- 如果函数工作流服务需要访问云日志服务LTS、虚拟私有云VPC等其他云服务进行协同工作,则需创建函数委托并授权函数工作流服务访问所需云服务的权限;若函数工作流服务无需访问其他云服务,则无需创建和选择函数委托。
- 如果需要配置函数工作流服务访问VPC内资源,请参考创建虚拟私有云和子网创建VPC和子网。
创建HTTP函数
- 登录函数工作流控制台,在左侧的导航栏选择“函数 > 函数列表”。
- 单击右上方的“创建函数”,进入“创建函数”页面。
- 如图1所示,创建方式选择“创建空白函数”,参考表4配置函数基本信息,参考表5配置函数高级设置参数。
图1 创建HTTP函数基本信息
表4 函数基本信息 参数 | 说明 | 取值样例 |
|---|
函数类型 | 选择HTTP函数。 处理HTTP请求的函数,可以直接发送HTTP请求到URL触发函数执行,从而使用Web服务。 | HTTP函数 |
区域 | 选择函数所在的区域。 不同区域的资源之间内网不互通,请就近选择靠近您业务的区域,可以降低网络时延、提高访问速度。 | 华东-上海一 |
函数名称 | 输入自定义的函数名称,命名规则如下: - 可包含字母、数字、下划线和中划线,长度不超过60个字符。
- 以大/小写字母开头,以字母或数字结尾。
| FG-demo |
企业项目 | 选择函数所属的企业项目。企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 默认为“default”,支持用户选择已创建的企业项目。 如果您没有开通企业管理服务,将无法看到企业项目选项。开通方法请参见如何开通企业项目。 | default |
委托 | 选择函数的委托。通过委托来授权函数工作流来访问其他云服务,若函数不访问任何云服务,则无需选择委托。 默认“未使用任何委托”,支持选择已创建的委托。 当华为云账号下无函数默认委托时,FunctionGraph提供快速创建默认委托“fgs_default_agency”的功能,详情请参见默认委托。 | fgs_default_agency |
委托权限策略 | 此参数仅在选择使用委托时显示。 选定委托后将展示该委托关联的权限策略,如需调整权限策略,请参考修改函数委托通过IAM控制台进行操作。 | DIS User; SWR Admin; fgs_default_region_role; fgs_default_global_role |
图2 创建函数高级设置参数说明
表5 创建函数高级设置参数说明 参数 | 说明 | 取值样例 |
|---|
函数访问公网 | 开启时,函数可以通过默认网卡访问公网上的服务,其公网访问带宽为用户间共享,仅适用于测试场景。 | 开启 |
函数访问VPC内资源 | 开启此参数需要函数配置包含VPC管理权限的委托,若基本信息的委托中选择“未使用任何委托”则无法开启。 开启时,函数将使用配置的VPC所绑定的网卡进行网络访问,同时禁用函数工作流的默认网卡,即开关“函数访问公网”参数将不生效。 开启后可选择函数需访问的VPC及其子网。 | 未开启 |
日志记录 | 启用日志功能后,函数运行过程中产生的日志会上报到云日志服务(LTS)。 开启后可配置以下参数: | 未开启 |
标签 | 为函数添加标签,标签用于标识和分类函数资源。 添加标签后,可在“函数列表”页面通过标签快速检索和定位函数,便于系统化管理资源。 标签与函数资源间为多对多关系,最多支持为单个函数添加20个标签。 | - |
KMS静态加密代码 | 当前仅“拉美-圣保罗一”区域支持配置该参数。 选择是否使用KMS静态加密函数代码。 支持选择以下加密类型: 请参考JSON视图配置自定义策略前往IAM控制台配置函数的委托权限策略。 | (默认)functiongraph/default |
- 配置完成后单击“创建函数”,页面跳转至函数详情配置页面,界面上方显示成功创建函数。
- 完成函数创建后,请参见配置函数,根据业务需求完成各项配置,即可使用函数。
HTTP函数使用示例
以下以一个完整的HTTP函数创建和配置示例介绍HTTP函数的使用方法。
在调用API前,请先确保您的业务系统所在网络与API的访问域名或地址互通:
- 若业务系统与HTTP函数在相同VPC内时,可直接访问API。
- 若业务系统与HTTP函数在同一区域的不同VPC内时,可通过创建VPC对等连接,将两个VPC的网络打通,实现同一区域跨VPC访问API。具体步骤请参考VPC对等连接说明。
- 若业务系统与HTTP函数在不同区域的不同VPC内时,可通过创建云连接实例并加载需要互通的VPC,将两个VPC的网络打通,实现跨区域跨VPC访问API。具体步骤请参考跨区域VPC互通。
- 若业务系统与HTTP函数通过公网互通,请确保HTTP函数已绑定弹性IP。
步骤一:制作代码包
- 准备一个node脚本文件,命名为“index.js”,代码示例如下:
const http = require('http'); // Import Node.js core module
var server = http.createServer(function (req, res) { //create web server
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write('<html><body><h2>This is http function.</h2></body></html>');
res.end();
});
server.listen(8000, '127.0.0.1'); //6 - listen for any incoming requests
console.log('Node.js web server at port 8000 is running..') 如需解析事件中的body,可参考以下代码示例:
const http = require('http');
const server = http.createServer((req, res) => {
// 只处理 POST 请求(也可以处理 PUT/PATCH/DELETE 等有请求体的方法)
if (req.url.startsWith("/apig-event-template")) {
let body = '';
// 1. 监听 'data' 事件收集数据块
req.on('data', (chunk) => {
body += chunk; // 将二进制数据块转为字符串
// 可选:设置请求体大小限制(防止内存溢出)
if (body.length > 1e6) { // 1MB
req.destroy(); // 终止连接
}
});
// 2. 监听 'end' 事件处理完整请求体
req.on('end', () => {
try {
// 根据 Content-Type 处理不同格式
const contentType = req.headers['content-type'] || '';
// 处理 JSON 格式
if (contentType.includes('application/json')) {
const data = JSON.parse(body);
console.log('Received JSON:', data);
// 处理表单格式 (URL编码)
} else if (contentType.includes('application/x-www-form-urlencoded')) {
const params = new URLSearchParams(body);
const data = Object.fromEntries(params);
console.log('Received form data:', data);
// 处理普通文本
} else {
console.log('Received raw text:', body);
}
// 响应客户端
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Body received');
} catch (error) {
// 处理错误(如 JSON 解析失败)
console.error('Error processing body:', error);
res.writeHead(400, { 'Content-Type': 'text/plain' });
res.end('Invalid body format');
}
});
// 3. 处理请求错误
req.on('error', (error) => {
console.error('Request error:', error);
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('Internal server error');
});
} else {
// 处理无请求体的方法
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('No body needed');
}
});
// 启动服务器
const PORT = 8000;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
}); - 准备一个bootstrap启动文件,作为HTTP函数的启动文件。
示例:bootstrap文件内容如下。
/opt/function/runtime/nodejs12.13/rtsp/nodejs/bin/node $RUNTIME_CODE_ROOT/index.js
- 将上述两个文件打包为zip文件。
图3 文件打成zip包
如果执行HTTP类型是Python函数,则bootstrap文件中执行函数时,建议增加“-u”参数确保日志落盘。例如:
/opt/function/runtime/python3.6/rtsp/python/bin/python3 -u $RUNTIME_CODE_ROOT/index.py
如需使用其他语言,则参考表6更换语言路径,请注意根据使用的运行时语言版本更换路径信息,代码包路径无需更换。
表6 多语言路径说明示例 语言 | 路径 |
|---|
Java21 | /opt/function/runtime/java21/rtsp/jre/bin/java |
Python3.12 | /opt/function/runtime/python3.12/rtsp/python/bin/python3 |
PHP8.3 | /opt/function/runtime/php8.3/rtsp/php/bin/php |
C# (.NET Core 8.0) | /opt/function/runtime/dotnet8.0/rtsp/dotnet/dotnet |
步骤二:部署代码包
- 参考创建HTTP函数创建一个HTTP函数。
- 在HTTP函数的代码详情页中,单击“上传代码 > Zip文件”上传步骤一:制作代码包准备好的Zip包。
- 创建触发器。
- 选择“设置 > 触发器”页签,单击“创建触发器”。
- 如图4所示配置触发器信息,此处以创建“API网关服务(APIG专享版)”触发器为例,参数详情请参见使用API网关服务(APIG专享版)触发器。
图4 创建触发器
示例中“安全认证”选择“None”,生产环境强烈建议开启APP认证或IAM认证。
- 配置完成后,单击“确定”,完成APIG触发器创建。
- 发布API。
- 单击“触发器”页签下的API名称,跳转至API的总览页面。
图5 API触发器
- 单击右上方的“编辑”,进入“基本信息”页面。
图6 编辑API
- 修改“路径”参数为“/user/get”并单击“完成”。
图7 定义API请求
- 回到API详情界面,单击右上角的“发布最新版本”,在“发布API”页面单击“确定”完成API发布。
步骤三:触发函数执行
- 返回函数工作流控制台,在左侧导航栏选择“函数 > 函数列表”,单击创建的HTTP函数进入函数详情页。
- 选择“设置 > 触发器”,如图8所示复制“调用URL”,在浏览器访问。
图8 复制URL
- 查看请求结果。
图9 查看请求结果