2017-05-08 163 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,每個人都可以閱讀它。然後它工作。希望這可以幫助。