java sdk 访问s3 access denied

java sdk 访问s3 access denied

      • 问题
      • 解决
      • 官方说明

问题

在使用java sdk访问aws s3时,本地调试一切ok,发布到服务器时却一直access denied。
反复确认key和region设置都没有问题。

解决

使用build()而不是defaultClient()来创建s3 client

原来的代码

    AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
    AmazonS3 s3 = AmazonS3ClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            .withRegion(Regions.CN_NORTH_1)
            .defaultClient();
    ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
            .withBucketName(bucketName)
            .withPrefix(prefix)
            .withEncodingType("url");
    ObjectListing objectListing = s3.listObjects(listObjectsRequest);

修改后的代码

    AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
    AmazonS3 s3 = AmazonS3ClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            .withRegion(Regions.CN_NORTH_1)
            .build();
    ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
            .withBucketName(bucketName)
            .withPrefix(prefix)
            .withEncodingType("url");
    ObjectListing objectListing = s3.listObjects(listObjectsRequest);

官方说明

要使用默认的凭证/区域提供程序链来根据环境确定区域,请使用客户端生成器的 defaultClient 方法。
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

**默认区域提供程序链**
区域查找过程如下:

 1. 通过生成器本身使用 withRegion 或 setRegion 明确设置的所有区域优先于其他所有区域。
 2. 系统会检查 AWS_DEFAULT_REGION 环境变量。如果已设置该变量,将使用对应区域配置客户端。
    注意
    该环境变量通过 Lambda 容器设置。
 3. 开发工具包将检查 AWS 共享配置文件 (通常位于 ~/.aws/config)。如果 region 属性存在,则开发工具包会使用它。
    AWS_CONFIG_FILE 环境变量可用于自定义共享配置文件的位置。
    可以使用 AWS_PROFILE 环境变量或 aws.profile 系统属性,自定义开发工具包要加载的配置文件。
 4. 开发工具包将尝试使用 Amazon EC2 实例元数据服务,为当前运行的 Amazon EC2 实例确定区域。
 5. 如果开发工具包此时仍不能确定区域,则客户端创建将失败并返回异常。

但是我的withRegion并没有生效

你可能感兴趣的:(aws)