我正在使用IAM角色访问S3,如果未找到对象,则S3返回403。我可以在AmazonS3Client中看到以下代码。它不能满足403的要求,并且将异常传递给客户端。
public boolean doesObjectExist(String bucketName, String objectName) throws AmazonServiceException, SdkClientException {
try {
this.getObjectMetadata(bucketName, objectName);
return true;
} catch (AmazonS3Exception var4) {
if (var4.getStatusCode() == 404) {
return false;
} else {
throw var4;
}
}
}
以下是IAM角色的策略。
{
"Statement":[
{
"Action":[
"s3:List*"
],
"Resource":"arn:aws:s3:::bucket_name",
"Effect":"Allow"
},
{
"Action":[
"s3:Get*",
"s3:PutObject*",
"s3:DeleteObject*",
],
"Resource":"arn:aws:s3:::bucket_name/*",
"Effect":"Allow"
}
]
}
我在某处读到,如果未找到对象,则aws尝试列表,如果列表权限不可用,则抛出403错误。
我的问题是-我可以在政策中做些什么真正的改变以停止403。这是政府客户,任何改变都需要大量时间。如果您可以通过精确的政策帮助我,那将是很大的帮助。我的猜测是“ s3:ListBucket” 我无法在本地复制它,因为我无法使用IAM角色,并且在其他我没有权限的环境中。
编辑: 我已经有“ s3:List *”作为存储桶资源。将S3:ListBucket添加到bucket / *有什么帮助?
答案 0 :(得分:3)
请检查该问题的答案 How do I have an S3 bucket return 404 (instead of 403) for a key that does not exist in the bucket/
它解释了为什么在您无法访问存储桶时S3返回403而不是404的原因(提示:不向恶意用户泄露信息)
解决方案是按照您的建议接收ListBucker API的权限。
在“操作”中添加“ S3:ListBucket”