Terraform如何将同一安全组规则添加到多个AWS安全组
报错根因
aws_security_group_rule资源的security_group_id参数被定义为单个字符串类型,仅支持绑定1个安全组,直接传入安全组ID列表会触发类型不匹配校验失败,也就是报错提示Inappropriate value for attribute "security_group_id": string required的核心原因。
正确配置方式
通过Terraform内置的for_each元参数遍历目标安全组ID集合,为每个安全组生成配置完全一致的独立规则资源即可,不需要重复编写规则块,配置示例如下:
resource "aws_security_group_rule" "egress_all" { # 遍历所有需要绑定该规则的安全组ID for_each = toset([aws_security_group.test-sg-1.id, aws_security_group.test-sg-2.id]) from_port = 0 protocol = "-1" # 传入当前遍历到的单个安全组ID security_group_id = each.value to_port = 0 type = "egress" cidr_blocks = ["0.0.0.0/0"] }
方案说明
- 上述配置生成的出方向全通规则参数完全一致,仅绑定的安全组不同,完全满足单规则模板关联多个安全组的需求
- 后续需要新增绑定的安全组时,仅需将对应安全组ID加入
for_each的遍历列表即可,不需要修改规则核心参数 - 优先使用
for_each而非count做批量创建:for_each以安全组ID作为资源唯一标识,不会因为列表内元素顺序变化导致规则意外销毁重建,稳定性更高
内容的提问来源于stack exchange,提问作者JackSparow
相关产品推荐
相关产品推荐

