2017-05-08 127 views
3

我使用aws-java-sdk版本1.11.104。按照AWS credentials doc默认的区域是us-east-1,但是当我不用手动设置的区域,当我创建一个客户端,就像这样:以编程方式设置AWS区域

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区域?(我想在运行时为我的项目的所有类设置它)。

谢谢。

编辑:

我知道我可以在客户的建设者用.withRegion(),但我期待一个默认的区域,或者,该区域由一个环境变量通过默认区域提供环比回升。

+0

第二个问题http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/client/builder/AwsClientBuilder.html#withRegion-com.amazonaws.regions.Regions- –

+0

1日问题HTTP: //docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html –

+0

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/ com/amazonaws/client/builder/AwsClientBuilder.html#setRegion-java.lang.String- – alfasin

回答

2

I was expecting a default region, or, the region picked from an environment variable through the default region provider chain.

是啊,因为我读的代码,它不会有一个默认的区域:

  • AmazonEC2ClientBuilder扩展(最高位)AwsClientBuilder
  • AwsClientBuilder默认使用DefaultAwsRegionProviderChain
  • DefaultAwsRegionProviderChain使用3个机制来确定区域:
    • AwsEnvVarOverrideRegionProvider看起来在AWS_REGION环境变量,你不能在运行时设置。或者不应该(见下文)。
    • AwsProfileRegionProvider将其从您的AWS配置文件中读出。
    • InstanceMetadataRegionProvider它试图查找您所在的EC2实例并取其区域。
  1. Why isn't the default region used? (see these aws docs)

我没有在代码中看到源除了AwsHostNameUtils.parseRegionName(...)us-east-1任何引用。但我不确定那是用在哪里。

System.setProperty(SDKGlobalConfiguration.AWS_REGION_ENV_VAR, "us-east-1");

是的,环境与系统属性不是一回事。有gross hacks,允许您在运行时更改环境变量,但用户要小心。

+0

感谢您的回答。您的AWS文档链接与我在我的问题中提供的链接相同,并且它说:“如果您不选择区域,则默认情况下将使用us-east-1。”然后令人困惑......关于环境变量,它只是在本地进行测试,因为我的其他环境(例如生产)从'AwsEnvVarOverrideRegionProvider'或'AwsProfileRegionProvider'获取区域。我不想使用'.withRegion()',我不希望我的团队中的所有开发人员仅尝试测试AWS客户端来触摸他们的系统。 –

+0

如果你想要@MaximeLaval,那么我会使用不同的'AwsRegionProviderChain'。您可以使用默认的一个,然后添加您自己的类,查找系统属性或env变量。 – Gray

+0

但是之后我需要将它传递给我创建的每个客户端,与使用'.withRegion()'相同,并且我不想修改现有代码,我希望能够按原样进行测试。我想我会用反射来设置环境变量。 –

0

我遇到了同样的问题。而我的问题是读取〜/ .aws/config文件的权限。我将其更改为644,每个人都可以阅读它。然后它工作。希望这可以帮助。