java - 无法解释的 AmazonS3Client getObject() 403 AccessDenied 异常

标签 java amazon-web-services amazon-s3 riak-cs

使用 java Amazon AWS SDK,在调用 AmazonS3Client.getObject() 方法时出现无法解释的 403 AccessDenied 异常。这里奇怪的是,我使用相同的 AmazonS3Client 上传对象,因此对象资源所有者应该是相同的。

    ClientConfiguration config = new ClientConfiguration();
    config.setProtocol(Protocol.HTTP); // TODO Change to HTTPS?
    AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKeyID","mySecretAccessKey");
    AmazonS3 amazonS3 = new AmazonS3Client(awsCredentials, config);
    amazonS3.setEndpoint(serviceInfo.getHost());
    S3ClientOptions options = new S3ClientOptions();
    options.setPathStyleAccess(true);
    amazonS3.setS3ClientOptions(options);

    amazonS3.putObject(“myBucket”, “keyVal”, file);
    amazonS3.getObject(“myBucket”, “keyVal”); //AccessDenied

即使我使用 putObject() 调用指定 ACL,我仍然会收到 AccessDenied 异常。

Owner owner = amazonS3.getS3AccountOwner();
AccessControlList acl = new AccessControlList();
acl.grantPermission(new CanonicalGrantee(owner.getId()), Permission.Read);
amazonS3.putObject(new PutObjectRequest("mybucket", "myKey", f).withAccessControlList(acl));
amazonS3.getObject(“myBucket”, “keyVal”); //AccessDenied Still!!!

我已经通过将受让人 ALL_USERS 的 ACL 包含到 amazonS3.putObject() 调用中对此进行了测试,这允许我使用 amazonS3.getObject() 调用好吧,没有任何异常(exception),所以这似乎是某个地方的权限问题。但在哪里?!

亚马逊文档明确指出资源所有者有权访问该资源: “默认情况下,所有 Amazon S3 资源(存储桶、对象和相关子资源(例如,生命周期配置和网站配置))都是私有(private)的:只有资源所有者(创建该资源的 AWS 账户)才能访问该资源。”

编辑

我本来应该提到我正在使用 RiakCS 客户端连接到 S3。在进行此编辑时,这似乎是 RiakCS 的问题。

最佳答案

您的 Riak CS S3 端点很可能不支持或未针对 AWS v4 签名进行配置。 GetObject 在这方面似乎很特别,因为它默认使用当前 SDK 版本中的 v4 签名。

您可以做的是将客户端配置为使用 v2 签名:

ClientConfiguration opts = new ClientConfiguration();
opts.setSignerOverride("S3SignerType");  // NOT "AWS3SignerType"
AmazonS3Client s3 = new AmazonS3Client(opts);

请参阅此处的讨论:https://github.com/aws/aws-sdk-java/issues/372

关于java - 无法解释的 AmazonS3Client getObject() 403 AccessDenied 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34648102/

相关文章:

macos - 如何使用 amazon ec2 实例设置我的 mac ftp 客户端?

amazon-web-services - 无法从 VPC 内访问托管在 S3 存储桶上的静态网站

amazon-web-services - E2507 IAM 策略 key 版本不存在

java - Catch Try 让我在 Android Studio 调试中感到困惑

java - 3DES的手动实现(学术)

java - 让 oauth2 与 spring-boot 和 rest 一起工作

java - 从AWS s3存储桶读取 Parquet 数据

java - 如何覆盖 nativescript 中的重载 Java 方法?

c# - 如何在 C# AWS SDK 中强制使用 HTTP-only 模式?

python-3.x - 如何使用python脚本将 Pandas 数据框写入AWS Athena表