如何排查从 MSK 和自行管理的 Kafka 集群轮询的 Lambda 触发器问题?

4 分钟阅读
0

我的 AWS Lambda 函数旨在处理来自我的 Amazon Managed Streaming for Apache Kafka(Amazon MSK)集群或自行管理的 Kafka 集群的记录。但是,Lambda 触发器显示一条错误消息。

简短描述

事件源映射(ESM)是一种 AWS Lambda 资源,从事件源进行读取并调用 Lambda 函数。要调用 Lambda 函数,Lambda-Kafka ESM 必须能够执行以下操作:

如果 ESM 的网络、身份验证或授权的设置阻止与集群通信,则设置将在调用函数之前失败。然后,触发器会显示一条错误消息,帮助排查根本原因。

解决方法

了解 ESM

使用 Amazon MSK 触发器自行管理的 Kafka 触发器配置 Lambda 函数时,将自动创建 ESM 资源。ESM 与 Lambda 函数是相分离的,其会持续轮询来自 Kafka 集群中该主题的记录。ESM 将这些记录捆绑到有效负载中。然后,ESM 会调用 Lambda 调用 API 将有效负载传输到您的 Lambda 函数进行处理。

**重要提示:**Lambda-Kafka ESM 不继承 Lambda 函数的 VPC 网络设置。对于 MSK 触发器和自行管理的 Kafka 触发器都是如此。MSK ESM 使用在目标 MSK 集群上配置的子网和安全组设置。默认情况下,自行管理的 Kafka 触发器具有 WAN 访问权限,但可以配置为对同一账户和 AWS 区域中的 VPC 进行网络访问。由于网络配置是分开的,因此 Lambda 函数可以在没有通往 Kafka 集群的路由的网络中运行代码。

了解 ESM 设置过程

在 ESM 可以调用关联的 Lambda 函数之前,ESM 会自动完成以下步骤:

1.    ESM 调用 AWS STS API 来获取安全令牌。

2.    如果 SourceAccessConfiguration 包含密钥,则从 AWS Secrets Manager API 中获取该密钥。

3.    对于自行管理的 Kakfa ESM:Lambda 从 ESM 中配置的主机名解析集群端点的 IP 地址,在 selfManagedEventSourceEndPoints 下。

      **对于 MSK ESM:**获取 MSK 集群的子网和安全组配置。

4.    **对于自行管理的 Kakfa ESM:**建立与代理端点的网络连接。

      **对于 MSK ESM:**在 MSK 集群的每个子网中使用 MSK 集群的安全组创建 Hyperplane 弹性网络接口。

5.    身份验证:

  • 如果 TLS 身份验证已激活,请检查代理端点提供的 SSL 证书。
  • 登录代理。

6.    授权:

  • 确保集群中存在该主题。询问集群代理在 ESM 的主题参数中配置的主题是否存在于集群中。
  • 使用 ESM 的 UUID 作为消费者组 ID 在集群中创建一个消费者组。

7.    从该主题轮询记录。

8.    将记录捆绑到小于 6 MB 的有效负载中。这是 Lambda 调用有效负载的限制

9.    ESM 使用记录的有效负载调用关联的 Lambda 函数。为此,请同步调用 Lambda 调用 API。

排查网络安全问题

当 ESM 向代理端点发送请求但未收到响应时,ESM 会将该请求视为超时。当代理端点超时时,触发器会显示以下错误消息:

“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.”(问题:连接错误。请检查您的事件源连接配置。如果您的事件源位于 VPC 中,请尝试使用相同的 VPC、子网和安全组设置来设置新的 Lambda 函数或 EC2 实例。将新设备连接到 Kafka 集群并使用消息以确保问题与 VPC 或端点配置无关。如果新设备能够使用消息,请联系 Lambda 客户支持进行进一步调查。)

要排查此问题,请按照前面错误消息中提到的步骤进行操作。此外,请注意以下部分中的网络配置,以确保您的 ESM 配置正确。

**注意:**在集群没有系统资源来处理请求的情况下,也可能会出现来自 ESM 的超时请求。或者,在 ESM 或集群上配置了错误的安全设置时,可能会出现超时请求。如果您收到此错误且网络配置没有任何问题,请查看集群代理的访问日志以获取更多信息。

自行管理的 Kafka ESM 使用的网络配置

自行管理的 Kafka ESM 的网络配置类似于 Lambda 函数。默认情况下,ESM 可以访问 WAN,但未配置为在 VPC 内进行访问。可以手动为其配置特定的子网和安全组以访问 Kafka 集群。但是,它只能访问包含 Lambda 函数的账户中的 VPC 可访问的集群。因此,您可以为位于以下位置的 Kafka 集群创建自行管理的 Kafka ESM:

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

**注意:**可以创建一个自行管理的 Kafka 触发器,该触发器可以从另一个账户中的 MSK 集群中进行使用。但是,这也有一些缺点。与 MSK 触发器不同,AWS Identity and Access Management(IAM)身份验证不适用于自行管理的 Kafka 触发器。此外,通过 VPC 对等连接来连接到 MSK 集群需要特定的 VPC 解决方法。有关更多信息,请参阅 Goldman Sachs 如何通过 AWS PrivateLink 构建与其 Amazon MSK 集群的跨账户连接

Lambda-MSK ESM 的网络配置

为了与 MSK 集群通信,MSK ESM 会在集群使用的每个子网内创建一个 hyperplane 弹性网络接口。这类似于 Lambda 函数在 VPC 中的运行方式。

MSK ESM 不使用 Lambda 函数的 VPC 设置。相反,ESM 会自动使用在目标 MSK 集群上配置的子网和安全组设置。然后,MSK ESM 在 MSK 集群使用的每个子网内创建网络接口。这些网络接口使用的安全组与 MSK 集群使用的安全组相同。可以通过以下 CLI 命令找到 MSK ESM 使用的安全组和入口或出口规则:

1.    使用 AWS CLI MSK 命令 describe-cluster 列出 MSK 集群使用的安全组和子网。

2.    对 describe-cluster 输出中列出的安全组使用 describe-security-groups 命令。

授予访问流量的权限

MSK 集群的安全组必须包含一条规则,该规则授权来自自身的入口流量和自身的出口流量。还必须通过代理使用的以下开放身份验证端口之一授权流量:

  • 9092 适用于纯文本
  • 9094 适用于 TLS
  • 9096 适用于 SASL
  • 443 适用于所有配置

排查初始化、轮询和调用期间可能出现的问题

“PROBLEM: Connection error.Your VPC must be able to connect to Lambda and STS, as well as Secrets Manager if authentication is required.You can provide access by configuring PrivateLink or a NAT Gateway.”(问题:连接错误。如果需要身份验证,您的 VPC 必须能够连接到 Lambda 和 STS,以及 Secrets Manager。您可以通过配置 PrivateLink 或 NAT 网关来提供访问权限。)

出现上述错误的原因如下:

  • ESM 在 VPC 中配置,且对 STS API 的调用失败或超时。
  • ESM 在 VPC 中配置,且 Secrets Manager API 连接尝试失败或超时。
  • 触发器可以访问您的 Kafka 集群,但是在通过 Lambda API 调用您的函数时超时。

这些问题可能是由于不正确的 VPC 设置导致您的 ESM 无法访问其他服务,如 AWS STS 和 AWS Secrets Manager。按照 Setting up AWS Lambda with an Apache Kafka cluster within a VPC(在 VPC 内使用 Apache Kafka 集群设置 AWS Lambda)中的步骤正确配置您的 VPC 设置。

如果对 STS API 的调用失败或超时,则您的 VPC 设置会阻止您的 ESM 访问端口 443 上的区域 Lambda 端点。要解决此问题,请参阅 Setting up AWS Lambda with an Apache Kafka cluster within a VPC(在 VPC 内使用 Apache Kafka 集群设置 AWS Lambda)。

如果 SourceAccessConfiguration 包含密钥,请务必从 Secrets Manager 检索该密钥。

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

如果您的密钥不是 ESM 可以破译的格式,则会发生上述错误。

要排查此问题,请检查您的密钥格式。请注意,Secrets Manager 仅支持 .pem 格式的 X.509 证书文件。有关更多信息,请参阅提供的证书或私有密钥无效(Amazon MSK)或者提供的证书或私有密钥无效(Kafka)。

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

当您的 ESM 无法将主机名转换为 IP 地址时,就会发生上述错误。

要解决此错误,请确保 ESM 能够访问可以转换主机名的 DNS 服务器。如果端点的主机名位于私有网络内,则将 ESM 配置为使用具有可以解析主机名的 DNS 设置的 VPC。

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

当您的 ESM 所连接的服务器不是您在 ESM 设置中配置的服务器时,就会出现上述错误。

要排查此问题,请验证您是否为要连接的服务器配置了 ESM 的设置。

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

当您的服务器登录尝试失败时,就会出现上述错误。

从 Amazon MSK 主题触发的 AWS Lambda 函数可以使用 SASL/SCRAM 访问由 AWS Secrets Manager 保护的用户名和密码。当您的用户名和密码未被识别为有效时,您会收到一条错误消息。

要解决此错误,请登录到代理并检查访问日志。

注意:

“PROBLEM: Cluster failed to authorize Lambda.(问题:集群未能授权 Lambda。)”

当 ESM 登录到代理,但是 ESM 用户没有权限轮询该主题中的记录时,就会出现上述错误。要排查此问题,请参阅 Cluster failed to authorize Lambda(集群未能授权 Lambda)(Amazon MSK)或 Cluster failed to authorize Lambda(集群未能授权 Lambda)(Kafka)。


相关信息

身份验证和授权错误

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