Amazon MSK Serverless跨账户访问的安全连接模式 大数据博客


Amazon MSK Serverless 跨账户安全连接模式

重要要点

Amazon MSK Serverless 可自动管理 Apache Kafka 的基础设施,提供按需计费。在多账户环境中,Kafka 的生产者和消费者可能位于不同的 VPC,需要安全的跨账户和跨 VPC 的连接解决方案。本文将介绍多种解决方案及其优缺点,以扩展对 MSK Serverless 集群的访问。

原文连结

Amazon MSK Serverless 是一种 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 的集群类型,它使运行 Apache Kafka 变得简单,无需管理和扩展集群容量。MSK Serverless 自动配置和扩展计算和存储资源,使您能够按使用量付费。

在多个 VPC 和账户中部署基础架构被视为最佳实践,能够促进可扩展性并保持隔离边界。在多账户环境中,Kafka 生产者和消费者可能存在于同一 VPC 中,但通常位于不同的 VPC中,可能在同一账户或不同账户中。为此,迫切需要一种解决方案来将 MSK Serverless 集群的访问扩展到来自多个 VPC 的生产者和消费者。该解决方案需要具有可扩展性并易于维护。

在本文中,我们将引导您了解多种连接选项,并探讨每种方案的优缺点。

MSK Serverless 连接和认证

当创建 MSK Serverless 集群时,AWS会代表您管理集群基础设施,并通过 VPC 端点提供私有连接回您的 VPC,这些端点由 AWS PrivateLink 提供支持。您通过引导伺服器建立与集群的连接,该伺服器保留所有底层代理的记录。

在创建时,系统会分配一个完全合格的域名FQDN给您的集群引导伺服器。引导伺服器的 FQDN 一般格式为 bootClusterUniqueIDxxkafkaserverlessRegionamazonawscom,而集群的代理格式为 bxxxxClusterUniqueIDxxkafkaserverlessRegionamazonawscom,其中 ClusterUniqueIDxx 是唯一标识,bxxxx 是动态代理范围例如,b1、b37 和 b523 可能是某些已分配的代理。值得注意的是,分配给您的集群的代理是动态的并会随时间改变,而引导地址将保持不变。与集群的所有通讯都从引导伺服器开始,并在需要时返回活动代理的列表。为了正确进行 Kafka 通信,您的 MSK 客户端需要能够解析引导伺服器及所有代理的域名。

在创建集群时,您需要指定希望集群能够通信的 VPC最多五个位于与集群相同账户的 VPC。对于每个在集群创建期间指定的 VPC,都会创建集群 VPC 端点和一个私有托管区,包含引导伺服器和所有动态代理的列表。私有托管区使得能够从集群创建期间定义的相关 VPC 中解析引导伺服器和代理的 FQDN 到各自的 VPC 端点。

跨账户访问

为了扩展 Kafka 生产者和消费者到 MSK Serverless 集群的私有连接,您需要考虑三个主要方面:私有连接、身份验证和授权,以及 DNS 解析。

以下图表突出显示了可能的连接选项。虽然图中展示了所有这些选项,但在大多数情况下,您会根据架构需要选择一个或多个选项,而不一定所有选项都同时存在。

在本节中,我们将讨论不同的连接选项及其优缺点。还会涵盖与相应连接选项相关的身份验证和 DNS 解析方面。

私有连接层

这是基本的私有网络连接。您可以通过 VPC 对等连接、AWS Transit Gateway 或 PrivateLink 实现此连接,如前述图所示。VPC 对等连接 简化了设置,但不支持传递路由。在大多数情况下,对等连接用于 VPC 数量有限的情况,或者当您的 VPC 主要与少数核心服务 VPC 进行通信时,而无需横向连接或传递路由。另一方面,AWS Transit Gateway 促进了传递路由,并在您有大量 VPC 且需要横向连接的情况下简化了架构。PrivateLink 更适合专门向特定资源扩展单向连接,而无需暴露整个 VPC 到 VPC 的连接,从而增加了一层隔离。如果您有重叠的 CIDR,这是 Transit Gateway 或 VPC 对等连接所不支持的情况。PrivateLink 也适用于当连接方分开管理,并且需要一方连接和隔离的情况。

如果您选择 PrivateLink 作为连接选项,则需要使用 网络负载均衡器NLB和 IP 类型的目标组,将已注册的目标设置为您 MSK Serverless 集群的区域端点的 IP 地址。

集群身份验证和授权

除了拥有私有连接和能够解析引导伺服器及代理的域名外,生产者和消费者要能访问集群,还需要为客户端配置适当的凭据。MSK Serverless 支持 AWS 身份与访问管理IAM身份验证和授权。对于跨账户访问,MSK 客户端需要假设一个具有正确凭据来访问集群的角色。本文主要聚焦于跨账户连接和名称解析方面。关于跨账户的身份验证和授权的更多细节,请参见以下 GitHub 仓库。

DNS 解析

对于位于不同账户中的 Kafka 生产者和消费者,他们需要能够解析集群引导伺服器及每个集群代理的 FQDN,以便向集中式 MSK Serverless 集群发送和接收数据。基于代理动态分配的特性,解决方案需要能够满足这一要求。在下一节中,我们将介绍如何满足这部分要求。

Amazon MSK Serverless跨账户访问的安全连接模式 大数据博客

集群跨账户 DNS 解析

既然我们已经讨论了 MSK Serverless 如何工作、私有连接如何扩展及身份验证和授权要求,现在让我们讨论集群的 DNS 解析是如何工作的。

对于每个在集群创建期间与集群关联的 VPC,都会创建一个 VPC 端点以及一个 私有托管区。私有托管区允许从每个相关 VPC 解析集群引导伺服器和动态分配的代理的 FQDN。当请求来自于集群创建期间添加的任一 VPC 时,这种方法表现良好,因为它们已经拥有所需的 VPC 端点和相关的私有托管区。

让我们来讨论如何将名称解析扩展到同一账户中的其他 VPC,或位于其他账户的 VPC。

您已经选择了最符合架构需求的私有连接选项,无论是 VPC 对等连接、PrivateLink 还是 Transit Gateway。假设您还配置了 MSK 客户端,以便它们可以假设具有正确 IAM 凭据的角色以促进对集群的访问,现在您需要解决连接的名称解析问题。值得注意的是,虽然我们列出了不同的连接选项包括 VPC 对等连接、Transit Gateway 和 PrivateLink,但在大多数情况下,只会存在一个或两个连接选项。您并不需要拥有所有选项;这里列出它们是为了展示您的选择,您可以自由选择最符合您架构和需求的选项。

在下面的段落中,我们描述了解决 DNS 解析的两种不同方法。对于每种方法,都有其优点和限制。

私有托管区

以下图表突出了解决方案架构及其组件。请注意,为了简化图表并为本节所需的更多相关细节留出空间,我们已经删除了一些连接选项。

解决方案的开始是创建一个私有托管区,随后创建 VPC 关联。

创建私有托管区

我们首先创建一个私有托管区以便于名称解析。为了使解决方案具备可扩展性且易于维护,您可以选择在相同的 MSK Serverless 集群账户中创建此私有托管区;在某些情况下,在集中式网络账户中创建私有托管区会更受青睐。在 MSK Serverless 集群账户创建私有托管区有助于将其集中管理,并与 MSK 集群并行。然后,我们可以将集中式私有托管区与同一账户或不同其他账户的 VPC 关联。选择将私有托管区集中在网络账户中也是一个可行的解决方案。

创建私有托管区的目的是要能解析引导伺服器的 FQDN 以及所有动态分配的集群关联代理。如前所述,引导伺服器的 FQDN 格式为 bootClusterUniqueIDxxkafkaserverlessRegionamazonawscom,集群代理的格式为 bxxxxClusterUniqueIDxxkafkaserverlessRegionamazonawscom,这里的 bxxxx 是代理 ID。您需要以 kafkaserverlessRegionamazonawscom 为主要域名创建新的私有托管区,并建立一个指向 MSK Serverless 集群在其 VPC 中的区域 VPC 端点的 AAlias 记录 kafkaserverlessRegionamazonawscom。这应该足以将所有针对该集群的流量引导到您在私有托管区中指定的主集群 VPC 端点。

现在您已经创建了私有托管区,为使名称解析正常工作,需要将私有托管区与每个拥有 MSK 集群无论是生产者还是消费者的客户端所在的 VPC 相关联。

将私有托管区与同一账户中的 VPC 联接

对于与 MSK 集群同账户且未在集群创建期间配置的 VPC,您可以使用 AWS 管理控制台 编辑私有托管区设置,并将相应的 VPC 添加到私有托管区中。详细资讯请参见 将更多 VPC 与私有托管区关联。

将私有托管区与跨账户 VPC 相关联

对于位于与 MSK 集群账户不同的账户中的 VPC,请参见 关联亚马逊 VPC 和与不同 AWS 账户创建的私有托管区。主要步骤如下:

在私有托管区所在的账户即与 MSK Serverless 集群账户相同中,创建 VPC 关联授权,以授权远程 VPC 与托管区关联:

bashaws route53 createvpcassociationauthorization hostedzoneid HostedZoneID vpc VPCRegion=RegionVPCId=vpcID

在拥有 MSK 客户端的 VPC远程账户中,将 VPC 与私有托管区关联,引用您之前创建的授权:

bashaws route53 listvpcassociationauthorizations hostedzoneid HostedZoneIDaws route53 associatevpcwithhostedzone hostedzoneid HostedZoneID VPC VPCRegion=RegionVPCId=vpcID

删除 VPC 授权,以关联 VPC 与托管区:

bashaws route53 deletevpcassociationauthorization hostedzoneid HostedZoneID vpc VPCRegion=RegionVPCId=vpcID

删除授权不会影响关联,只会防止将来对 VPC 与托管区重新关联。如果您想要重新关联 VPC 与托管区,则需要重复此过程的第 1 和第 2 步骤。

飞驰加速器免费永久版

请注意,您的 VPC 必须启用 enableDnsSupport 和 enableDnsHostnames 的 DNS 属性,才能使其正常工作。这两项设置可以在 VPC 的 DNS 设置中进行配置。更多资讯,请参见 VPC 中的 DNS 属性。

这些操作对于通过 VPC 对等连接或 Transit Gateway 扩展连接的所有远程账户均运行良好。如果您的连接选择使用 PrivateLink,那么私有托管区需要在远程账户中创建即具有 PrivateLink VPC 端点的账户。此外,需要建立指向 PrivateLink 端点而不是 MSK 集群端点的 AAlias 记录,如前述图表所示。这将促进对 PrivateLink 端点的名称解析。如果其他 VPC 需要通过同一 PrivateLink 设置访问集群,则需要遵循之前描述的相同私有托管区关联程序,并将其他 VPC 与您为 PrivateLink VPC 创建的私有托管区相关联。

限制

私有托管区解决方案有一些主要限制。

首先,由于您使用 kafkaserverlessRegionamazonawscom 作为私有托管区的主要域名,并且您的 AAlias 记录使用 kafkaserverlessRegionamazonawscom,因此来自任何与该私有托管区相关