Amazon Lambda 的 Amazon MQ for RabbitMQ 事件源映射联网

作者: Rafal Pawlaszek, Witold Kowalik |

带有消息代理的事件驱动架构需要仔细关注安全优秀实践。适用于 RabbitMQ 的 Amazon MQ 与 Amazon Lambda 相结合,可实现无服务器事件处理。但是,实施深度防御和最低权限原则需要对网络要求有清晰的了解。当使用不同的子网类型及其对服务连接的影响时,这一点尤其重要。

这篇文章探讨了适用于 RabbitMQ 的 Amazon MQ 的 Lambda 事件源映射的网络方面。了解部署选项如何影响您的网络设置和安全状况,以便做出明智的架构决策。无论您在消息代理方面的经验水平如何,这些网络概念对于构建安全、可扩展的解决方案都至关重要。

为了清楚起见,在这篇文章中,当我们提到 "RabbitMQ" 时,我们指的是 Amazon MQ for RabbitMQ。

先决条件

完成这篇文章需要满足以下先决条件:

  • 亚马逊云科技账户
  • 对亚马逊云科技网络概念的基本理解
  • 熟悉适用于 RabbitMQ 的 Amazon MQ
  • Lambda 基础知识

此外,为了实现所讨论架构的设置,本文附带了一个使用亚马逊云科技云开发套件 (亚马逊云科技 CDK) 的 GitHub 存储库。

存储库先决条件

存储库需要以下先决条件:

  • 亚马逊云科技命令行界面 (亚马逊云科技 CLI)
  • nodejs/npm
  • 亚马逊云科技 CDK v2

存储库设置

克隆 https://github.com/aws-samples/sample-amazonmq-rabbitmq-lambda-esm 存储库。该存储库包含使用亚马逊云科技 CDK 创建相关架构所需的所有代码和说明。

安装依赖项并构建

通过运行以下命令安装必要的 NPM 依赖项:

npm install
npm run build

适用于 RabbitMQ 网络部署选项的 Amazon MQ

在亚马逊云科技中部署 RabbitMQ 代理时,公共可访问性是主要的网络差异化因素。尽管代理使用 Amazon MQ 服务账户运营,但网络配置会因该选择而异。

公开经纪人

当您部署可公开访问的代理时,Amazon MQ 会在服务账户中预置所有网络组件。该服务提供的 DNS 名称可解析为该账户中网络负载均衡器 (NLB) 的 IP 地址。此配置不支持安全组。所有安全措施都必须通过 RabbitMQ 代理的身份验证和授权机制来实施。下图显示了此通信流程。

图 1 适用于 RabbitMQ 的公共 Amazon MQ 经纪商的 DNS 解析。

私人经纪人

私人经纪人通过您账户中的 Amazon 虚拟私有云(Amazon VPC)路由网络。Amazon MQ 使用 Amazon PrivateLink 来配置 VPC 终端节点,这些终端节点可用作经纪人通信的入口点。

下图显示了客户端应用程序如何与 RabbitMQ 通信:

  1. 客户端应用程序连接到 Amazon Route 53 解析器
  2. Route 53 解析器将 DNS 名称解析为 VPC 终端节点的 IP 地址
  3. 客户通过 PrivateLink 与经纪人通信
  4. 安全组保护 VPC 终端节点的弹性网络接口 (ENI)

图 2 适用于 RabbitMQ 的私有 Amazon MQ 经纪商的 DNS 解析。

私人经纪人部署提供两种网络选项:

  • 自定义 VPC 配置 - 指定:
    • 创建 VPC 终端节点的子网
    • 至少一个安全组来保护 VPC 终端节点
  • 默认 VPC 配置 — 将 VPC 选项留空以供使用:
    • 默认 VPC
    • 默认安全组

适用于 RabbitMQ 的 Amazon MQ Lambda 事件源映射构建模块

RabbitMQ 解决方案提供两种消息处理方法:

  • 创建自定义客户端来读取来自经纪人队列的消息
  • 使用带有事件源映射 (ESM) 的 Lambda 函数进行自动消息检索

ESM 是一种 Lambda 服务资源,用于读取来自代理的消息并同步调用 Lambda 函数。在本文的其余部分中,我们将此 Lambda 函数称为listener

ESM 连接取决于以下几点:

  • 监听器的 Amazon Identity and Access Management (IAM) 角色获取访问权限
  • RabbitMQ 经纪商网络组件

对于公共经纪人,ESM 使用公共连接。对于私人经纪人,ESM:

  • 假设监听器的 IAM 角色
  • 在与代理的 VPC 终端节点相同的子网中创建 ENI
  • 使用相同的安全组来保护 VPC 终端节点

监听器的 IAM 角色必须包含以下 Amazon Elastic Compute Cloud (Amazon EC2) 权限:

  • 创建网络接口
  • 删除网络接口
  • 描述网络接口
  • 描述安全组
  • 描述子网
  • DescribeVPC

要查看 ESM ENI,请执行以下操作:

  1. 打开亚马逊云科技管理控制台
  2. 导航到 EC2 > 网络接口
  3. 使用以下命名模式查找 ENI:
    Amazon Lambda VPC ENI-armq-<ACCOUNT_ID>-<ESM_ID>-<remainder>

    其中:

    • ACCOUNT_ID — 包含 ESM 的亚马逊云科技账号
    • ESM_ID — ESM 的唯一标识符

下图显示了示例 ESM ENI。

图 3 Amazon MQ for RabbitMQ 为私人经纪人创建的接口示例列表。

禁用或删除 ESM 会移除 ESM 组件。

启用的 ESM 需要连接到以下设备:

  • 亚马逊云科技安全令牌服务:用于 IAM 角色假设
  • Amazon Secrets Manager:用于 RabbitMQ 证书
  • RabbitMQ 代理:用于队列访问
  • Amazon Lambda:用于监听器调用

ESM 队列轮询过程遵循以下步骤:

  1. 假设监听器的 IAM 角色
  2. 从 Secrets Manager 检索 RabbitMQ 凭证
  3. 建立经纪人通信
  4. 消息存在时调用监听器

您可以通过两种方式启用私有经纪人连接以支持队列轮询流程:

  1. 在 ESM 子网中部署 VPC 终端节点,用于:
    • 亚马逊云科技安全令牌服务 (亚马逊云科技 STS)
    • Secrets Manager
    • Lambda
  2. 在 ESM 子网中部署 NAT 网关

ESM 网络配置选项

以下各节详细介绍了不同部署场景的 ESM 网络配置。

选项 1:公开经纪人

在这种方法中,所有网络通信都在 Amazon MQ 服务端进行。启用 ESM 后,将使用公共连接。

要观察账户中实现的架构,请访问克隆的存储库根位置,确保您使用亚马逊云科技 CLI 登录并运行以下命令:

cdk deploy PublicRabbitMqInstanceStack

选项 2:默认 VPC 中的私人经纪人

在不指定 VPC 的情况下部署私有 RabbitMQ 代理会通知 Amazon MQ 服务选择默认 VPC 来设置网络,然后选择该 VPC 中的公有子网。默认安全组用于保护代理的 VPC 终端节点。

创建 ESM 在 RabbitMQ 代理的 VPC 终端节点所在的公有子网中配置专用 ENI,并应用了默认安全组。默认安全组允许在所有协议和整个端口范围内传输入站流量,因此 ESM 可以通过 VPC 终端节点路由流量。

尽管子网是公有的,可以访问互联网网关,但 ESM ENI 在私有地址空间中运行,从而阻止了与亚马逊云科技服务的直接通信。要实现正确的通信,请为亚马逊云科技 STS、Secrets Manager 和 Lambda 创建 VPC 终端节点。这些终端节点允许 ESM 通过您的 VPC 内的私有 IP 地址与亚马逊云科技服务通信。下图显示了从 ESM 到经纪人的完整通信路径。

图 4 在默认 VPC 中配置的私有代理的网络配置和请求流程。

要观察账户中实现的架构,请访问克隆的存储库根位置,确保您使用亚马逊云科技 CLI 登录,然后运行以下命令:

cdk deploy PrivateRabbitMqInstanceDefaultVpcStack

选项 3:使用 NAT 的自定义 VPC 中的私人代理

在自定义 VPC 中部署私有 RabbitMQ 代理时,为独立代理指定单个子网或为集群部署指定多个子网。部署还需要为 VPC 终端节点 ENI 创建一个安全组。

在 AMQP 端口上使用自引用入站规则配置安全组。此配置启用 ESM 与 RabbitMQ VPC 终端节点的 ENI 之间的通信。

下图显示了使用 NAT 网关部署在私有子网中时,ESM 资源如何通过网络组件进行通信。该架构演示了从 ESM 到经纪人的完整通信路径。

图 5 使用 NAT 在私有 VPC 子网中配置的私有代理的网络配置和请求流程。

要观察账户中实现的架构,请访问克隆的存储库根位置,确保您使用亚马逊云科技 CLI 登录,然后运行以下命令:

cdk deploy PrivateRabbitMqInstanceCustomVpcWithNatStack

选项 4:具有隔离子网的自定义 VPC 中的私有代理

此配置建立在先前的架构之上,但引入了隔离的子网。这些子网限制所有互联网连接,仅允许内部 VPC 网络流量。尽管代理网络组件反映了选项 3,但隔离引入了更多注意事项。

安全组仍然需要一个开放的 AMQP 端口来进行队列操作,但是子网隔离会阻止 ESM 直接访问亚马逊云科技服务。要解决此限制,请在隔离的子网中部署亚马逊云科技 STS、Secrets Manager 和 Lambda 的 VPC 终端节点。这些终端节点为 ESM 创建了一条私有通信路径,无需访问互联网即可与基本亚马逊云科技服务进行交互。

下图显示了部署在隔离子网中的 ESM 资源的通信架构。它演示了 VPC 终端节点如何在保持网络隔离的同时实现 ESM 和亚马逊云科技服务之间的安全通信。这种架构确保 ESM 可以在不因互联网泄露而损害安全性的情况下履行其消息处理职责。

图 6 在隔离 VPC 子网中配置的私有代理的网络配置和请求流程。

要观察账户中实现的架构,请访问克隆的存储库根位置,确保您使用亚马逊云科技 CLI 登录,然后运行以下命令:

cdk deploy PrivateRabbitMqInstanceCustomVpcIsolatedSubnetStack

选项 5:带有公有子网的自定义 VPC 中的私有代理

最终配置将代理置于公共子网中,同时保持先前选项中的核心部署要求。尽管设置了公有子网,但 ESM 的网络行为仍然是一个重要的考虑因素:ESM ENI 在私有地址空间中运行,即使存在互联网网关,也无法进行直接的互联网通信。

该架构需要 VPC 终端节点才能进行亚马逊云科技服务通信,与选项 2 类似。任何通过互联网网关路由 ESM 流量的尝试都会失败,因为 ENI 在私有地址空间中运行。了解这一限制对于正确的部署规划至关重要。

下图显示了公共子网中的 ESM 通信架构。尽管子网类型不同,但此配置反映了其使用 VPC 终端节点时的隔离子网方法。这些终端节点使 ESM 能够通过 VPC 内的私有安全连接与亚马逊云科技 STS、Secrets Manager 和 Lambda 服务进行通信。

图 7 在公有 VPC 子网中配置的私有代理的网络配置和请求流程。

要观察账户中实现的架构,请访问克隆的存储库根位置,确保您使用亚马逊云科技 CLI 登录,然后运行以下命令:

cdk deploy PrivateRabbitMqInstanceCustomVpcPublicSubnetStack

正在清理

为防止亚马逊云科技意外收费,请移除您创建的资源。以下亚马逊云科技 CDK 命令可帮助您安全地移除所有已部署的资源:

cdk destroy --all

结论

这篇文章探讨了 Amazon Lambda 事件源映射与 RabbitMQ 网络配置之间的关系。我们研究了从公共代理到隔离子网的各种部署方案,每种部署场景都为安全有效的实施提供了独特的考虑因素。

了解这些网络模式使您能够在使用 Lambda 事件源映射部署 Amazon MQ for RabbitMQ 时做出明智的架构决策。无论选择公共访问还是使用 VPC Endpoints 实现私有网络,了解选择特定网络配置的后果都允许您在满足应用程序消息传递需求的同时应用安全优秀实践。在实施这些模式时,请考虑您的特定安全要求和操作需求,为您的用例选择最合适的配置。

下一步优化您的无服务器消息架构。深入阅读亚马逊云科技文档,尝试所讨论的 RabbitMQ 和 Lambda 集成模式,了解这些联网配置如何提升您自己的应用程序的安全性和性能。立即开始实施这些策略,以构建更强大、可扩展的解决方案。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。