Elastic Load Balancing
Application Load Balancer
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Lambda 函数作为目标

您可以将 Lambda 函数注册为目标并将侦听器规则配置为将请求转发到 Lambda 函数的目标组。当负载均衡器将请求转发到目标组并使用 Lambda 函数作为目标时,它会调用 Lambda 函数并以 JSON 格式将请求内容传递到 Lambda 函数。

限制

  • Lambda 函数和目标组必须位于同一账户中。

  • 您可以发送到 Lambda 函数的请求正文的最大大小为 1 MB。有关相关大小限制,请参阅 HTTP 标头限制

  • Lambda 函数可以发送的响应 JSON 的最大大小为 1 MB。

  • 不支持 WebSockets。升级请求被拒绝,并显示 HTTP 400 代码。

准备 Lambda 函数

如果您将 Lambda 函数与应用程序负载均衡器一起使用,则以下建议适用。

调用 Lambda 函数的权限

如果使用 AWS 管理控制台创建目标组并注册 Lambda 函数,控制台会代表您将所需的权限添加到 Lambda 函数策略。否则,在您使用 AWS CLI 创建目标组并注册函数后,必须使用 add-permission 命令来向 Elastic Load Balancing 授予调用您的 Lambda 函数的权限。我们建议您包含 --source-arn 参数以限制对指定目标组的函数调用。

aws lambda add-permission \ --function-name lambda-function-arn-with-alias-name \ --statement-id elb1 \ --principal elasticloadbalancing.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn target-group-arn

Lambda 函数版本控制

您可以为每个目标组注册一个 Lambda 函数。为确保您可以更改 Lambda 函数并且负载均衡器始终调用当前版本的 Lambda 函数,请在向负载均衡器注册 Lambda 函数时创建一个函数别名并在函数 ARN 中包含该别名。有关更多信息,请参阅 AWS Lambda Developer Guide 中的 AWS Lambda 函数版本控制和别名使用别名的流量转移

函数超时

负载均衡器会一直等待,直到您的 Lambda 函数响应或超时。建议您根据预期运行时间配置 Lambda 函数的超时。有关默认超时值以及如何更改该值的信息,请参阅基本 AWS Lambda 函数配置。有关可配置的最大超时值的信息,请参阅 AWS Lambda 限制

为 Lambda 函数创建目标组

创建一个要在请求路由中使用的目标组。如果请求内容与侦听器规则匹配并且具有将该内容转发到此目标组的操作,则负载均衡器会调用已注册的 Lambda 函数。

创建目标组并注册 Lambda 函数

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格上的 LOAD BALANCING 下,选择 Target Groups

  3. 选择 Create target group

  4. 对于 Target group name,键入目标组的名称。

  5. 对于 Target type (目标类型),选择 Lambda function (Lambda 函数)

  6. 对于 Lambda function (Lambda 函数),请执行下列操作之一:

    • 选择 Lambda 函数

    • 创建新的 Lambda 函数并选择此函数

    • 创建目标组后注册 Lambda 函数

  7. (可选)要启用运行状况检查,请依次选择 Health check (运行状况检查)Enable (启用)

  8. 选择 Create

使用 AWS CLI 创建目标组并取消注册 Lambda 函数

使用 create-target-groupregister-targets 命令。

从负载均衡器接收事件

负载均衡器支持通过 HTTP 和 HTTPS 进行请求的 Lambda 调用。负载均衡器采用 JSON 格式发送事件。负载均衡器将以下标头添加到每个请求:X-Amzn-Trace-IdX-Forwarded-ForX-Forwarded-PortX-Forwarded-Proto

如果内容类型为下列类型之一,则负载均衡器会按原样将正文发送到 Lambda 函数并将 isBase64Encoded 设置为 false:text/*、application/json、application/javascript 和 application/xml。对于所有其他类型,负载均衡器会对正文进行 Base64 编码并将 isBase64Encoded 设置为 true

以下是示例事件。

{ "requestContext": { "elb": { "targetGroupArn": "arn:aws-cn:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09" } }, "httpMethod": "GET", "path": "/", "queryStringParameters": {parameters}, "headers": { "accept": "text/html,application/xhtml+xml", "accept-language": "en-US,en;q=0.8", "content-type": "text/plain", "cookie": "cookies", "host": "lambda-846800462-us-east-2.elb.amazonaws.com", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)", "x-amzn-trace-id": "Root=1-5bdb40ca-556d8b0c50dc66f0511bf520", "x-forwarded-for": "72.21.198.66", "x-forwarded-port": "443", "x-forwarded-proto": "https" }, "isBase64Encoded": false, "body": "request_body" }

响应负载均衡器

来自 Lambda 函数的响应必须包含 Base64 编码状态、状态代码、状态描述和标头。您可以省略正文。statusDescription 标头必须包含状态代码和原因短语(用单个空格分隔)。

要在响应的正文中包含二进制内容,您必须对内容进行 Base64 编码并将 isBase64Encoded 设置为 true。负载均衡器解码内容以检索二进制内容并将该内容发送到 HTTP 响应的正文中的客户端。

负载均衡器不会遵守逐跳标头,如 ConnectionTransfer-Encoding。您可以省略 Content-Length 标头,因为负载均衡器会在将响应发送到客户端之前计算它。

以下是来自 Lambda 函数的示例响应。

{ "isBase64Encoded": false, "statusCode": 200, "statusDescription": "200 OK", "headers": { "Set-cookie": "cookies", "Content-Type": "application/json" }, "body": "Hello from Lambda (optional)" }

有关与 Application Load Balancer 结合使用的 Lambda 函数模板,请参阅 github 上的 application-load-balancer-serverless-app。或者,打开 Lambda 控制台,创建一个函数,然后从 AWS Serverless Application Repository 中选择下列项目之一:

  • ALB-Lambda-Target-HelloWorld

  • ALB-Lambda-Target-UploadFiletoS3

  • ALB-Lambda-Target-BinaryResponse

  • ALB-Lambda-Target-WhatisMyIP

多值标头

如果来自客户端的请求或来自 Lambda 函数的响应包含具有多个值的标头或多次包含同一标头,则可启用对多值标头语法的支持。启用多值标头后,负载均衡器和 Lambda 函数之间交换的请求和响应标头将使用数组。否则,负载均衡器会使用其接收的最后一个值。

包含多值标头的请求

用于标头和查询字符串参数的字段名称根据是否为目标组启用了多值标头而有所不同。

以下示例请求具有两个查询参数和同一个键:

http://www.example.com?&myKey=val1&myKey=val2

对于默认格式,负载均衡器将使用客户端发送的最后一个值,并使用 queryStringParameters 向您发送包含查询字符串参数的事件。例如:

"queryStringParameters": { "myKey": "val2"},

如果启用了多值标头,则负载平衡器将使用客户端发送的两个键值,并使用 multiValueQueryStringParameters 向您发送包含查询字符串参数的事件。例如:

"multiValueQueryStringParameters": { "myKey": ["val1", "val2"] },

同样,假设客户端发送标头中包含两个 Cookie 的请求:

"cookie": "name1=value1", "cookie": "name2=value2",

对于默认格式,负载均衡器将使用客户端发送的最后一个 Cookie,并使用 headers 向您发送包含标头的事件。例如:

"headers": { "cookie": "name2=value2", ... },

如果启用了多值标头,负载均衡器将使用客户端发送的两个 Cookie 并使用 multiValueHeaders 向您发送包含标头的事件。例如:

"multiValueHeaders": { "cookie": ["name1=value1", "name2=value2"], ... },

包含多值标头的响应

用于标头的字段名称根据是否为目标组启用了多值标头而有所不同。如果启用了多值标头,则必须使用 multiValueHeaders,否则使用 headers

对于默认格式,您可以指定单个 Cookie:

{ "headers": { "Set-cookie": "cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly", "Content-Type": "application/json" }, }

如果启用了多值标头,您可以指定多个 Cookie,如下所示:

{ "multiValueHeaders": { "Set-cookie": ["cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly","cookie-name=cookie-value;Expires=May 8, 2019"], "Content-Type": ["application/json"] }, }

启用多值标头

您可以对目标类型为 lambda 的目标组启用或禁用多值标头。

使用控制台启用多值标头

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格上的 LOAD BALANCING 下,选择 Target Groups

  3. 选择您的目标组。

  4. Description 选项卡上,选择 Edit attributes

  5. 对于 Multi value headers (多值标头),选择 Enable (启用)

  6. 选择 Save

使用 AWS CLI 启用多值标头

使用带 lambda.multi_value_headers.enabled 属性的 modify-target-group-attributes 命令。

启用运行状况检查

默认情况下,对类型为 lambda 的目标组禁用运行状况检查。您可以启用运行状况检查,以便通过 Amazon Route 53 实施 DNS 故障转移。Lambda 函数可以在响应运行状况检查请求之前检查下游服务的运行状况。如果来自 Lambda 函数的响应指示运行状况检查失败,则运行状况检查失败会传递到 Route 53。您可以将 Route 53 配置为故障转移到备份应用程序堆栈。

您需要支付运行状况检查的费用,就像您支付任何 Lambda 函数调用的费用一样。

以下是发送到您的 Lambda 函数的运行状况检查事件的格式。要检查事件是否为运行状况检查事件,请检查 user-agent 字段的值。运行状况检查的用户代理为 ELB-HealthChecker/2.0

{ "requestContext": { "elb": { "targetGroupArn": "arn:aws-cn:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09" } }, "httpMethod": "GET", "path": "/", "queryStringParameters": {}, "headers": { "user-agent": "ELB-HealthChecker/2.0" }, "body": "", "isBase64Encoded": false }

为目标组启用运行状况检查

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格上的 LOAD BALANCING 下,选择 Target Groups

  3. 选择您的目标组。

  4. Health checks (运行状况检查) 选项卡上,选择 Edit health check (编辑运行状况检查)

  5. 对于 Health check (运行状况检查),选择 Enable (启用)

  6. 选择 Save

使用 AWS CLI 为目标组启用运行状况检查

modify-target-group 命令和 --health-check-enabled 选项结合使用。

取消注册 Lambda 函数

如果您不再需要向您的 Lambda 函数发送流量,则可以将其取消注册。在取消注册 Lambda 函数后,进行中的请求会失败,并显示 HTTP 5XX 错误。

要替换 Lambda 函数,建议您创建新的目标组,向新目标组注册新函数,并将侦听器规则更新为使用新目标组而不是现有目标组。

取消注册 Lambda 函数

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格上的 LOAD BALANCING 下,选择 Target Groups

  3. 选择您的目标组。

  4. Targets (目标) 选项卡上,选择 Deregister (取消注册)

  5. 选择取消注册

使用 AWS CLI 取消注册 Lambda 函数

使用 deregister-targets 命令。