亚马逊AWS官方博客

跨 AWS Region 建立 Amazon MSK 私有连接

背景

在实际生产环境中,有的时候会面对 Amazon MSK 服务集群和 Kafka 客户端应用不在同一个组织内部,双方基于安全考虑不能直接建立 VPC 对等连接,需要使用私有网络进行互联。例如:分析服务提供商需要从客户侧的 Amazon MSK 集群中抽取数据或者让客户将数据注入到自己的 Amazon MSK 集群中,通常的解决方案是使用 PrivateLink 或者 MSK Managed VPC connection 将两个环境进行打通,但如果两个环境分布在不同的 AWS Region 里,那么这两种私有连接方式都无法满足客户的需求。本方案结合 MSK Managed VPC connection 和 VPC Peering 为用户提供跨 Region 的私有连接方式,既满足网络安全隔离的要求,也能实现跨 Region 的 MSK 访问。

架构

  • 架构图
  • 架构描述

假设 Account A 中的 MSK 集群部署在 Oregon region 中,而 Account B 的 Kafka Client 应用部署在 Virginia region 中。由于托管的 MSK Connection 不能跨 Region 建连,所以该方案中我们会在 Oregon 为 Account B 部署 Proxy VPC。在 Proxy VPC 中向 Account A 的 MSK Cluster 发起 MSK Connection 申请,Kafka Client 所在 VPC 也要与 Proxy VPC 建立 Peering Connection。在 Account B 中创建 Route53 Private Host Zone 关联到 Kafka Client 所在 VPC,并将 MSK Broker Domain 映射到 Proxy VPC 的 MSK Connection ENI 上,使得 Kafka Client 可以在本地 VPC 能够解析 MSK Broker Domain。

部署

  • 前提条件
    • Account A 中的 MSK Cluster 已经部署完成(managed MSK Connection 要求 Kafka 版本必须大于 2.7.1,且集群必须开启 IAM 认证方式)
  • 部署步骤
  1. 在 Account B 中的 Oregon Region 创建基础 VPC 作为 Proxy VPC。在 Virginia Region 发起 Kafka Client 所在 VPC 与 Proxy VPC 的 Peering Connection 请求。
  2. 在 Account A 的 MSK 集群中开启 Muti-VPC Connectivity 功能,并配置 Cluster Policy,允许 Account B 连接此 MSK Cluster。

    Cluster Policy:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::Account-B:root"
          },
          "Action": [
            "kafka:CreateVpcConnection",
            "kafka:GetBootstrapBrokers",
            "kafka:DescribeCluster",
            "kafka:DescribeClusterV2"
          ],
          "Resource": "arn:aws:kafka:us-west-2:Account-A:cluster/BHPoc/4f2146b2-6c76-4069-99db-7d053f48d08a-14"
        }
      ]
    }
    
  3. 在 Account B 的 Oregon Region 的 MSK 服务中创建 managed VPC connection 连接到 Account A 中的 MSK 集群,并关联 Proxy VPC。

    创建完成后会在 Account B 的 Oregon Region 自动生成一个 VPC Endpoint。

  1. 在 Account B 为 Domain name kafka.us-west-2.amazonaws.com 创建一个 Route53 Private Host Zone,关联 Kafka Client 所在的 VPC。
  2. 在这个 Private Host Zone 中创建 records,将 MSK Broker 的泛域名(*.iam.bhpoc.38qbl5.c14.kafka.us-west-2.amazonaws.com)与 VPC Endpoint 进行绑定。这样做的好处是每个 MSK Broker 域名都可以解析多个 ENI 地址,如果一个 ENI 故障,不会影响某一个 Broker 访问。
  • 验证测试

1. 验证网络连通性

dig +short b-1.iam.bhpoc.38qbl5.c14.kafka.us-west-2.amazonaws.com
dig +short b-2.iam.bhpoc.38qbl5.c14.kafka.us-west-2.amazonaws.com
dig +short b-3.iam.bhpoc.38qbl5.c14.kafka.us-west-2.amazonaws.com

输出结果

2. 验证 MSK 客户端创建 Topic

./kafka-topics.sh --create --bootstrap-server b-2.iam.bhpoc.38qbl5.c14.kafka.us-west-2.amazonaws.com:14002,b-1.iam.bhpoc.38qbl5.c14.kafka.us-west-2.amazonaws.com:14001,b-3.iam.bhpoc.38qbl5.c14.kafka.us-west-2.amazonaws.com:14003 --command-config ./client.properties --replication-factor 2 --partitions 1 --topic topic10    

输出结果

总结

与 PrivateLink 相比,MSK Managed VPC connection 提供了托管的私有访问方式,让用户不用自建 VPC Endpoint 和 NLB,简化了网络互连难度,但两者都不能支持跨 Region 的访问。虽然 VPC Peering 可以提供简单跨 Region 的私有网络连接,但两个 VPC 环境完全打通会增加网络安全隔离难度,而且如果是跨组织的访问很难保证两个 VPC 网络不重叠的情况发生。本方案结合 MSK Managed VPC connection 和 VPC Peering 为用户提供跨 Region 的私有访问方式,既满足网络安全隔离的要求,也能实现跨 Region 的 MSK 访问。

本篇作者

刘欣然

亚马逊云科技解决方案架构师,目前负责互联网媒体行业云端应用的架构设计与技术咨询。在加入 AWS 之前从事多年互联网开发工作,目前专注于 Devops 与边缘计算领域。

薛佳庆

亚马逊云科技解决方案架构师,负责为互联网出海客户提供云上服务的解决方案;在无服务器,容器技术,数据分析等方面有丰富的经验。

韩宇光

亚马逊云科技解决方案架构师,熟悉互联网业务的大数据业务场景,在加入 AWS 之前,在猎豹移动任职大数据高级运维工程师,有 10 多年的运维经验,深入理解云架构设计,对云上的运维,Devops,大数据解决方案有丰富的实践经验。