com.amazonaws.services.s3.model.AmazonS3Exception:拒绝访问

这是我的Java代码:

AmazonS3 conn = new AmazonS3Client(); AmazonS3URI uri = new AmazonS3URI(s3uri); ObjectListing objects = conn.listObjects(uri.getBucket(), uri.getKey()); 

一个非常简单的任务,我尝试使用AmazonS3 Java客户端来访问S3,但这行conn.listObjects一直失败并给了我以下exception:

 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) 
  1. 一个非常明显的错误代码:403表示我的aws凭据是错误的,但是,这与我的同事用来访问同一个s3存储桶的凭据完全相同,以排除我在某个地方有错误的可能性,我真的删除了我以前的那个和我的同事发给我的同一个并把它们放在〜/ .aws /

  2. 我还研究了其他可能的原因,可能是这个S3存储桶没有给我的IAM角色授权,显然这也不是我的情况。

有什么帮助吗? 可能是罪魁祸首?

AWS SDK for Java有一个DefaultAWSCredentialsProviderChain ,它按以下顺序检查凭据:

  • 环境变量 – AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY(推荐,因为它们被除.NET以外的所有AWS开发工具包和CLI识别),或AWS_ACCESS_KEY和AWS_SECRET_KEY(仅由Java SDK识别)
  • Java系统属性 – aws.accessKeyId和aws.secretKey
  • 凭据配置文件位于所有AWS开发工具包和AWS CLI共享的默认位置( ~/.aws/credentials
  • 如果设置了AWS_CONTAINER_CREDENTIALS_RELATIVE_URI环境变量且安全管理员有权访问变量,则通过Amazon EC2容器服务提供凭据
  • 通过Amazon EC2元数据服务提供的实例配置文件凭据

在查询所需的配置文件之前,可能正在设置您的凭据。

检查正在使用哪些凭据的一种方法是使用aws iam get-user命令来显示当前用户。 您也可以使用GetUser()调用在Java中尝试。