如何配置应用程序负载均衡器的 AWS Lambda 函数即目标并解决相关问题?

2 分钟阅读
0

我需要配置应用程序负载均衡器的 AWS Lambda 函数即目标,并知道如何解决可能会遇到的问题。

解决方法

弹性负载均衡支持使用 Lambda 函数即目标来处理来自应用程序负载均衡器的请求。有关更多信息,请参阅将应用程序负载均衡器与 AWS Lambda 结合使用

第 1 步: 创建 Lambda 函数

1.    打开 Lambda 控制台的函数页面

2.    选择创建函数

  1. 选择从头开始创作

  2. 输入函数名称

  3. 运行时下拉列表中,选择Python 3.9作为此场景的运行时系统。

  4. 对于执行角色,请选择创建具有基本 Lambda 权限的新角色

**注意:**有关执行角色的更多信息,请参阅 Lambda 执行角色

7.    选择创建函数

  1. 创建函数后,选择代码选项卡。在代码源部分中,将现有函数代码替换为以下代码:
import json

def lambda_handler(event, context):
  return {
    "statusCode": 200,
    "statusDescription": "200 OK",
    "headers": {
      "Content-Type": "text/html"
    },
    "isBase64Encoded": False,
    "body": "<h1>Hello from Lambda!</h1>"
  }

9.    选择部署

第 2 步: 为 Lambda 函数创建目标组

**注意:**有关更多信息,请参阅 第 1 步: 配置目标组

  1. 打开 Amazon EC2 控制台

2.    在导航窗格中的负载均衡下,选择目标组

3.    选择创建目标组

  1. 基本配置下,为选择目标类型选择Lambda 函数

5.    对于目标组名称,请输入目标组的名称。

  1. (可选)要开启运行状况检查,请在运行状况检查部分中选择启用

  2. (可选)添加一个或多个标签,如下所示:

  • 展开标签部分。
  • 选择添加标签
  • 输入标签键和标签值。

8.    选择下一步

  1. 选择 Lambda 函数作为目标。
    -或-
    选择稍后添加函数可稍后指定 Lambda 函数。

10.    选择创建目标组

**注意:**根据用于创建目标组和注册函数的方法,授予调用 Lambda 函数的负载均衡器权限会有所不同。有关更多信息,请参阅调用 Lambda 函数的权限

第 3 步: 配置负载均衡器和侦听器

要配置负载均衡器和侦听器,请按照第 3 步: 配置负载均衡器和侦听器中的步骤执行。

第 4 步: 测试负载均衡器

要测试负载均衡器,请按照 第 4步: 测试负载均衡器中的步骤执行。如果设置正常,浏览器会显示消息**"Hello from Lambda!"**

注意:如果您尚未为 Lambda 函数开启运行状况检查,则运行状态不可用。您可以在不进行运行状况检查的情况下测试负载均衡器,因为它不会影响应用程序负载均衡器的 Lambda 函数即目标。

Lambda 函数即目标的限制

有关 Lambda 函数即目标的限制的更多信息,请参阅 Lambda 函数即目标并查看限制下的信息。

Lambda 目标组仅限于单个 Lambda 函数目标。有关更多信息,请参阅准备 Lambda 函数

Lambda 函数即目标的常见错误

"The connection has timed out"

此错误表示负载均衡器安全组不允许侦听器端口上的流量。要解决此错误,请管理安全组并确保安全组的入站规则允许侦听器端口上的传入流量。安全组不需要出站规则,因为安全组是有状态的。无论出站规则如何,均允许对允许的入站流量的响应流出。

"The target group could not be found"

此错误表示目标组已被删除。要解决此错误,请删除包含已删除目标组的资源策略。删除资源策略会移除触发器。

1.    打开 Lambda 控制台的函数页面

  1. 选择与目标组相关的 Lambda 函数。

  2. 选择配置选项卡,然后选择权限

  3. 向下滚动到基于资源的策略声明部分,然后选择要移除的策略。

  4. 选择删除,然后在警告提示中选择删除,确认您要从资源策略中永久删除该策略声明。

您还可以使用以下 remove-permission AWS 命令行界面(AWS CLI)命令来移除基于资源的策略:

**注意:**在以下命令中,将 EXAMPLE_FUNCTION 替换为 Lambda 函数名称,将 EXAMPLE_ID 替换为语句 ID。

aws lambda remove-permission --function-name EXAMPLE_FUNCTION --statement-id EXAMPLE_ID

**注意:**如果您在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI

"An error occurred (AccessDenied) when calling the RegisterTargets operation: elasticloadbalancing principal does not have permission to invoke arn <Lambda ARN> from target group <Target Group ARN>"

当针对 Lambda 函数的请求失败时,负载均衡器会在访问日志的 error_reason 字段中存储原因代码。负载均衡器还会增加相应的 Amazon CloudWatch 指标。有关更多信息,请参阅 错误原因代码

使用 AWS CLI 将 Lambda 函数注册为目标。使用 add-permission AWS CLI 命令授予弹性负载平衡调用 Lambda 函数的权限。

Lambda 函数即目标的已知错误

"New metrics related to this feature (LambdaUserError, LambdaInternalError, LambdaTargetProcessedBytes and StandardProcessedBytes) are not available in ELB console monitoring panel."

从 Amazon CloudWatch 控制台访问新的 Lambda 指标

"The new ModifyTargetGroup API allows to configure 120 Seconds health check timeout value, but ELB console does not allow value higher than 60 seconds."

要配置大于 60 秒的运行状况检查超时,请通过 AWS CLI 调用 ModifyTargetGroup API。您可以将该值配置为最大 120 秒。

modify-target-group 命令示例:

**注意:**在以下命令中,将 EXAMPLE_TARGET_GROUP_ARN 替换为目标组 ARN,将 EXAMPLE_REGION 替换为 AWS 区域代码。

aws elbv2 modify-target-group \
--target-group-arn EXAMPLE_TARGET_GROUP_ARN \
--health-check-timeout-seconds 120 \
--region EXAMPLE_REGION

相关信息

Lambda 函数即目标

Lambda 函数版本和别名

使用别名转移流量

AWS 官方
AWS 官方已更新 2 年前