java sdk 访问s3 access denied

    xiaoxiao2023-10-21  178

    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并没有生效

    最新回复(0)