如何通过Terraform管理Amazon MSK主题?能否用aws_msk_configuration禁用自动创建?
解答
问题1:如何通过Terraform管理Amazon MSK主题?
Terraform官方AWS Provider没有直接提供MSK主题的管理资源,因为MSK主题属于Kafka集群层面的资源,而非AWS云服务层面的资源。通常有两种常用方式来管理:
方式1:使用Terraform Kafka Provider
通过HashiCorp的Kafka Provider直接操作Kafka主题,步骤如下:
- 引入Kafka Provider,配置MSK集群的Bootstrap Servers和认证信息(如果启用了SASL/SCRAM等认证)
- 定义
kafka_topic资源创建主题
示例代码:
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } kafka = { source = "hashicorp/kafka" version = "~> 0.6.0" } } } data "aws_msk_cluster" "example" { cluster_name = "my-msk-cluster" } provider "kafka" { bootstrap_servers = data.aws_msk_cluster.example.bootstrap_brokers_sasl_scram sasl_username = "kafka-user" sasl_password = "kafka-password" sasl_mechanism = "SCRAM-SHA-512" } resource "kafka_topic" "example" { name = "my-topic" replication_factor = 3 partitions = 6 }
方式2:使用local-exec Provisioner调用Kafka命令行工具
如果不想引入额外Provider,可以通过local-exec调用Kafka官方的kafka-topics.sh脚本,在MSK集群创建完成后执行主题创建操作:
示例代码:
resource "aws_msk_cluster" "example" { # 此处省略MSK集群配置 } resource "null_resource" "create_msk_topic" { depends_on = [aws_msk_cluster.example] provisioner "local-exec" { command = <<EOT kafka-topics.sh --create \ --topic my-topic \ --bootstrap-server ${aws_msk_cluster.example.bootstrap_brokers_sasl_scram} \ --command-config client.properties \ --partitions 6 \ --replication-factor 3 EOT } }
注意:需要确保执行环境已安装Kafka命令行工具,且client.properties包含正确的认证配置
问题2:是否可以使用aws_msk_configuration配置主题的分区数量等属性,从而禁用代理上的自动主题创建功能?
aws_msk_configuration是用来配置MSK代理的Kafka服务端参数的,无法直接设置主题的分区数量,但可以通过它禁用代理的自动主题创建功能:
- 禁用自动主题创建:在MSK配置中添加
auto.create.topics.enable=false参数,这样当客户端请求发送到不存在的主题时,MSK代理不会自动创建该主题。 - 主题分区数设置:主题的分区数需要在创建主题时(通过Kafka Provider或命令行工具)指定,不属于MSK代理的全局配置项。
示例aws_msk_configuration配置代码:
resource "aws_msk_configuration" "example" { name = "msk-disable-auto-topic" description = "Disable auto topic creation" kafka_versions = ["2.8.1"] server_properties = <<PROPERTIES auto.create.topics.enable=false # 其他代理配置参数... PROPERTIES } # 将该配置关联到MSK集群 resource "aws_msk_cluster" "example" { # 省略其他配置 configuration_info { arn = aws_msk_configuration.example.arn revision = aws_msk_configuration.example.latest_revision } }
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

