问题描述
适用于Java的AWS开发工具包具有一个DefaultAWSCredentialsProviderChain
按以下顺序检查凭证的方式:
- -AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY(建议使用,因为除了.NET以外,所有AWS开发工具包和CLI都可以识别它们,或者AWS_ACCESS_KEY和AWS_SECRET_KEY(仅Java SDK可以识别)
- -aws.accessKeyId和aws.secretKey
- 如果设置了环境变量并且安全管理器有权访问该变量,则通过 传递的凭证
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
- 通过 *
检查正在使用哪些凭据的一种方法是使用aws iam get-
user
命令显示当前用户。您还可以通过GetUser()
调用在Java中尝试。
解决方法
这是我的Java代码:
AmazonS3 conn = new AmazonS3Client();
AmazonS3URI uri = new AmazonS3URI(s3uri);
ObjectListing objects = conn.listObjects(uri.getBucket(),uri.getKey());
一个非常简单的任务,我尝试使用AmazonS3 Java客户端访问S3,但是此行conn.listObjects
不断失败,并给了我以下异常:
Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXXX),S3 Extended Request ID: xxxxxxxxx
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1389)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:902)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:607)
at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:376)
at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:338)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:287)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3826)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3778)
at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:610)
at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:588)
-
一个非常明显的错误代码:403,它表示我的AWS凭证是错误的,但是,这与我的同事用来访问同一s3存储桶的凭证完全相同,以排除我在某处出现错字的可能性,因此我确实删除了我以前的一个,并使用了我同事发送给我的那个,并将其放在〜/ .aws /下
-
我还研究了其他可能的原因,可能是该S3存储桶未授予我的IAM角色权限,显然也不是我的情况。
有什么帮助吗?可能是罪魁祸首?