使用Terraform创建AWS CodeDeploy S3 IAM角色时遇MalformedPolicyDocument错误
解决Terraform创建CodeDeploy IAM角色时的MalformedPolicyDocument错误
问题根源
你把权限策略当成了信任策略配置给了assume_role_policy字段。IAM角色的assume_role_policy是用来定义「谁可以扮演这个角色」的信任关系,这个策略里不允许出现Resource字段,这就是报错的直接原因。
修正步骤
拆分策略文件
- 新建信任策略文件(比如命名为
codedeploy-trust-policy.json),内容只定义允许CodeDeploy服务扮演该角色:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codedeploy.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } - 保留你原来的
AutoScalePolicy.json,这个是角色的权限策略(定义角色能执行的S3操作)。
- 新建信任策略文件(比如命名为
修改main.tf配置
将assume_role_policy指向信任策略,同时通过aws_iam_role_policy资源把权限策略附加到角色上:resource "aws_iam_role" "codedeploy_iam_role" { name = "AutoScalePolicy" assume_role_policy = file("${path.module}/codedeploy-trust-policy.json") tags = { Name = "AutoScale-CodeDeploy-BlueGreen-Role" } } # 把S3权限策略附加到CodeDeploy角色 resource "aws_iam_role_policy" "codedeploy_s3_policy" { name = "AutoScale-CodeDeploy-S3-Policy" role = aws_iam_role.codedeploy_iam_role.id policy = file("${path.module}/AutoScalePolicy.json") }
说明
assume_role_policy仅负责信任关系:指定哪个AWS服务/账号有权限切换到这个角色,不需要包含资源或具体操作权限。- 角色的具体权限要通过
aws_iam_role_policy(或aws_iam_policy+aws_iam_role_policy_attachment)来附加,这部分策略才需要Resource和Action字段。
内容的提问来源于stack exchange,提问作者Ravi Kyada
相关产品推荐
相关产品推荐

