在CodeBuild中,我有2个项目。一个用于暂存站点,另一个用于生产站点。当我编译我的网站,并通过暂存项目运行它,它工作正常。它成功同步到我的s3存储桶用于暂存站点。但是,当尝试编译并在生产项目中运行它时,在运行sync命令时,它会返回错误:
致命错误:调用ListObjects操作时发生错误(AccessDenied):拒绝访问
[Container] 2018/09/11 08:40:33命令没有成功退出aws s3 sync public / s3:// $ S3_BUCKET退出状态1
我做了一些挖掘,我认为问题在于我的存储桶策略。我在我的S3存储桶上使用CloudFront作为CDN。我不想修改生产桶的存储桶策略,直到我完全确定我必须这样做。我担心它可能会对现场网站产生一些影响。以下是生产存储桶的存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[bucket_name]/*"
},
{
"Sid": "2",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity [access_code]"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[bucket_name]/*"
}
]
}
根据错误描述,缺少列表权限。
在您的存储分区政策中添加以下权限:
"Action": [
"s3:Get*",
"s3:List*"
]
这应该可以解决您的问题。还要检查在IAM
上创建的codebuild
服务角色,以访问S3
存储桶。 S3
存储桶策略和IAM
角色都控制在这种设置中访问S3
存储桶。
您的服务角色应具有S3
的列表权限。
{
"Sid": "S3ObjectPolicy",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:List*"
],
"Resource": ["arn:aws:s3:::my_bucket",
"arn:aws:s3:::my_bucket/*"]
}