能否将AWS账号1的成本使用报告存储至账号2的S3桶?Terraform报错排查
跨账号存储AWS成本使用报告(CUR)的排查步骤
AWS支持将账号1的CUR存储到账号2的S3桶中,但需要完成正确的权限配置和参数校验,以下是针对你遇到的ValidationException的排查要点:
检查目标S3桶的桶策略配置
账号2的S3桶必须配置允许账号1的CUR服务写入的桶策略,核心权限需包含:- 允许
cur.amazonaws.com服务主体执行s3:PutObject和s3:GetBucketAcl操作 - 可通过
aws:SourceAccount条件限制仅允许账号1访问(提升安全性)
示例桶策略(替换占位符为实际账号ID和桶名):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cur.amazonaws.com" }, "Action": [ "s3:PutObject", "s3:GetBucketAcl" ], "Resource": [ "arn:aws:s3:::cnr-auxo-dev-cur-logs/*", "arn:aws:s3:::cnr-auxo-dev-cur-logs" ], "Condition": { "StringEquals": { "aws:SourceAccount": "账号1的AWS ID" } } } ] }- 允许
验证Terraform的Provider关联正确性
- 创建
aws_cur_report_definition资源的Provider必须是账号1的(CUR属于账号1的资源,需用账号1的凭证操作) - 你的配置中
data "aws_s3_bucket"使用了账号2的Provider(aws.xxxx1),这部分没问题,但需确认该Provider能正常读取账号2的S3桶信息
- 创建
核对CUR的S3参数准确性
s3_region必须与目标S3桶的实际区域一致,不能直接使用账号1的当前区域(若桶在不同区域)- 检查
s3_prefix是否包含非法字符,AWS要求前缀不能以/开头,且仅允许字母、数字、-、_、.、/等合规字符
获取更详细的错误信息
ValidationException仅提示参数或权限问题,可通过AWS CLI手动创建CUR来获取具体错误:aws cur put-report-definition --report-definition file://cur-def.json --profile 账号1的CLI配置文件其中
cur-def.json内容对应你的Terraform配置参数,执行后会返回具体的错误原因(如桶不存在、权限不足、区域不匹配等)确认账号1的IAM权限
确保创建CUR的IAM用户/角色拥有cur:PutReportDefinition权限,同时需具备访问目标S3桶的相关权限(辅助校验,核心权限依赖桶策略)
内容的提问来源于stack exchange,提问作者Olfa2
相关产品推荐
相关产品推荐

