如何在Terraform中配置S3复制桶权限解决AccessDenied与MalformedPolicy报错
问题1:解决Terraform
MalformedPolicy报错 错误原因:s3:ListBucket属于桶级操作,仅适用于存储桶本身的ARN,不能作用于带/*后缀的对象级资源路径,你当前第二条statement的资源配置错误导致策略校验失败。
修正后的策略配置如下:
data "aws_iam_policy_document" "s3" { version = "2012-10-17" statement { sid = "CopyObjectPermissions" effect = "Allow" principals { type = "AWS" identifiers = ["arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/ops-mgmt-admin"] } actions = ["s3:GetObject","s3:PutObject","s3:PutObjectAcl", "s3:PutObjectTagging"] resources = ["${aws_s3_bucket.nfcisbenchmark_cloudtrail.arn}/*"] } statement { sid = "CopyBucketPermissions" actions = ["s3:ListBucket"] effect = "Allow" principals { type = "AWS" identifiers = ["arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/ops-mgmt-admin"] } # 此处资源为桶本身ARN,去掉末尾的/* resources = [aws_s3_bucket.nfcisbenchmark_cloudtrail.arn] } }
问题2:解决跨账号S3复制
AccessDenied问题 跨账号复制需要同时配置源桶、目标桶两边的权限,以及调整执行命令参数,完整配置要求如下:
- 子账号源桶
s3://sub-account-cloudtrail的桶策略,需要给主账号ops-mgmt-admin角色开放以下权限:- 桶级权限:
s3:ListBucket - 对象级权限:
s3:GetObject、s3:GetObjectAcl、s3:GetObjectTagging
- 桶级权限:
- 主账号目标桶
s3://master-acccount-cloudtrail的桶策略,按上面修正后的配置即可 - 确认
ops-mgmt-admin角色的信任关系策略,已经允许子账号的对应身份(用户/角色)执行sts:AssumeRole操作,避免无法正常切换角色 - 执行复制命令时添加ACL参数,确保目标桶账号拥有写入对象的完整所有权:
aws s3 cp s3://sub-account-cloudtrail s3://master-acccount-cloudtrail --recursive --acl bucket-owner-full-control --profile=admin
内容的提问来源于stack exchange,提问作者Evan Gertis
相关产品推荐
相关产品推荐

