Terraform部署aws_mq_broker时如何正确配置deployment_mode与子网
Terraform 部署Amazon MQ 单/多可用区模式子网参数适配方案
问题场景
通过Terraform实现Amazon MQ broker资源部署时,已完成ACTIVE_STANDBY_MULTI_AZ多可用区主备模式的部署代码,现需要在测试环境部署SINGLE_INSTANCE单实例模式的MQ broker,因此将deployment_mode字段做参数化处理,通过变量传入部署模式取值。
已定义的变量如下:
variable "enviroment" { default = "test" } variable "mq_multiAZ" { default = "SINGLE_INSTANCE" }
已知Amazon MQ部署规则:
ACTIVE_STANDBY_MULTI_AZ多可用区主备模式必须配置2个不同可用区的子网SINGLE_INSTANCE单实例模式仅支持指定1个子网
原有配置中subnet_ids固定传入2个子网,完整资源配置如下:
resource "aws_mq_broker" "mymq_broker" { broker_name = "${var.enviroment}-broker" engine_type = "ActiveMQ" engine_version = "5.15.9" host_instance_type = "mq.t2.micro" deployment_mode = "${var.mq_multiAZ}" publicly_accessible = false apply_immediately = false security_groups = [aws_security_group.amazon_mq.id] subnet_ids = [ data.aws_subnet.AppSubnetA.id, data.aws_subnet.AppSubnetB.id, ] user { username = "${var.mq_master_user}" password = "${var.mq_master_pwd}" console_access = true } logs { general = true } maintenance_window_start_time { day_of_week = "SUNDAY" time_of_day = "02:00" time_zone = "UTC" } tags = { Environment = "${var.enviroment}" Name = "${var.enviroment}-broker" } }
当mq_multiAZ变量取ACTIVE_STANDBY_MULTI_AZ时部署正常,取SINGLE_INSTANCE时触发如下报错:
Error: BadRequestException: Specify a single subnet in [SINGLE_INSTANCE] deployment mode. { RespMetadata: { StatusCode: 400, RequestID: "716aafdf-578a-4eb7-bfe4-f0f08998b6db" }, ErrorAttribute: "subnetIds", Message_: "Specify a single subnet in [SINGLE_INSTANCE] deployment mode." } with aws_mq_broker.empays_broker, on amazonMQ.tf line 1, in resource "aws_mq_broker" "empays_broker": 1: resource "aws_mq_broker" "empays_broker" {
修复方法
直接通过Terraform原生条件表达式,根据部署模式动态生成符合要求的subnet_ids列表即可,无需引入额外复杂逻辑。
将原有固定写死两个子网的subnet_ids配置,替换为如下条件判断逻辑:
subnet_ids = var.mq_multiAZ == "ACTIVE_STANDBY_MULTI_AZ" ? [ # 多可用区模式传入2个不同可用区的子网 data.aws_subnet.AppSubnetA.id, data.aws_subnet.AppSubnetB.id ] : [ # 单实例模式仅传入1个目标可用区的子网,可根据实际环境规划调整选择的子网 data.aws_subnet.AppSubnetA.id ]
校验说明
修改完成后可先执行terraform plan预览配置效果:
- 变量值为
ACTIVE_STANDBY_MULTI_AZ时,subnet_ids生成长度为2的子网列表,满足多可用区部署要求 - 变量值为
SINGLE_INSTANCE时,subnet_ids生成长度为1的子网列表,匹配单实例部署的API参数约束,不会再触发上述报错
如果后续需要支持其他Amazon MQ部署模式(例如集群部署),只需要扩展条件判断分支,匹配对应模式要求的子网数量即可。
内容的提问来源于stack exchange,提问作者umesh sadambar
相关产品推荐
相关产品推荐

