【发布时间】:2018-03-23 15:35:48
【问题描述】:
Amazon 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)
...
这是 AWS 开发工具包错误吗?是否有一些“区域默认提供者链”或某种机制从环境中派生区域并将其设置到客户端?替换弃用的方法并没有产生相同的功能,这似乎真的很弱。
【问题讨论】:
-
下面是我创建 s3client 的方法: AmazonS3 s3client = AmazonS3ClientBuilder.standard().build();
-
@JohnHanley 我有点不愿意硬编码
withRegion("us-east-1"),因为这个应用程序要部署到多个区域。我想我可以从环境中派生它,但我对实例凭证的工作方式不够熟悉,并且担心我在桌面上工作的东西在部署到 AWS 时会失败。我有点希望找到某种方式来利用 DefaultAwsRegionProviderChain。 -
标准方法是使用“环境变量”。我没有使用 DefaultAwsRegionProviderChain,因为我知道我的存储桶在哪里,我把它放在环境变量中。
标签: java amazon-web-services amazon-s3 aws-sdk