这是我的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角色授权,显然这不是我的情况。
请帮忙吗? 可能是罪魁祸首?
答案 0 :(得分:6)
AWS SDK for Java有DefaultAWSCredentialsProviderChain
,它按此顺序检查凭据:
~/.aws/credentials
)上的AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
环境变量并且安全管理员有权访问变量,则通过 Amazon EC2容器服务提供凭据在查询所需的配置文件之前,可能正在设置您的凭据。
检查正在使用哪些凭据的一种方法是使用aws iam get-user
命令来显示当前用户。您也可以使用GetUser()
调用在Java中尝试。
答案 1 :(得分:0)
如果对任何人都有用-我收到此错误是因为在尝试上载到存储桶时未指定服务器端加密s3:x-amz-server-side-encryption
时,存储桶策略设置为拒绝。