You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 00:36:02