Bob*_*har 10 java amazon-s3 amazon-web-services aws-sdk
亚马逊Java SDK已经标记了构造函数,AmazonS3Client
不赞成使用它们AmazonS3ClientBuilder.defaultClient()
.但是,根据该建议,不会导致AmazonS3客户端的工作方式相同.特别是,客户端以某种方式未能解释Region.如果您运行下面的测试,thisFails
测试将演示此问题.
public class S3HelperTest {
@Test
public void thisWorks() throws Exception {
AmazonS3 s3Client = new AmazonS3Client(); // this call is deprecated
s3Client.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).build());
assertNotNull(s3Client);
}
@Test
public void thisFails() throws Exception {
AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
/*
* The following line throws like com.amazonaws.SdkClientException:
* Unable to find a region via the region provider chain. Must provide an explicit region in the builder or
* setup environment to supply a region.
*/
s3Client.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).build());
}
}
com.amazonaws.SdkClientException: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.
at com.amazonaws.client.builder.AwsClientBuilder.setRegion(AwsClientBuilder.java:371)
at com.amazonaws.client.builder.AwsClientBuilder.configureMutableProperties(AwsClientBuilder.java:337)
at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.java:46)
at com.amazonaws.services.s3.AmazonS3ClientBuilder.defaultClient(AmazonS3ClientBuilder.java:54)
at com.climate.tenderfoot.service.S3HelperTest.thisFails(S3HelperTest.java:21)
...
Run Code Online (Sandbox Code Playgroud)
这是一个AWS SDK Bug吗?是否有一些"区域默认提供商链"或某种机制从环境中派生该区域并将其设置为客户端?替换弃用的方法似乎真的很弱,不会产生相同的功能.
Bat*_*lug 17
看起来构建器需要一个区域.可能这个线程是相关的(我会.withRegion(Regions.US_EAST_1)
在第3行使用):
要模拟以前的行为(未配置任何区域),您还需要在客户端构建器中启用"强制全局存储桶访问":
AmazonS3 client =
AmazonS3ClientBuilder.standard()
.withRegion("us-east-1") // The first region to try your request against
.withForceGlobalBucketAccess(true) // If a bucket is in a different region, try again in the correct region
.build();
Run Code Online (Sandbox Code Playgroud)
这将抑制您收到的异常并自动在异常区域下重试请求.它在构建器中显式化,因此您可以了解此跨区域行为.注意:SDK将在第一次失败后缓存存储区域,因此针对此存储桶的每个请求都不必发生两次.
此外,如果您想使用AWS文档,AmazonS3ClientBuilder.defaultClient();
那么您需要有〜/ .aws/credentials和〜/ .aws/config文件
〜/ .aws /凭证内容:
[default]
aws_access_key_id = your_id
aws_secret_access_key = your_key
Run Code Online (Sandbox Code Playgroud)
〜/ .aws/config内容:
[default]
region = us-west-1
Run Code Online (Sandbox Code Playgroud)
在同一个AWS文档页面中,如果您不想对区域/凭据进行硬编码,则可以通常的方式将其作为Linux机器中的环境变量:
export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key
export AWS_REGION=your_aws_region
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14655 次 |
最近记录: |