如何用Terraform为AWS Config的approved-amis-by-tag配置多标签?
问题场景
使用Terraform部署AWS Config组织管理规则APPROVED_AMIS_BY_TAG时,配置多标签参数后执行terraform apply触发如下错误:
Error: error creating Config Organization Managed Rule (approved-amis-by-tag): InvalidParameterValueException: Blank spaces are not acceptable for input parameter: amisByTagKeyAndValue.
│
│ with aws_config_organization_managed_rule.approved-amis-by-tag,
│ on 07_config.tf line 102, in resource "aws_config_organization_managed_rule" "approved-amis-by-tag":
│ 102: resource "aws_config_organization_managed_rule" "approved-amis-by-tag" {
原配置代码:
# AWS Config Rule that checks if the AMIs used are in the list of compliant AMIs resource "aws_config_organization_managed_rule" "approved-amis-by-tag" { depends_on = [ aws_config_configuration_recorder.config_recorder ] name = "approved-amis-by-tag" rule_identifier = "APPROVED_AMIS_BY_TAG" input_parameters = <<EOF { "amisByTagKeyAndValue": { "approvedAmiLinux": "amazonLinux", "approvedAmiLinux2": "amazonLinux2", "approvedAmiUbuntu20.04": "Ubuntu20.04", "approvedAmiUbuntu22.04": "Ubuntu22.04" } } EOF timeouts { create = "10m" delete = "10m" update = "10m" } }
问题原因
报错根源是input_parameters使用EOF多行字符串时,JSON中的缩进空格被AWS Config判定为无效空白字符。APPROVED_AMIS_BY_TAG规则要求amisByTagKeyAndValue参数对应的JSON必须为无多余空白的紧凑格式。
解决方法
有两种可行的修正方式,推荐使用第二种:
方式1:手动压缩为单行JSON
直接将JSON内容压缩成一行,去掉所有缩进和换行:
input_parameters = "{\"amisByTagKeyAndValue\":{\"approvedAmiLinux\":\"amazonLinux\",\"approvedAmiLinux2\":\"amazonLinux2\",\"approvedAmiUbuntu20.04\":\"Ubuntu20.04\",\"approvedAmiUbuntu22.04\":\"Ubuntu22.04\"}}"
方式2:使用Terraform jsonencode函数(推荐)
利用Terraform内置的jsonencode函数自动生成符合要求的紧凑格式JSON,同时保持代码可读性:
input_parameters = jsonencode({ amisByTagKeyAndValue = { approvedAmiLinux = "amazonLinux" approvedAmiLinux2 = "amazonLinux2" approvedAmiUbuntu20.04 = "Ubuntu20.04" approvedAmiUbuntu22.04 = "Ubuntu22.04" } })
jsonencode会自动处理JSON格式转换,确保输出字符串无多余空格,同时避免手动编写压缩JSON的繁琐和出错风险。
内容的提问来源于stack exchange,提问作者Benny

