如何使用Java从IAM帐户访问s3存储桶

时间:2018-07-11 14:40:34

标签: amazon-s3

我有一个带有AmazonS3FullAccess的s3帐户,当我尝试使用它运行s3.listObjects("name")时出现403错误...

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>59C510407179770D</RequestId><HostId>aLPzqYkTKx6nkUWVtZWYS+2fYexzniKWkn2D9+aG6pdxBAjtxAcC85uvGC4HqDnQIifLaf+oy1E=</HostId></Error>

s3.doesBucketExistV2("name")返回true。

我的政策是这样的...

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

我需要将用户添加到某个地方吗?

更新

好像没有获得AWS证书可能是一个问题(这是奇怪的原因,因为这行)...

  

已弃用。通过didBucketExistV2(String),当凭据无效而不是返回true时,它将正确引发异常。请参阅问题#1256。

如果我运行((AmazonS3Client) s3).awsCredentialsProvider.getCredentials(),它将返回null。我的信誉在这样的amazon.properties文件中……

@PropertySources({
    @PropertySource("classpath:amazon.properties")
})
// amazon.properties
amazon.accessKey=${AMZN_ACCESS_KEY}
amazon.secretKey=${AMZN_SECRET_KEY}
aws.accessKeyId=${AMZN_ACCESS_KEY}
aws.secretKey=${AMZN_SECRET_KEY}

echo $AMZN_ACCESS_KEY返回我期望的值。

更新2

如果我像这样显式地显示属性似乎无法正确读取...

BasicAWSCredentials awsCreds = new BasicAWSCredentials(key, secret);
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
            .withRegion(service.getRegion())
            .build();

它起作用了,所以有两个问题1.)即使我没有正确登录,doesBucketExistV2为何也返回true 2.)为什么系统属性不起作用?

1 个答案:

答案 0 :(得分:-1)

您需要按以下方式传递存储桶名称。示例代码应如下所示

请参阅here

/* The following example list two objects in a bucket. */

 var params = {
  Bucket: "name", 
  MaxKeys: 2
 };
 s3.listObjects(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response