You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:23:13