没有公共访问权限时,无法将对象放入S3存储桶

时间:2019-06-17 07:21:38

标签: java amazon-web-services amazon-s3 aws-sdk mock-aws-s3

我想将对象写入到AWS帐户中的s3存储桶,但失败,并出现以下错误。

com.amazonaws.services.s3.model.AmazonS3Exception:访问被拒绝(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求ID:34399CEF4B28B50D; S3扩展请求ID:

我尝试将存储桶公开为具有完全访问权限,然后可以对其进行写操作。

我编写的将对象写入S3存储桶的代码:

......

private final AmazonS3 amazonS3Client;

........

  final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, s3Key, stream,
                                                                           metadata);
            amazonS3Client.putObject(putObjectRequest);
            final URL url = amazonS3Client.getUrl(bucketName, s3Key);

我将S3客户端构建为:

@Configuration
public class AWSConfig {

    @Bean
    public AmazonS3 amazonS3Client() {
        String awsRegion = System.getenv("AWS_REGION");
        if (StringUtils.isBlank(awsRegion)) {
            awsRegion = Regions.getCurrentRegion().getName();
        }
        return AmazonS3ClientBuilder.standard()
                                    .withCredentials(new DefaultAWSCredentialsProviderChain())
                                    .withRegion(awsRegion)
                                    .build();
    }
}

如果我缺少任何内容,请提出建议,以及如何解决上述错误。

3 个答案:

答案 0 :(得分:0)

您缺少Access Keys (Access Key ID and Secret Access Key)

现在,仅当您将存储桶设置为公共时,它才有效,因为您没有提供任何访问密钥。

与API密钥相比,访问密钥是最好的选择,API密钥提供了一种在AWS中访问私有数据的安全方式。

您将需要:

.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(ACCESSKEY, SECRETKEY)));

有关如何generate/obtain的信息,请参见官方文档。

答案 1 :(得分:0)

确保下面的选项为“关闭”

s3-> mybucket->权限->阻止所有公共访问->>关闭

答案 2 :(得分:0)

我已经找到解决方案。问题是我尝试从其调用放置对象请求的Java服务无法访问s3存储桶。为了解决这个问题,我为运行服务的实例添加了访问s3存储桶的权限,从而解决了该问题。