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