跳至内容

如何解决 Lambda 触发器对 Amazon MSK 和自托管式 Apache Kafka 集群执行轮询操作时出现的问题?

5 分钟阅读
0

我指定了 AWS Lambda 函数来处理 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 集群或自托管式 Apache Kafka 集群中的记录。但是,事件源映射未调用我的 Lambda 函数。

简短描述

要调用 Lambda 函数,Apache Kafka 事件源映射必须能够执行以下操作:

如果事件源映射的联网、身份验证或授权设置阻止上述操作,则事件源映射将无法调用该函数。相反,您会收到错误。

解决方法

当为 Lambda 函数配置 Amazon MSK 触发器自托管式 Kafka 触发器后,Lambda 会自动创建新的事件源映射资源。该事件源映射是独立于 Lambda 函数的资源。事件源映射将轮询 Kafka 集群中的记录,并将这些记录捆绑到有效载荷中。然后,系统将调用 Lambda 调用 API,以将有效载荷传送到 Lambda 函数进行处理。要解决轮询失败的问题,请对收到的每个错误完成以下故障排除步骤。

**重要事项:**Lambda 事件源映射不会继承 Lambda 函数的虚拟私有云 (VPC) 网络配置。对于 Amazon MSK 和自托管式 Kafka 触发器均是如此。Amazon MSK 事件源映射使用您在目标 MSK 集群上配置的子网和安全组配置。默认情况下,自托管式 Kafka 触发器具有广域网 (WAN) 访问权限。但是,您也可以配置对同一 AWS 账户和 AWS 区域中的 VPC 的网络访问权限。由于网络配置是分开的,因此您可以在不包含指向 Kafka 集群的路由的网络内配置 Lambda 函数。

要配置 Amazon MSK 事件源映射以轮询跨账户 MSK 集群中的记录,请设置多 VPC 私有连接。请注意,您可以创建自托管式 Kafka 触发器,以从另一个账户的 MSK 集群使用。但是,该解决方案存在以下缺点。例如,您无法对自托管式 Kafka 触发器使用 AWS Identity and Access Management (IAM) 身份验证,即使目标集群为 MSK 集群。此外,要通过 VPC 对等连接连接到 MSK 集群,必须设置 VPC 解决方法。有关示例架构,请参阅 How Goldman Sachs builds cross-account connectivity to their Amazon MSK clusters with AWS PrivateLink

**注意:**要使用多 VPC 连接,请验证您是否符合要求

对触发器和集群之间的网络通信问题进行故障排除

事件源映射会向集群代理端点发送多个不同的请求,以完成对 Lambda 函数的单次调用。在进行调用之前,事件源映射会要求集群代理端点提供集群元数据信息和主题中的记录。成功调用后,事件源映射会与代理端点通信,以提交已处理的记录。当事件源映射向代理端点发送请求但未收到响应时,请求将超时。您会收到以下错误:

"PROBLEM: Connection error.Please check your event source connection configuration.If your event source lives in a VPC, try setting up a new Lambda function or EC2 instance with the same VPC, Subnet, and Security Group settings.Connect the new device to the Kafka cluster and consume messages to ensure that the issue is not related to VPC or Endpoint configuration.If the new device is able to consume messages, please contact Lambda customer support for further investigation."

代理请求超时可能会在请求到达代理端点之前或之后发生。当网络和安全组设置阻止事件源映射对代理端点发出的请求时,将发生代理前超时。当代理收到事件源映射的请求但无法完成请求时,将发生代理后超时。

要调查代理后超时请求,请检查出现故障时的代理状态。如果问题发生时集群处于离线状态,请在集群重新联机且可用时重新激活事件源映射。当集群磁盘空间不足或 CPU 使用率达到 100% 时,或者当代理端点出现故障时,也会发生请求超时。要解决这些问题,请将事件源映射的批处理大小设置为 1,然后重新激活触发器。请注意,当将批处理大小设置为更高的值时,集群响应时间将变长。

要对超时错误进行故障排除,请检查代理的访问日志和系统日志以获取详细信息。

如果请求在到达代理端点之前发生超时,请检查您的联网配置。

检查 Amazon MSK 事件源映射的联网配置

为了与 MSK 集群通信,Amazon MSK 事件源映射会在集群使用的每个子网中创建一个 Hyperplane 弹性网络接口。事件源映射是 Lambda 所拥有的一个资源。但是,Amazon MSK 事件源映射不使用 Lambda 函数的 VPC 设置。相反,事件源映射会自动使用在目标 MSK 集群上配置的子网和安全组设置。然后,Amazon MSK 事件源映射会在 MSK 集群使用的每个子网内创建一个网络接口。这些网络接口将使用与 MSK 集群相同的安全组。

要检查您的安全组是否允许所需的流量和端口,请完成以下步骤:

  1. 要列出 MSK 集群使用的所有安全组和子网,请运行 AWS CLI 命令 describe-cluster
  2. 要显示所有入站和出站规则,请对 describe-cluster 命令输出中列出的安全组运行 describe-security-groups 命令。
  3. 在列出的安全组中配置规则,以允许流量在安全组和 MSK 集群之间传输。您还必须允许流量通过代理使用的以下开放的身份验证端口:
    9092(适用于纯文本)
    9094(适用于 TLS)
    9096(适用于 SASL)
    9098(适用于 IAM)
    443(出站规则)(适用于所有配置)

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,确保您使用的是最新版本的 AWS CLI

检查自托管式 Kafka 事件源映射的联网配置

默认情况下,自托管式 Kafka 事件源映射可以访问 WAN,但无法访问 VPC。您可以手动配置对 Kafka 集群中特定子网和安全组的 VPC 访问权限。但是,仅当集群位于包含 Lambda 函数的账户中时,事件源映射才能访问这些集群。您可以为位于以下位置之一的 Kafka 集群创建自托管式 Kafka 事件源映射:

  • 本地数据中心
  • 其他云提供商
  • 位于不同账户的 VPC 中的 Kafka 集群的 Amazon MSK 代理

对初始化、轮询或调用期间出现的问题进行故障排除

如果您在初始化、轮询或调用期间遇到问题,则您会收到以下错误:

"PROBLEM: Connection error.Your event source VPC must be able to connect to Lambda and STS, Secrets Manager (if event source authentication is required), and the OnFailure Destination (if one is configured).You can provide access by configuring PrivateLink or a NAT Gateway.For how to setup VPC endpoints/NAT gateway, please check https://aws.amazon.com/blogs/compute/setting-up-aws-lambda-with-an-apache-kafka-cluster-within-a-vpc/".

出现上述错误的原因有以下几种:

  • 事件源映射在 VPC 中配置,且对 AWS STS API 的调用失败或超时。
  • 事件源映射配置为使用 Secrets Manager 集群身份验证,但对 Secrets Manager API 的调用失败或超时。
  • 事件源映射可以成功访问您的 Kafka 集群并轮询记录,但对 Lambda API 的调用失败或超时。
  • 您为事件源映射配置了故障目标,例如 Amazon Simple Storage Service (Amazon S3) 或 Amazon Simple Notification Service (Amazon SNS)。但是,当函数调用因错误而终止时,对故障目标 API 的调用将失败或超时。

当安全组或路由表的配置不允许您的事件源映射访问其他服务时,将会出现上述问题。这些服务包括 AWS STS、Lambda 或 AWS Secrets Manager。要正确配置 VPC 设置,请完成在 VPC 中设置使用 Apache Kafka 集群的 AWS Lambda 中的步骤。

要解决自托管式 Kafka 事件源映射的这些问题,请执行以下操作:

  • 在包含自托管式 Kafka 事件源映射使用的子网的 VPC 中创建 Lambda VPC 端点和 STS VPC 端点。
  • 如果您为事件源映射配置了密钥,请为 Secrets Manager 创建一个 VPC 端点。
  • 如果您为事件源映射配置了故障目标,请为故障目标创建一个 VPC 端点。示例目标包括 Amazon SNS 或 Amazon S3。
  • 为 VPC 端点配置安全组,以允许来自自托管式 Kafka 事件源映射安全组的入站流量通过 443 端口。
  • 配置自托管式 Kafka 事件源映射的安全组,以允许出站流量通过端口 443 流向 VPC 端点的安全组。

要解决 Amazon MSK 事件源映射的这些问题,请执行以下操作:

  • 在包含 MSK 集群的 VPC 中创建 Lambda VPC 端点和 STS VPC 端点。
  • 如果事件源映射使用密钥,或者集群使用 SASL IAM 身份验证,则请为 Secrets Manager 创建一个 VPC 端点。此端点必须位于包含 MSK 集群的 VPC 中。
  • 如果您为事件源映射配置了故障目标,请为故障目标创建一个 VPC 端点。示例目标包括 Amazon SNS 或 Amazon S3。此 VPC 端点必须位于包含 MSK 集群的 VPC 中。
  • 为 VPC 端点配置安全组,以允许来自 MSK 集群使用的安全组的入站流量通过端口 443。
    **重要事项:**允许来自 MSK 集群安全组(而不是 Lambda 函数的安全组)的入站流量。
  • 配置 MSK 集群的安全组,以允许出站流量通过端口 443 流向 VPC 端点的安全组。

对 VPC 策略或执行角色的相关问题进行故障排除

检查执行角色是否存在问题

如果您的 STS VPC 端点资源策略中存在配置问题,则您会收到以下错误:

“PROBLEM: Lambda failed to assume your function execution role”(问题:Lambda 无法代入您的函数执行角色)。

要解决此错误,请执行以下操作:

  • 确保在 IAM 角色的信任策略中将 lambda.amazonaws.com 服务主体列为可信服务。
  • 确保 STS VPC 端点策略允许 Lambda 服务主体调用 sts:AssumeRole。有关如何配置 VPC 的详细信息,请参阅配置网络安全

如果针对 Lambda VPC 端点有一个限制性 VPC 端点策略,则您会收到以下错误:

“No VPC endpoint policy allows the lambda:InvokeFunction action”(所有 VPC 端点策略均不允许 lambda:InvokeFunction 操作)

要解决这些问题,请确保 Lambda VPC 端点策略允许 Lambda 服务主体调用 lambda:InvokeFunction

**注意:**您可以将故障目标配置为 Amazon Simple Queue Service (Amazon SQS)队列、Amazon SNS 主题或 Amazon S3 存储桶。当您使用这些目标时,请确保 VPC 端点策略允许 Lambda 执行角色执行所需的操作

检查密钥访问权限是否存在问题

如果您在访问 Secrets Manager 密钥时遇到问题,则您会收到以下错误:

“PROBLEM: Lambda is unable to call secretsmanager:GetSecretValue.Reason: User: Lambda execution role is not authorized to perform: secretsmanager:GetSecretValue on resource: Secret in Secrets Manager with an explicit deny in a VPC endpoint policy."

要解决此问题,请确保 VPC 端点资源策略允许 Lambda 执行角色为密钥调用 secretsmanager:GetSecretValue。要从 Secrets Manager 获取密钥,Lambda 将使用您的执行角色,而不是 Lambda 服务主体。

对密钥问题进行故障排除

检查密钥配置

如果您的密钥不是事件源映射可以使用的格式,则您会收到以下错误:

“PROBLEM: Certificate and/or private key must be in PEM format”(问题:证书和/或私钥必须采用 PEM 格式)。

要解决此问题,请确保您的密钥在 X.509 证书文件中采用 .pem 格式。要验证您的证书格式是否正确,请运行以下命令:

openssl x509 -in PEM FILE -text

**注意:**请将 PEM FILE 替换为您的 .pem 文件名。

此外,请确保私钥加密使用 PBES1 算法,而不是 PBES2 算法。

有关详细信息,请参阅提供的证书或私钥无效(适用于 Amazon MSK),或配置客户端证书密钥(适用于自托管式 Kafka)

检查密钥值的格式

如果您的服务器登录尝试失败,则您会收到以下错误:

“PROBLEM: SASL authentication failed”(问题:SASL 身份验证失败)。

当 Amazon MSK 主题调用 Lambda 函数时,该函数可以访问 Secrets Manager 使用 SASL/SCRAM 保护的用户名和密码。如果 Lambda 无法将您的用户名和密码识别为有效,则您会遇到上述错误。要解决此问题,请登录代理,然后检查访问日志。有关详细信息,请参阅 SASL/SCRAM 身份验证(适用于 Amazon MSK)或 SASL/SCRAM 身份验证(适用于自托管式 Kafka)。

对事件源映射的服务器设置问题进行故障排除

确保事件源映射可以访问您的 DNS 服务器

如果事件源映射无法将主机名转换为 IP 地址,则您会收到以下错误:

“PROBLEM: The provided Kafka broker endpoints cannot be resolved”(问题:无法解析提供的 Kafka 代理端点)。

要解决此问题,请确保事件源映射可以访问用于翻译主机名的 DNS 服务器。如果端点的主机名位于私有网络中,请将事件源映射配置为使用包含可解析主机名的 DNS 设置的 VPC

检查事件源映射服务器设置的配置

如果该服务器与您在事件源映射设置中配置的服务器不同,则您会收到以下错误:

“PROBLEM: Server failed to authenticate Lambda or Lambda failed to authenticate server”(问题:服务器无法对 Lambda 进行身份验证或 Lambda 无法对服务器进行身份验证)。

要解决此问题,请验证设置中的服务器主机名是否与您连接的服务器的内部服务器名称相匹配。

验证事件源映射是否有权轮询集群主题中的记录

如果事件源映射无权轮询记录,则您会收到以下错误:

“PROBLEM: Cluster failed to authorize Lambda”(问题:集群无法授权 Lambda)。

要解决此问题,请为 MSK 集群自托管式 Kafka 集群配置授权 Lambda 所需的权限。

相关信息

身份验证和授权错误

AWS 官方已更新 1 年前