我使用aws-java-sdk版本1.11.104。根据{{3}},默认区域为us-east-1
,但是当我创建客户端时,我不会手动设置区域,如下所示:
AWSCredentialsProvider awsCredentialsProvider =
new AWSStaticCredentialsProvider(new BasicAWSCredentials(awsAccessKey, awsSecretKey));
AmazonS3 s3Client =
AmazonS3ClientBuilder.standard().withCredentials(awsCredentialsProvider).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.
为什么不使用默认区域?
我尝试在上面的代码之前添加以下内容,但它仍然无效。
System.setProperty(SDKGlobalConfiguration.AWS_REGION_ENV_VAR, "us-east-1");
如何以编程方式设置AWS区域?(我想在运行时为我项目的所有类设置它)。
感谢。
修改
我知道我可以在客户端使用.withRegion()
'构建器,但我期待一个默认区域,或者,通过默认区域提供程序链从环境变量中选取的区域。
答案 0 :(得分:2)
我期待一个默认区域,或者是通过默认区域提供程序链从环境变量中选取的区域。
是的,当我阅读代码时,它没有默认区域:
cron
扩展(稍微)AmazonEC2ClientBuilder
。AwsClientBuilder
使用AwsClientBuilder
。DefaultAwsRegionProviderChain
使用3种机制来确定区域:
DefaultAwsRegionProviderChain
查看您无法在运行时设置<{1}}环境变量。或者不应该(见下文)。AwsEnvVarOverrideRegionProvider
从您的AWS个人档案文件中读取它。AWS_REGION
尝试查找您所在的EC2实例并获取其区域。
- 为什么不使用默认区域? (见aws docs)
醇>
除了AwsProfileRegionProvider
之外,我没有在代码中看到源中InstanceMetadataRegionProvider
的任何引用。我不知道在哪里使用它。
System.setProperty(SDKGlobalConfiguration.AWS_REGION_ENV_VAR,&#34; us-east-1&#34;);
是的,环境与系统属性不同。有gross hacks允许您在运行时更改环境变量,但用户要小心。
答案 1 :(得分:1)
我有一个类似的场景,我们正在构建一个AWS抽象层,因此程序员不必接触任何AWS代码。而且我在单元测试中也遇到了问题,并尝试使用AWS_REGION
设置变量System.setProperty(String, String)
。
我发现的解决方案是设置属性 aws.region 。类AwsSystemPropertyRegionProvider位于“区域提供程序链”上,将从该属性获取值。
我要在测试之前在@BeforeClass
中设置属性:
@BeforeClass
public static void setUp() {
System.setProperty("aws.region", "us-west-2");
}
希望有帮助。
答案 2 :(得分:0)
我遇到了同样的问题。我的问题是读取〜/ .aws / config文件的权限。我将其更改为644,每个人都可以阅读它。然后它工作。希望这可以提供帮助。
答案 3 :(得分:0)
尝试一下:
AmazonEC2 ec2 = AmazonEC2ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials)).withRegion("us-east-1").build();