HTTP触发器通过发送HTTP请求触发函数执行,主要适用于快速构建Web服务等场景。在使用HTTP触发器前,您需要关注触发器的限制及支持的HTTP/HTTPS、WebSocket和gRPC协议的限制,以防止超过限制而导致函数报错。同时,本文介绍了HTTP触发器调用的方式、认证鉴权方式和跨域请求的使用方式。
注意事项
如果您的HTTP触发器为匿名触发器,即触发器配置中认证方式选择为无需认证,则无需验证身份,任何人都可以发送HTTP请求调用您的函数,存在URL泄露的风险。此时,您可以设置检查请求消息头部字段
Authorization
是否合法来进行鉴权验证,避免URL泄露。更多信息,请参见签名认证。根据国家网络安全监管要求,自2024年06月10日起,新创建的HTTP触发器将禁止通过公网访问地址下载APK文件(MIMETYPE为application/vnd.android.package-archive),APK文件下载访问将直接返回400错误码。更多信息,请参见如何确保HTTP触发器公网访问地址正常返回.apk文件。
VIP(虚拟IP地址)轮换机制。
函数计算服务为了增加系统韧性和服务稳定性,一直以来均实施VIP(虚拟IP地址)轮换机制。这意味着,作为我们基础设施健壮性的一部分,HTTP触发器所提供的公网/内网访问地址所对应的VIP地址将会不定期地进行轮换。
特别提醒您,直接硬编码VIP地址可能会引发服务中断,强烈建议通过自定义域名方式访问,确保业务的健壮性。注意,因不当使用VIP引发的故障不在函数计算产品赔付范畴内,请您检查并调整为正确使用方式。
您可以使用自定义域名配合CNAME来正确访问函数计算。更多信息,请参见配置自定义域名。
使用限制
在配置和使用HTTP触发器前,您需要了解HTTP触发器的使用限制和支持的HTTP/HTTPS、WebSocket以及gRPC协议的使用限制。
触发器限制
非Web Server模式的Custom Container函数不支持创建HTTP触发器。
函数设置HTTP触发器后不能再设置其他类型的触发器。
HTTP触发器默认提供的内置域名只用来提供测试服务,请不要用于对外的线上服务,避免因内置域名提供服务的稳定性影响您的线上服务。
说明对外提供网站类型服务只能通过已备案域名来实现。即通过配置自定义域名,将域名与函数进行绑定,使用自己的域名对外提供服务。更多信息,请参见配置自定义域名。
HTTP/HTTPS协议使用限制
支持GET、POST、PUT、DELETE、HEAD、PATCH和OPTIONS方式触发函数,适用于简单的请求-响应场景。更多信息,请参见配置HTTP触发器并使用HTTP触发。
HTTP Request限制
Request Headers不支持以x-fc-开头的自定义字段和connection、keep-alive自定义字段。
如果Request超过以下限制,会返回
400
状态码和InvalidArgument
错误码。Headers大小:Headers中的所有Key和Value的总大小不得超过8 KB。
Path大小:包括所有的Query Params,Path的总大小不得超过8 KB。
Body大小:同步调用请求的Body的总大小不得超过32 MB,异步调用请求的Body的总大小不得超过128 KB。
HTTP Response限制
Response Headers不支持以x-fc-开头的自定义字段和connection、content-length、date、keep-alive、server、upgrade、content-disposition:attachment自定义字段。
如果Response超过以下限制,会返回
502
状态码和BadResponse
错误码。Headers大小:Headers中的所有Key和Value的总大小不得超过8 KB。
说明从安全角度考虑,使用函数计算默认的aliyuncs.com域名,服务端会在Response Headers中强制添加content-disposition: attachment字段,此字段会使得返回结果在浏览器中以附件的方式下载。如果要解除该限制,需设置自定义域名。更多信息,请参见配置自定义域名。
WebSocket协议使用限制
支持GET方式触发函数,适用长连接、实时消息等场景。更多信息,请参见配置HTTP触发器并使用WebSocket触发。
Runtime支持:仅Custom Runtime和Custom Container支持WebSocket协议。
超时时间限制:WebSocket请求受函数配置的超时时间限制。
WebSocket握手的Request限制:
Request Headers不支持以x-fc-开头的自定义字段。
Headers大小:Headers中的所有Key和Value的总大小不得超过8 KB。
Path大小:包括所有的Query Params,Path的总大小不得超过8 KB。
Body:WebSocket握手请求中不支持发送Body,即使发送,也会被函数计算系统忽略。
WebSocket握手的Response限制:
Response Headers中所有Key和Value的总大小不得超过8 KB,否则会返回
502
状态码和BadResponse
错误码。WebSocket数据传输限制:
WebSocket链接建立之后,一次发送或接收的数据包(message)最大体积为6 MB。
gRPC协议使用限制
支持gRPC协议触发函数,适用于低延迟、高性能、使用ProtoBuf支持多语言通信的场景。更多信息,请参见配置HTTP触发器并使用gRPC触发。
Runtime支持:仅Custom Runtime和Custom Container支持gRPC协议。
使用时的限制:
使用gRPC触发函数执行前,请确保HTTP触发器的请求方法中包含POST。
请使用子域名
fcapp.run
或者自定义域名发起gRPC调用。
超时时间限制:gRPC请求受函数配置的超时时间限制,即流式gRPC的链接最长保持时间不得超过函数配置的执行超时时间。
gRPC数据传输限制:gRPC流式链接建立之后,一次发送或接收的数据包(message)最大体积为6 MB。
优势
HTTP触发器与API网关触发器均可应用于Web应用的创建。使用方式如下:
HTTP触发器:您可以通过绑定自定义域名,为HTTP函数映射不同的HTTP访问路径。详细信息,请参见配置自定义域名。
API网关触发器:您还可以使用API网关,后端服务类型选择函数计算2.0,函数类型选择HTTP函数,选择后端服务地址,实现类似功能。详细信息,请参见使用函数计算作为API后端服务。
相较于API网关触发器,HTTP触发器有以下优势。
降低开发人员的学习成本和简化开发人员的调试过程,帮助开发人员快速使用函数计算搭建Web应用和API。
减少请求处理环节,HTTP触发器支持更高效的请求、响应格式,不需要编码或解码成JSON格式,性能更优。
支持选择熟悉的HTTP测试工具验证函数计算侧的功能和性能。
方便对接其他支持Webhook回调的服务,例如CDN回源、MNS等。
支持WebSocket和gRPC协议。
调用方式
同步调用
同步调用指事件被函数处理后直接返回结果。HTTP触发器默认的函数调用方式为同步调用。更多信息,请参见同步调用。
异步调用
异步调用指函数计算收到请求后,将请求持久化保存,然后立即返回响应,而不是等待请求执行完成后,再返回执行结果。
异步调用:触发HTTP函数时,您可以通过增加请求头
"X-Fc-Invocation-Type":"Async"
的方式实现请求级别的异步调用。异步任务:HTTP函数配置了异步任务后,可以通过增加请求头
"X-Fc-Stateful-Async-Invocation-Id":"g6u*****iyvhd3jk8s6bhj0hh"
完成异步任务调用Invocation ID的配置。
关于请求头的更多信息,请参见InvokeFunction - 调用函数。
异步调用成功后,函数计算会返回状态码202
,表示请求接收成功。同时会通过请求头返回Request ID和Stateful Invocation ID,格式如"X-Fc-Request-Id": "80bf7****281713e1", "X-Fc-Stateful-Async-Invocation-Id": "7522ba40****1c22e"
。
如果函数计算返回的状态码是202
以外的状态码,则表示调用失败。关于调用失败后错误原因,请参见错误处理。
针对某些场景,您提交一次异步调用后,需要函数计算对其进行延迟触发。此时,您可以在代码中添加HTTP请求头x-fc-async-delay
,其取值范围为(0,3600),单位为秒。函数计算将从您触发执行开始计算,延迟x-fc-async-delay
设置的时间后触发函数调用。更多信息,请参见延迟调用。
认证鉴权
函数计算支持对HTTP触发器配置认证鉴权。外部用户通过HTTP触发器访问函数时,必须经过函数计算的认证鉴权之后,才能访问到函数。HTTP触发器目前支持签名认证和JWT认证两种鉴权方式。
使用签名认证方式调用HTTP函数
客户端在调用HTTP函数的时候,需要先根据事先分配好的AK和SK对请求内容进行计算签名,在发起HTTP请求时,需要将AK和签名信息传输给函数计算进行验证。更多信息,请参见签名认证。
此认证方式安全强度较高,但是需要您自己在客户端实现签名算法,实现成本较高。并且需要将AK和SK保存在客户端,AK和SK存在泄露的风险,虽然可以通过阿里云临时安全令牌(STS) 来避免这个问题,但是会引入一定的架构复杂性。
使用JWT(JSON Web Tokens)认证方式调用HTTP函数
JWT是一套流行的API授权访问机制,安全强度高,适用于JavaScript或Web前端等安全性较低的客户端场景。更多信息,请参见为HTTP触发器配置JWT认证鉴权。
CORS请求处理
函数计算系统默认允许HTTP函数的调用请求跨域访问,同时也支持用户在函数代码中自定义函数对跨域(即CORS)请求的处理行为。
简单请求
简单请求不会发送预检请求,您可以直接在函数代码中设置Access-Control-Allow-*
开头的Header,完成简单的访问控制。对于简单请求,函数计算支持自定义的Headers包括:Access-Control-Allow-Origin
、Access-Control-Allow-Headers
、Access-Control-Request-Method
和Access-Control-Max-Age
。
如果您没有自定义Headers,函数计算的Response Headers会默认设置为Request请求中相应的字段:
Access-Control-Allow-Origin
:Request请求的Origin Header。Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers
:函数计算自定义的一些Headers。
非简单请求
非简单请求在发送正式请求前会发送预检请求,即一次非简单请求包含一次OPTIONS方法的函数调用请求和一次实际的函数调用请求。正式请求的规则与上文的简单请求相同。如果您需要自定义预检请求的返回,则需要:为HTTP触发器添加OPTIONS方法,然后在函数代码中处理OPTIONS请求,即设置Access-Control-Allow-*
开头的Header以控制函数的跨域行为。
对于预检请求,函数计算支持用户自定义的Headers包括Access-Control-Allow-Origin
、Access-Control-Allow-Headers
、Access-Control-Request-Method
和Access-Control-Max-Age
。
以Node.js为例,函数代码中处理预检请求的示例如下所示:
exports.handler = (req, resp, context) => {
console.log('hello world');
if (req.method === 'OPTIONS') {
// Send response to OPTIONS requests
resp.setHeader('Access-Control-Allow-Origin', 'http://www.fc.com')
resp.setHeader('Access-Control-Allow-Methods', 'POST');
resp.setHeader('Access-Control-Allow-Headers', 'Content-Type');
resp.setHeader('Access-Control-Max-Age', '3600');
resp.setStatusCode(204)
resp.send('');
} else {
resp.send("hello world");
}
}
常见问题
相关文档
设置HTTP触发器的函数和事件函数的入口函数是有差异的,请确认您设置的函数入参是否正确。详细信息可参考以下文档。