AWS CDK Python:授权CloudFront访问S3遇‘操作不适用于资源’错误
解决CloudFront访问S3存储桶时的400 Bad Request错误
你在为CloudFront分发授予S3存储桶访问权限时,收到400 Bad Request错误,错误提示:
Action does not apply to any resource(s) in statement
使用的AWS CDK Python代码如下:
bucket.add_to_resource_policy(iam.PolicyStatement( resources=[bucket.bucket_arn], actions=["s3:GetObject", "s3:PutObject", "s3:GetBucketAcl", "s3:PutBucketAcl"], principals=[iam.CanonicalUserPrincipal(canonical_id)] ) ) 你尝试修改操作列表或使用通配符`*`均未解决问题,问题根源在于**S3操作的资源范围不匹配**: - `s3:GetBucketAcl`、`s3:PutBucketAcl`属于桶级操作,对应的资源是存储桶ARN(即`bucket.bucket_arn`) - `s3:GetObject`、`s3:PutObject`属于对象级操作,对应的资源必须是存储桶内的对象路径,格式为`bucket.bucket_arn + "/*"` 你的代码将所有操作绑定到桶ARN上,对象级操作无法作用于桶资源,因此触发错误。 修正后的代码需要拆分策略语句,为不同类型的操作指定对应资源: ```python # 配置桶级操作权限 bucket.add_to_resource_policy(iam.PolicyStatement( resources=[bucket.bucket_arn], actions=["s3:GetBucketAcl", "s3:PutBucketAcl"], principals=[iam.CanonicalUserPrincipal(canonical_id)] )) # 配置对象级操作权限 bucket.add_to_resource_policy(iam.PolicyStatement( resources=[f"{bucket.bucket_arn}/*"], actions=["s3:GetObject", "s3:PutObject"], principals=[iam.CanonicalUserPrincipal(canonical_id)] ))
拆分后每个操作都匹配了正确的资源范围,即可解决该错误。
内容的提问来源于stack exchange,提问作者capybara
相关产品推荐
相关产品推荐

