如何从自定义端口访问 Amazon MSK 代理?

上次更新日期:2022 年 2 月 22 日

我想从自定义端口访问 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 代理。

简短描述

您可以在 Amazon MSK 中将 advertised.listener 配置从原定设置 Kafka 代理端口 9094/9092 动态更新为 443 或您选择的任何其他端口。动态配置存储在 Apache ZooKeeper 中。因此,当您重启代理时,这些配置不会更新。

例如,假设您有一个 Amazon MSK 集群,该集群在 Apache Kafka 2.4.1 版上有两个代理,并且启用了 TLS 加密和明文流量。要通过修改 advertised.listener 属性来更新代理配置,请确保您的客户端计算机与 Amazon MSK 集群位于同一 virtual private cloud (VPC) 中。要从端口 443 侦听和连接,您必须在 kafka.amazon.com 上配置 Network Load Balancer、目标组和 Amazon Route 53 私有托管区域。

您可以使用以下任一方法创建这些配置:

  • 如果您需要为所有代理使用单一端口,则必须为每个代理配置单独的 Network Load Balancer。例如,要将单个端口 443 用于两个代理,则客户端和代理之间的通信模式类似于以下内容:
    客户端 – 端口 443 的 Network Load Balancer 1 – 代理 1 的目标组 – 代理 1 客户端 – 端口 443 的 Network Load Balancer 2 – 代理 2 的目标组 – 代理 2
  • 如果您需要为所有代理使用一个 Network Load Balancer,则必须为每个代理使用单独的端口。例如,要将一个 Network Load Balancer 用于两个代理,则客户端和代理之间的通信模式类似于以下内容:
    客户端 – Network Load Balancer 侦听器端口 9001 – 代理 1 的目标组 – 代理 1 客户端 – Network Load Balancer 侦听器端口 9002 – 代理 2 的目标组 – 代理 2

本文讨论第一种方法。

解决方法

更新代理端口

通过从客户端计算机运行类似于以下内容的命令,将代理 1 的端口从 9094 更新为 443

[ec2-user@ip-aa-a-a-aaa bin]$./kafka-configs.sh --bootstrap-server 
b-1.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:9094 --entity-type 
brokers --entity-name 1 --alter --command-config client.properties 
--add-config 
advertised.listeners=[CLIENT_SECURE://b-1.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:443,REPLICATION://b-1-internal.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:9093,REPLICATION_SECURE://b-1-internal.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:9095]

Completed updating config for entity: broker 1

通过从客户端计算机运行类似于以下内容的命令,将代理 2 的端口更新为 443

[ec2-user@ip-aa-a-a-aaa bin]$./kafka-configs.sh --bootstrap-server 
b-2.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:9094 --entity-type 
brokers --entity-name 2 --alter --command-config client.properties 
--add-config 
advertised.listeners=[CLIENT_SECURE://b-2.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:443,REPLICATION://b-2-internal.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:9093,REPLICATION_SECURE://b-2-internal.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:9095]

Completed updating config for entity: broker 2

注意:

  • 您必须在同一台客户端计算机上分别为每个代理运行上述命令。此配置更新不需要重新启动代理。
  • 修改 REPLICATIONREPLICATION_SECURE 的值时,请务必在代理名称中添加 -internal
  • 请确保不要替换命令中的端口 90939095
  • 在更新代理端口配置时,请务必为客户端字段使用正确的值。示例:对于 TLS - CLIENT_SECURE,请使用 [CLIENT_SECURE://b-1.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:443]。对于 SASL - CLIENT_SASL_SCRAM,请使用 [CLIENT_SASL_SCRAM://b-1.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:443]。对于 IAM - CLIENT_IAM,请使用 [CLIENT_IAM://b-1.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com:443]

您可以通过执行以下操作来检查客户端字段的值:

1.    通过运行以下命令进入 Apache ZooKeeper shell:

./zookeeper-shell.sh <ZooKeeper_connection_string>

2.    通过运行以下命令列出代理 1 的配置:

get /brokers/ids/1
{"listener_security_protocol_map":{"REPLICATION_SECURE":"SSL","CLIENT_SASL_SCRAM":"SASL_SSL","REPLICATION":"PLAINTEXT","CLIENT":"PLAINTEXT","CLIENT_SECURE":"SSL"},"endpoints":["CLIENT://b-1.testdns.xx.c14.kafka.us-east-1.amazonaws.com:9092","CLIENT_SASL_SCRAM://b-1.dns.691zg3.c14.kafka.us-east-1.amazonaws.com:9096","CLIENT_SECURE://b-1.testdns.xx.c14.kafka.us-east-1.amazonaws.com:9094","REPLICATION://b-1-internal.testdns.xx.c14.kafka.us-east-1.amazonaws.com:9093","REPLICATION_SECURE://b-1-internal.testdns.xx.c14.kafka.us-east-1.amazonaws.com:9095"],"rack":"use1-az2","jmx_port":9099,"port":9092,"host":"b-1.testdns.xx.c14.kafka.us-east-1.amazonaws.com","version":4,"timestamp":"1645081828199"}

创建两个目标组

使用以下选项在与 Amazon MSK 集群相同的 VPC 中创建两个目标组(示例:TG1 和 TG2):

  • ip目标类型
  • TCP协议
  • 9094端口

然后,使用代理的 IP 地址将 Amazon MSK 代理注册到相应的目标组。

运行类似于以下内容的命令以获取代理的 IP 地址:

[ec2-user@ip-aa-a-a-aaa bin]$ dig +short b-1.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com
10.0.3.xx

[ec2-user@ip-aa-a-a-aaa bin]$ dig +short b-2.testdns.mswah7.c1.kafka.us-east-1.amazonaws.com
10.0.4.xx

创建两个 Network Load Balancer

使用以下设置创建两个 Network Load Balancer(示例:NLB1 和 NLB2):

  • 对于 Listeners(侦听器),请修改指向代理的发布端口 443 的端口。
  • 对于 Default action(原定设置动作),请选择要转发流量的相应目标组。
  • 对于 Mappings(映射),请务必选择 Amazon MSK 代理所在的子网。

请务必为您创建的 Network Load Balancer 启用跨区域负载均衡

创建 Route 53 私有托管区域

使用以下选项创建 Route 53 私有托管区域

  • 对于 Domain Name(域名),输入代理字符串中的域名(例如:kafka.us-east-1.amazonaws.com)。
  • 对于 VPC ID,请输入客户端的 VPC ID。

创建两条 A 型别名记录

使用 Amazon Route 53 控制台创建两条 A 型别名记录,其记录名称与代理的各自 DNS 名称相同。这是防止任何 TLS 握手失败所必需的。

请确保集群安全组的入站规则允许从 Network Load Balancer 的 IP 地址到端口 9094 的流量。

执行上述所有步骤后,您可以连接到代理发布的端口 443。

注意:此解决方案适用于为 Amazon MSK 集群启用的所有类型的访问控制方法。