繁体   English   中英

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

[英]com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied

这是我的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)
  1. 一个非常明显的错误代码:403 表示我的 aws 凭据错误,但是,这与我的同事用来访问同一个 s3 存储桶的凭据完全相同,以排除我在某处输入错误的可能性,我从字面上删除我以前的一个,使用的是我同事发给我的同一个,并将它们放在 ~/.aws/ 下

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

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

适用于 Java 的 AWS 开发工具包有一个DefaultAWSCredentialsProviderChain ,它按以下顺序检查凭证:

  • 环境变量- AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY(推荐,因为它们被除 .NET 之外的所有 AWS 开发工具包和 CLI 识别),或 AWS_ACCESS_KEY 和 AWS_SECRET_KEY(仅被 Java 开发工具包识别)
  • 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 中尝试。

如果它对任何人有帮助 - 我收到此错误是因为在尝试上传到存储桶时未指定服务器端加密时存储桶策略设置为拒绝s3:x-amz-server-side-encryption

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM