函数 URL 是 Lambda 函数的专用 HTTP(S) 端点。您可以通过 Lambda 控制台或 Lambda API 创建和配置函数 URL。
提示
Lambda 提供了两种方法来通过 HTTP 端点调用函数:函数 URL 和 Amazon API Gateway。如果您不确定哪种方法最适合您的应用场景,请参阅选择使用 HTTP 请求调用 Lambda 函数的方法。
创建函数 URL 时,Lambda 会自动为您生成唯一的 URL 端点。创建函数 URL 后,其 URL 端点永远不会改变。函数 URL 的端点具有以下格式:
https://
<url-id>
.lambda-url.<region>.on.aws
注意
以下 AWS 区域 不支持函数 URL:亚太地区(海得拉巴)(ap-south-2
)、亚太地区(墨尔本)(ap-southeast-4
)、亚太地区(马来西亚)(ap-southeast-5
)、加拿大西部(卡尔加里)(ca-west-1
)、欧洲(西班牙)(eu-south-2
)、欧洲(苏黎世)(eu-central-2
)、以色列(特拉维夫)(il-central-1
) 和中东(阿联酋)(me-central-1
)。
函数 URL 启用了双堆栈,支持 IPv4 和 IPv6。配置函数 URL 后,可以通过 Web 浏览器、curl、Postman 或任何 HTTP 客户端通过其 HTTP(S) 端点调用函数。要调用函数 URL,您必须具有 lambda:InvokeFunctionUrl
权限。有关更多信息,请参阅 访问控制。
函数 URL 调用基础
如果函数 URL 使用 AWS_IAM
身份验证类型,则必须使用 AWS 签名版本 4(SigV4)对每个 HTTP 请求进行签名。Postman
如果不使用工具向函数 URL 对 HTTP 请求进行签名,则必须使用 SigV4 手动对每个请求进行签名。当函数 URL 收到请求时,Lambda 还会计算 SigV4 签名。Lambda 仅在签名匹配时处理请求。有关如何使用 SigV4 手动对请求进行签名的说明,请参阅《Amazon Web Services 一般参考 指南》中的利用签名版本 4 对 AWS 请求进行签名。
如果函数 URL 使用 NONE
身份验证类型,则不必使用 SigV4 对请求进行签名。您可以使用 Web 浏览器、curl、Postman 或任何 HTTP 客户端来调用函数。
要测试对函数的简单 GET
请求,请使用 Web 浏览器。例如,如果您的函数 URL 为 https://abcdefg.lambda-url.us-east-1.on.aws
,并且包含一个字符串参数 message
,那么您的请求 URL 可能如下所示:
https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld
要测试其他 HTTP 请求,例如 POST
请求,可以使用 curl 之类的工具。例如,如果希望在对函数 URL 的 POST
请求中包含一些 JSON 数据,可以使用以下 curl 命令:
curl -v 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \ -H 'content-type: application/json' \ -d '{ "example": "test" }'
请求和响应有效负载
当客户端调用函数 URL 时,Lambda 会将请求映射到事件对象,然后再将其传递给函数。然后,函数的响应将映射到一个 HTTP 响应,Lambda 会通过函数 URL 将该响应发送回客户端。
请求和响应事件格式遵循与 Amazon API Gateway 有效负载格式版本 2.0 相同的模式。
请求有效负载格式
请求有效负载具有以下结构:
{
"version": "2.0",
"routeKey": "$default",
"rawPath": "/my/path",
"rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value",
"cookies": [
"cookie1",
"cookie2"
],
"headers": {
"header1": "value1",
"header2": "value1,value2"
},
"queryStringParameters": {
"parameter1": "value1,value2",
"parameter2": "value"
},
"requestContext": {
"accountId": "123456789012",
"apiId": "<urlid>",
"authentication": null,
"authorizer": {
"iam": {
"accessKey": "AKIA...",
"accountId": "111122223333",
"callerId": "AIDA...",
"cognitoIdentity": null,
"principalOrgId": null,
"userArn": "arn:aws:iam::111122223333:user/example-user",
"userId": "AIDA..."
}
},
"domainName": "<url-id>.lambda-url.us-west-2.on.aws",
"domainPrefix": "<url-id>",
"http": {
"method": "POST",
"path": "/my/path",
"protocol": "HTTP/1.1",
"sourceIp": "123.123.123.123",
"userAgent": "agent"
},
"requestId": "id",
"routeKey": "$default",
"stage": "$default",
"time": "12/Mar/2020:19:03:58 +0000",
"timeEpoch": 1583348638390
},
"body": "Hello from client!",
"pathParameters": null,
"isBase64Encoded": false,
"stageVariables": null
}
参数 | 描述 | 示例 |
---|---|---|
|
此事件的有效负载格式版本。Lambda 函数 URL 目前支持有效负载格式版本 2.0。 |
|
|
函数 URL 不使用此参数。Lambda 将其设置为 |
|
|
请求路径。例如,如果请求 URL 为 |
|
|
包含请求的查询字符串参数的原始字符串。支持的字符包括 |
|
|
数组包含发送的部分请求的所有 Cookie。 |
|
|
请求标头的列表,以键值对的形式显示。 |
|
|
请求的查询参数。例如,如果请求 URL 为 |
|
|
一个包含有关请求的附加信息的对象,例如 |
|
|
函数拥有者的 AWS 账户 ID。 |
|
|
函数 URL 的 ID。 |
|
|
函数 URL 不使用此参数。Lambda 会将其设置为 |
|
|
对象包含有关调用者身份的信息(如果函数 URL 使用 |
|
|
调用者身份的访问密钥。 |
|
|
调用者身份的 AWS 账户 ID。 |
|
|
调用者的 ID(用户 ID)。 |
|
|
函数 URL 不使用此参数。Lambda 会将其设置为 |
|
|
与调用者身份关联的主体企业 ID。 |
|
|
调用者身份的用户 Amazon 资源名称(ARN)。 |
|
|
调用者身份的用户 ID。 |
|
|
函数 URL 的域名。 |
|
|
函数 URL 的域前缀。 |
|
|
包含有关 HTTP 请求的详细信息的对象。 |
|
|
此请求中使用的 HTTP 方法。有效值包括 |
|
|
请求路径。例如,如果请求 URL 为 |
|
|
请求的协议。 |
|
|
发出请求的即时 TCP 连接的源 IP 地址。 |
|
|
用户代理请求标头值。 |
|
|
调用请求的 ID。可以使用此 ID 跟踪与函数相关的调用日志。 |
|
|
函数 URL 不使用此参数。Lambda 将其设置为 |
|
|
函数 URL 不使用此参数。Lambda 将其设置为 |
|
|
请求的时间戳。 |
|
|
请求的时间戳,用 Unix epoch 时间表示。 |
|
|
请求的正文。如果请求的内容类型为二进制,则正文为 base64 编码。 |
|
|
函数 URL 不使用此参数。Lambda 会将其设置为 |
|
|
如果正文为二进制有效负载,并且为 base64 编码,则为 |
|
|
函数 URL 不使用此参数。Lambda 会将其设置为 |
|
响应有效负载格式
当函数返回响应时,Lambda 会解析响应并将其转换为 HTTP 响应。函数响应有效负载的格式如下:
{
"statusCode": 201,
"headers": {
"Content-Type": "application/json",
"My-Custom-Header": "Custom Value"
},
"body": "{ \"message\": \"Hello, world!\" }",
"cookies": [
"Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",
"Cookie_2=Value2; Max-Age=78000"
],
"isBase64Encoded": false
}
Lambda 会为您推断响应格式。如果您的函数返回有效的 JSON 并且没有返回 statusCode
,Lambda 会做出以下假设:
-
statusCode
为200
。注意
有效的
statusCode
在 100 至 599 范围内。 -
content-type
为application/json
。 -
body
是函数响应。 -
isBase64Encoded
为false
。
以下示例显示了 Lambda 函数的输出如何映射到响应有效负载,以及响应有效负载如何映射到最终 HTTP 响应。当客户端调用函数 URL 时,就会看到 HTTP 响应。
字符串响应的输出示例
Lambda 函数输出 | 解释响应输出 | HTTP 响应(客户端看到的内容) |
---|---|---|
|
|
|
JSON 响应的输出示例
Lambda 函数输出 | 解释响应输出 | HTTP 响应(客户端看到的内容) |
---|---|---|
|
|
|
自定义响应的输出示例
Lambda 函数输出 | 解释响应输出 | HTTP 响应(客户端看到的内容) |
---|---|---|
|
|
|
Cookie
要从函数返回 Cookie,请不要手动添加 set-cookie
标头。相反,请在响应有效负载对象中包含 Cookie。Lambda 会自动进行解释,并将其作为 set-cookie
标头添加到 HTTP 响应中,如下例所示。
Lambda 函数输出 | HTTP 响应(客户端看到的内容) |
---|---|
|
|