web-dev-qa-db-ja.com

プログラムでAWSリージョンを設定する

私はaws-Java-sdkバージョン1.11.104を使用しています。 AWS認証情報ドキュメント によると、デフォルトのリージョンは_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リージョンをプログラムで設定するにはどうすればよいですか?(プロジェクトのすべてのクラスに対して実行時に設定したいと思います)。

ありがとう。

編集:

クライアントのビルダーで.withRegion()を使用できることはわかっていますが、デフォルトのリージョン、またはデフォルトのリージョンプロバイダーチェーンを通じて環境変数から選択されたリージョンを期待していました。

7
Maxime Laval

同様のシナリオがあります。プログラマーがAWSコードに触れる必要がないように、AWS抽象化レイヤーを構築しています。また、ユニットテストで問題が発生し、変数_AWS_REGION_をSystem.setProperty(String, String)で設定しようとしました。

私が見つけた解決策は、プロパティを設定することです aws.region 代わりに。クラス AwsSystemPropertyRegionProvider これは「リージョンプロバイダーチェーン」上にあり、このプロパティから値を取得します。

テストの前に、_@BeforeClass_でプロパティを設定しています:

_@BeforeClass
public static void setUp() {
    System.setProperty("aws.region", "us-west-2");
}
_

それが役に立てば幸い。

3
Matheus Silva

デフォルトのリージョン、またはデフォルトのリージョンプロバイダーチェーンを通じて環境変数から選択されたリージョンを期待していました。

ええ、私がコードを読んだとき、それはデフォルトの地域を持っていません:

  • _AmazonEC2ClientBuilder_は(少し上に)AwsClientBuilderを拡張します。
  • AwsClientBuilderはデフォルトでDefaultAwsRegionProviderChainを使用します。
  • DefaultAwsRegionProviderChainは、3つのメカニズムを使用して地域を決定します:
    • AwsEnvVarOverrideRegionProviderは、実行時に設定できない_AWS_REGION_環境変数を調べます。またはすべきではありません(以下を参照)。
    • AwsProfileRegionProviderこれはAWSプロファイルファイルからそれを読み取ります。
    • InstanceMetadataRegionProviderは、現在使用しているEC2インスタンスを検索し、そのリージョンを取得しようとします。
  1. デフォルトのリージョンが使用されないのはなぜですか? (これらを参照してください aws docs

AwsHostNameUtils.parseRegionName(...)を除いて、ソースに_us-east-1_への参照がコードに表示されませんでした。しかし、それがどこで使われているのかわかりません。

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

ええ、環境はシステムプロパティと同じものではありません。 グロスハック があり、実行時に環境変数を変更できますが、ユーザーは注意してください。

私は同じ問題に遭遇しました。そして私の問題は〜/ .aws/configファイルを読み取る権限です。誰でも読める644に変更しました。その後、それは動作します。これがお役に立てば幸いです。

0
Violet Wang

これを試して:

AmazonEC2 ec2 = AmazonEC2ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials)).withRegion("us-east-1").build();
0
ram p