我的最终目标是让 AWS Lambda 从 Kafka 主题触发,其中 Kafka 是在另一个 AWS 账户上运行的 MSK 集群。
设置。 Lambda 和 MSK 集群位于不同的 AWS 账户上。每个都连接到自己的 VPC,即子网(通过 NAT GW 私有),并由安全组设置防火墙(为了实验,我将它们全部设置为允许)
直接的问题。 我不能对 lambda 使用“MSK 触发器”,因为它需要为 MSK 集群指定 ARN,但这是不可能的,因为该 MSK 集群位于另一个帐户上,并且无法在 lambda 触发器的上下文中引用。
我试图解决的问题。 我正在尝试使用“Kafka 触发器”,它需要指定引导服务器(我有)、主题名称(我有)、批量大小和起始位置(不是问题)。问题在于第二组选项允许在 MSK 集群前对 lambda 触发器进行身份验证。它可以是 1) 基于网络的设置,以 MSK 集群的 VPC/子网/SecurityGroup 的组合形式,2) 基于机密的设置,以 SASL/xxx 配置的形式。
前一个选项,即基于网络的设置,不能使用,因为它需要来自 Kafka 集群的 VPC 和其他参数,即子网和安全组,这些参数在配置 Lambda 的账户上不可用。
后者需要指定其中一种 SASL 方法,即 PLAIN、SCRAM512 和 SCRAM256,并与存储用户名/密码组合的 SecretManager 记录的引用配对。我选择这种方法作为(在我看来)理论上可行的跨账户通信的唯一方法。
我做了什么:
- 在 Lambda 帐户上,我在 SecretManager 中使用 2 个键创建了一条记录:
username
和password
一些特定的值 - 在 Kafka 帐户上,我为 MSK 集群启用了 SASL/SCRAM 身份验证。它需要在 SecretManager 中设置一个记录,我做到了。我在 Lambda 账户上使用了与密钥相同的凭据。之后,我可以看到引导服务器的 3 个选项:(
<hostname>:9092
明文)、<hostname>:9094
(TLS)和<hostname>:9096
(SASL/SCRAM)。 - 我在我的 lambda 函数的 kafka 触发器设置中使用了引导服务器规范(具有 9096 端口的那个)。
- 为了在 Lambda 和 Kafka 的子网之间授予跨账户连接,我在路由表中设置了具有相应规则的 VPC 对等连接器。
- 我通过在 Lambda 的子网上旋转 EC2 测试了这些子网之间的连接性,并试图
nmap -Pn -p 9092,9094,9096 <bootstrap server hostname>
获得以下响应:
PORT STATE SERVICE
9092/tcp open unknown
9094/tcp open unknown
9096/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
结果。 无论我在引导服务器/端口和 SASL 方法的不同组合方面尝试什么,我都会在 Lambda 触发器端收到此错误:问题:连接错误。请检查您的事件源连接配置
由于未提供其他详细信息,因此我找不到任何调试此错误情况的方法。在 MSK 集群上启用 CloudWatch 并没有帮助,因为它没有收集任何有用的信息。