以编程方式设置AWS区域

时间:2017-05-08 21:29:26

标签: java amazon-web-services aws-sdk

我使用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.
  1. 为什么不使用默认区域?

    我尝试在上面的代码之前添加以下内容,但它仍然无效。

    System.setProperty(SDKGlobalConfiguration.AWS_REGION_ENV_VAR, "us-east-1");
    
  2. 如何以编程方式设置AWS区域?(我想在运行时为我项目的所有类设置它)。

  3. 感谢。

    修改

    我知道我可以在客户端使用.withRegion()'构建器,但我期待一个默认区域,或者,通过默认区域提供程序链从环境变量中选取的区域。

4 个答案:

答案 0 :(得分:2)

  

我期待一个默认区域,或者是通过默认区域提供程序链从环境变量中选取的区域。

是的,当我阅读代码时,它没有默认区域:

  • cron扩展(稍微)AmazonEC2ClientBuilder
  • 默认情况下,
  • AwsClientBuilder使用AwsClientBuilder
  • DefaultAwsRegionProviderChain使用3种机制来确定区域:
    • DefaultAwsRegionProviderChain查看您无法在运行时设置<{1}}环境变量。或者不应该(见下文)。
    • AwsEnvVarOverrideRegionProvider从您的AWS个人档案文件中读取它。
    • AWS_REGION尝试查找您所在的EC2实例并获取其区域。
  
      
  1. 为什么不使用默认区域? (见aws docs
  2.   

除了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();