Terraform创建AWS SCP时触发MalformedPolicyDocumentException错误求助
问题根因与修复方案
触发格式异常的直接原因
- Heredoc语法使用错误
你当前通过
<<EOT声明的字符串块,结束标记EOT前面存在前置空格。Terraform要求无缩进声明的heredoc结束标记必须顶格书写,不能携带任何前置空白字符,否则Terraform会将结束标记之后的Terraform配置片段也识别为字符串内容,最终生成的策略JSON为非法格式,触发MalformedPolicyDocumentException异常。
额外逻辑缺陷(不会触发格式错误,但会导致策略不生效)
- 现有校验逻辑存在遗漏
当前使用的
StringNotLike条件仅在请求已经携带对应标签时才会触发校验,如果用户创建EKS资源时完全没有携带org:bu、org:zone等标签,条件不会命中,策略会放通不符合要求的请求。
修正后配置代码
resource "aws_organizations_policy" "tag_enforcement_eks" { name = "tag_enforcement_eks" # <<-EOT支持自动忽略内容和结束标记前的制表符,避免缩进导致的语法错误 content = <<-EOT { "Version": "2012-10-17", "Statement": [ { "Sid": "Deny if org:bu absent or invalid", "Effect": "Deny", "Action": [ "eks:CreateNodegroup", "eks:CreateCluster" ], "Resource": "*", "Condition": { "Or": [ { "StringNotLike": { "aws:RequestTag/org:bu": ${jsonencode(var.bu)} } }, { "Null": { "aws:RequestTag/org:bu": true } } ] } }, { "Sid": "Deny if org:zone absent or invalid", "Effect": "Deny", "Action": [ "eks:CreateNodegroup", "eks:CreateCluster" ], "Resource": "*", "Condition": { "Or": [ { "StringNotLike": { "aws:RequestTag/org:zone": ${jsonencode(var.zone)} } }, { "Null": { "aws:RequestTag/org:zone": true } } ] } }, { "Sid": "Deny if org:team absent or invalid", "Effect": "Deny", "Action": [ "eks:CreateNodegroup", "eks:CreateCluster" ], "Resource": "*", "Condition": { "Or": [ { "StringNotLike": { "aws:RequestTag/org:team": ${jsonencode(var.team)} } }, { "Null": { "aws:RequestTag/org:team": true } } ] } }, { "Sid": "Deny if org:cluster absent or invalid", "Effect": "Deny", "Action": [ "eks:CreateNodegroup", "eks:CreateCluster" ], "Resource": "*", "Condition": { "Or": [ { "StringNotLike": { "aws:RequestTag/org:cluster": ${jsonencode(var.cluster)} } }, { "Null": { "aws:RequestTag/org:cluster": true } } ] } } ] } EOT }
如果坚持使用<<EOT而非<<-EOT,需要确保结束标记EOT完全顶格,前面没有任何空格或制表符。
内容的提问来源于stack exchange,提问作者ekansh gupta
相关产品推荐
相关产品推荐

