如何解决com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied with valid was credentials
我正在尝试获取 S3Client 中的存储桶列表,但出现异常 com.amazonaws.services.s3.model.AmazonS3Exception:访问被拒绝(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求 ID:xxxxxxxxx;S3 扩展请求 ID:xxxxxx=;xxxxx:xxxxxxx=
[junit] 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1819) [junit] 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1403) [junit] 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1372) [junit] 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1145) [junit] 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:802) [junit] 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:770) [junit] 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:744) [junit] 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:704) [junit] 在 com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:686) [junit] 在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:550) [junit] 在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:530) [junit] 在 com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5248) [junit] 在 com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5195) [junit] 在 com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5189) [junit] 在 com.amazonaws.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:1018) [junit] 在 com.amazonaws.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:1024) [junit] 在 src.projectname.tst.S3Accessor.test2(S3Accessor.java:71)
我的代码:
public void readBucket() throws IOException {
String REGION = "us-east-2";
String bucketName = "bucketName";
String key = "objectName";
try {
AWSCredentials credentials = new BasicAWSCredentials("xxxxxxxx","xxxxxx");
AmazonS3 s3Client = AmazonS3ClientBuilder
.standard()
.withCredentials(new AWsstaticCredentialsProvider(credentials))
.withRegion(Regions.US_EAST_2)
.build();
if (s3Client.doesBucketExist("bucket name")) {
System.out.println("Bucket %s already exists.\n");
}
List<Bucket> buckets = s3Client.listBuckets();
System.out.println("Your Amazon S3 buckets are:");
for (Bucket b : buckets) {
System.out.println("* " + b.getName());
}
}
}
我附加到 IAM 用户的策略是-
{
"Version": "2012-10-17","Statement": [
{
"Effect": "Allow","Action": [
"s3:*"
],"Resource": [
"arn:aws:s3:::bucket name","arn:aws:s3:::bucketname/*"
]
}
]
}
我实际上能够检查我的存储桶是否正确存在,即我的 s3Client 已正确更新。任何人都可以帮我解决这个问题。提前致谢!
解决方法
这是一个凭证许可问题。尝试向与您使用的凭证相对应的 IAM 角色/用户授予完整的 S3 权限。正确设置权限后,使用 Amazon S3 Java API 调用 Amazon S3 操作就没有问题了。
另外,考虑从旧的 V1 API 迁移到新的 V2 API:
适用于 Java 2.x 的 AWS 开发工具包是对 1.x 版代码库的主要重写。它构建在 Java 8+ 之上,并添加了几个经常请求的功能。其中包括对非阻塞 I/O 的支持以及在运行时插入不同 HTTP 实现的能力。
您可以在此处找到许多 S3 V2 代码示例:
您如何设置权限 - 通过自定义策略还是使用此策略?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。