我有一个运行时带有IAM角色的EC2实例。
如果我在该实例的终端上运行以下命令,它会正确列出存储桶的内容。
aws s3 ls --region my-region s3://my-bucket-name
但是,如果我运行的是我认为相同的代码,但在Java中,我得到了403
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withRegion(my-region)
.withCredentials(new InstanceProfileCredentialsProvider(false))
.withPayloadSigningEnabled(true)
.build();
s3Client.listObjectsV2(my-bucket-name);
生成以下内容
com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied
原始listObjects
也是如此s3Client.listObjects(TestArtefactsBucket);
由于我使用的是InstanceProfileCredentialsProvider,因此应该使用与CLI使用的相同的配置文件,因此请使用相同的权限吗?
我正在使用com.amazonaws:aws-java-sdk-s3:1.11.93并且因为它在另一个线程中提到过,我正在使用joda-time:joda-time:2.9.7。
Java的版本是java-1.8.0-openjdk.x86_64。
任何帮助都会受到赞赏,我确信权限设置正确,但我没有运气获取权限。
我还应该补充一点,我可以在EC2实例上列出运行以下cli命令的存储桶内容
aws s3api list-objects-v2 --region my-region --bucket my-bucket
由于
答案 0 :(得分:0)
首先,您必须检查您的IAM角色[访问密钥&秘密密钥],用于API。
如果[访问密钥&密钥]没问题,你面临同样的问题,那么你需要检查IAM角色策略,设置S3完全访问权限。此访问权限非常重要,大多数情况下此权限设置解决了访问被拒绝的问题。希望它对你有用。
仍然无法使用?然后检查存储桶策略,谁可以读取和写入存储桶中的对象。