调用 Lambda 函数 URL
函数 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
注意
以下 Amazon Web Services 区域 不支持函数 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
身份验证类型,则必须使用 Amazon 签名版本 4(SigV4)对每个 HTTP 请求进行签名。Postman
如果不使用工具向函数 URL 对 HTTP 请求进行签名,则必须使用 SigV4 手动对每个请求进行签名。当函数 URL 收到请求时,Lambda 还会计算 SigV4 签名。Lambda 仅在签名匹配时处理请求。有关如何使用 SigV4 手动对请求进行签名的说明,请参阅《Amazon Web Services 一般参考 指南》中的利用签名版本 4 对 Amazon 请求进行签名。
如果函数 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 为 |
|
|
一个包含有关请求的附加信息的对象,例如 |
|
|
函数拥有者的 Amazon Web Services 账户 ID。 |
|
|
函数 URL 的 ID。 |
|
|
函数 URL 不使用此参数。Lambda 会将其设置为 |
|
|
对象包含有关调用者身份的信息(如果函数 URL 使用 |
|
|
调用者身份的访问密钥。 |
|
|
调用者身份的 Amazon Web Services 账户 ID。 |
|
|
调用者的 ID(用户 ID)。 |
|
|
函数 URL 不使用此参数。Lambda 会将其设置为 |
|
|
与调用者身份关联的主体企业 ID。 |
|
|
调用者身份的用户 Amazon 资源名称(ARN)。 |
|
|
调用者身份的用户 ID。 |
|
|
函数 URL 的域名。 |
|
|
函数 URL 的域前缀。 |
|
|
包含有关 HTTP 请求的详细信息的对象。 |
|
|
此请求中使用的 HTTP 方法。有效值包括 |
|
|
请求路径。例如,如果请求 URL 为 |
|
|
请求的协议。 |
|
|
发出请求的即时 TCP 连接的源 IP 地址。 |
|
|
用户代理请求标头值。 |
|
|
调用请求的 ID。可以使用此 ID 跟踪与函数相关的调用日志。 |
|
|
函数 URL 不使用此参数。Lambda 将其设置为 |
|
|
函数 URL 不使用此参数。Lambda 将其设置为 |
|
|
请求的时间戳。 |
|
|
请求的时间戳,用 Unix 纪元时间表示。 |
|
|
请求的正文。如果请求的内容类型为二进制,则正文为 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
。 -
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 响应(客户端看到的内容) |
---|---|
|
|