如何在AWS CloudFormation模板中输出Amazon MSK代理端点
在CloudFormation中获取MSK代理端点并自动创建Route53记录
嘿,我之前帮不少团队搞定过MSK集群和CloudFormation自动化部署的这类问题,其实要实现获取MSK代理端点并关联Route53记录完全没问题,下面给你一步步说清楚:
1. 先搞懂MSK集群的可用输出属性
AWS CloudFormation的AWS::MSK::Cluster资源内置了几个属性,直接就能拿到不同协议的代理端点串,你可以根据自己用的安全协议选对应的:
BootstrapBrokerString:明文(PLAINTEXT)协议的代理引导串(多个端点用逗号分隔)BootstrapBrokerStringTls:TLS加密协议的代理引导串(最常用的生产环境选项)BootstrapBrokerStringSaslScram:SASL/SCRAM认证的代理引导串BootstrapBrokerStringSaslIam:IAM认证的代理引导串
2. 在Outputs中输出MSK代理端点
想要在栈输出里看到这些端点,直接用!GetAtt函数引用就行。假设你的MSK集群资源ID是MyProductMSKCluster,Outputs可以这么写:
Outputs: MSKTlsBootstrapEndpoints: Description: "MSK集群TLS加密的代理引导端点" Value: !GetAtt MyProductMSKCluster.BootstrapBrokerStringTls Export: Name: !Sub "${AWS::StackName}-MSKTlsEndpoints"
这样不仅能在当前栈的输出里看到完整的端点串,还能通过导出功能让其他栈也复用这个值。
3. 自动创建Route53记录集
接下来要把这些端点映射到自定义域名,这里分两种常用方式:
方式一:批量创建CNAME记录(对应每个代理节点)
MSK的引导串是逗号分隔的多个端点,我们可以用CloudFormation的!Split拆分字符串,再结合!ForEach(需要模板版本≥2021-09-09)批量生成记录:
Resources: # 先定义你的MSK集群(这里是简化版配置,你可以替换成自己的) MyProductMSKCluster: Type: AWS::MSK::Cluster Properties: ClusterName: ProductCoreMSK KafkaVersion: 2.8.1 NumberOfBrokerNodes: 3 BrokerNodeGroupInfo: InstanceType: kafka.m5.large ClientSubnets: - subnet-xxxxxx - subnet-yyyyyy - subnet-zzzzzz SecurityGroups: - sg-xxxxxx # 假设你已经有Route53托管区,或者在这里创建(替换成你的域名) ProductHostedZone: Type: AWS::Route53::HostedZone Properties: Name: "myproduct.internal." # 批量生成MSK代理的CNAME记录 MSKRoute53RecordSetGroup: Type: AWS::Route53::RecordSetGroup Properties: HostedZoneId: !Ref ProductHostedZone RecordSets: !ForEach [endpoint, !Split [",", !GetAtt MyProductMSKCluster.BootstrapBrokerStringTls], [ { Name: !Sub "broker-${index(endpoint)}.kafka.myproduct.internal.", Type: "CNAME", TTL: "300", ResourceRecords: [ !Trim [ !Select [0, !Split [":", endpoint]] ] ] } ]]
这段代码的逻辑是:
- 把TLS引导串按逗号拆成单个端点
- 去掉每个端点的端口号(比如从
b-1.productcoremsk.xxxxxx.c2.kafka.us-east-1.amazonaws.com:9094里提取域名部分) - 生成类似
broker-0.kafka.myproduct.internal的自定义域名,指向对应的MSK代理节点
方式二:创建SRV记录(适配Kafka客户端自动发现)
Kafka原生支持通过SRV记录自动发现代理节点,这种方式更适合客户端动态获取集群信息,你可以这么配置:
MSKSrvRecord: Type: AWS::Route53::RecordSet Properties: HostedZoneId: !Ref ProductHostedZone Name: "_kafka._tcp.kafka.myproduct.internal." Type: "SRV" TTL: "300" ResourceRecords: !ForEach [endpoint, !Split [",", !GetAtt MyProductMSKCluster.BootstrapBrokerStringTls], [ !Sub "0 100 9094 ${!Trim [!Select [0, !Split [":", endpoint]]]}" ]]
SRV记录的格式是优先级 权重 端口 目标,这里9094是MSK的TLS默认端口,要是你改了端口记得同步调整。
几个要注意的点
- 如果你用的是旧版本的CloudFormation模板(低于2021-09-09),
!ForEach函数不支持,这时候可以用嵌套栈或者自定义资源来实现端点拆分,不过更推荐升级到最新模板版本。 - 一定要根据你MSK集群的认证方式选对对应的端点属性,比如用IAM认证就选
BootstrapBrokerStringSaslIam。 - Route53托管区要确保已经存在,或者在模板里正确创建,不然记录集创建会失败。
内容的提问来源于stack exchange,提问作者chitender kumar
相关产品推荐
相关产品推荐

