【发布时间】:2016-09-26 11:58:18
【问题描述】:
我正在尝试使用部署在运行在 ec2 上的 tomcat 上的应用程序访问我的 s3 存储桶。
我可以看到很多与此相关的帖子,但看起来他们中的大多数都抱怨没有适当的访问权限。我可以正确访问所有存储桶,我可以使用 jenkins s3 插件等不同的应用程序从另一个应用程序上传文件,而不会出现任何问题。我不知道为什么这只适用于部署在 tomcat 上的 java web 应用程序。我已经确认了以下事情。
- ec2 实例是使用 IAM 角色创建的。
- IAM 角色对存储桶具有写入权限。木偶脚本能够写入存储桶。
- 尝试与其他应用程序一起检查 IAM 角色,它工作正常,没有任何问题。
据我了解,如果我在创建 S3 存储桶客户端(AmazonS3Client)时未指定任何凭据,它将默认采用 IAM 角色身份验证。
这是我编写的用于测试权限的示例函数。
public boolean checkWritePermission(String bucketName) {
AmazonS3Client amazonS3Client=new AmazonS3Client();
LOG.info("Checking bucket write permission.....");
boolean hasWritePermissions = false;
final ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(0);
// Create empty content
final InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
// Create a PutObjectRequest with test object
final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,
"TestDummy.txt", emptyContent, metadata);
try {
if (amazonS3Client.putObject(putObjectRequest) != null) {
LOG.info("Permissions validated!");
// User has write permissions, TestPassed.
hasWritePermissions = true;
}
}
catch (AmazonClientException s3Ex) {
LOG.warn("Write permissions not available!", s3Ex.getMessage());
LOG.error("Write permissions not available!", s3Ex);
}
return hasWritePermissions;
}
com.amazonaws.services.s3.model.AmazonS3Exception:访问被拒绝(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求 ID:xxxxxxxxxxxxxx)。
【问题讨论】:
-
“据我了解...它将采用 IAM 角色身份验证。” 我们是否应该由此假设您的实例实际上具有 IAM 角色,并且该角色有写入桶的权限吗?
-
是的,此实例是使用 IAM 角色创建的,并且它具有对存储桶的写入权限。木偶脚本能够与桶对话。问题在于使用 aws jdk。我试图检查的是当我实例化 S3 客户端 AmazonS3Client amazonS3Client=new AmazonS3Client();如果我没有提及任何身份验证,则使用的默认身份验证将基于 IAM 角色?
-
这个问题你解决了吗?
-
解决了这个问题?
-
您解决了这个问题吗?
标签: java amazon-web-services amazon-s3