1

使用 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()毫无例外地使用调用,所以这似乎是某个地方的权限问题。但是哪里?!

Amazon 文档特别指出资源所有者有权访问该资源:“默认情况下,所有 Amazon S3 资源——存储桶、对象和相关子资源(例如,生命周期配置和网站配置)——都是私有的:只有资源所有者,创建它的 AWS 账户可以访问该资源。”</p>

编辑

我最初应该提到我正在使用 RiakCS 客户端连接到 S3。在此编辑时,这似乎是 RiakCS 的一个问题。

4

2 回答 2

1

您的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

于 2016-01-22T08:01:39.173 回答
-2

在亚马逊 S3 控制台中,如果您导航到您的特定文件夹,您将在“属性”选项卡下找到“权限”折叠菜单。您需要将受让人设置为“所有人”并选中必要的框。

于 2016-01-07T06:26:46.960 回答