web-dev-qa-db-ja.com

AmazonS3ClientBuilder.defaultClient()はリージョンの説明に失敗しますか?

Amazon Java SDKは、いくつかのAmazonS3ClientBuilder.defaultClient()を支持してAmazonS3Clientのコンストラクタを非推奨にマークしました。ただし、推奨事項に従って、AmazonS3クライアントは以下のテストを実行すると、thisFailsテストが問題を示しています。

public class S3HelperTest {
  @Test
  public void thisWorks() throws Exception {
    AmazonS3 s3Client = new AmazonS3Client();  // this call is deprecated
    s3Client.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).build());
    assertNotNull(s3Client);
  }

  @Test
  public void thisFails() throws Exception {
    AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
    /*
     * The following line throws like 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.
     */
    s3Client.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).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.
    at com.amazonaws.client.builder.AwsClientBuilder.setRegion(AwsClientBuilder.Java:371)
    at com.amazonaws.client.builder.AwsClientBuilder.configureMutableProperties(AwsClientBuilder.Java:337)
    at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.Java:46)
    at com.amazonaws.services.s3.AmazonS3ClientBuilder.defaultClient(AmazonS3ClientBuilder.Java:54)
    at com.climate.tenderfoot.service.S3HelperTest.thisFails(S3HelperTest.Java:21)
    ...

これはAWS SDKのバグですか?環境からリージョンを派生してクライアントに設定するための「リージョンのデフォルトプロバイダーチェーン」またはメカニズムがありますか?非推奨を置き換える方法が同じ機能をもたらさないことは本当に弱いようです。

10
Bob Kuhar

ビルダーにはリージョンが必要なようです。おそらく このスレッド は関連しています(3行目でも.withRegion(Regions.US_EAST_1)を使用します):

以前の動作をエミュレートするには(リージョンが設定されていない)、クライアントビルダーで「強制グローバルバケットアクセス」も有効にする必要があります。

_AmazonS3 client = 
        AmazonS3ClientBuilder.standard()
                             .withRegion("us-east-1") // The first region to try your request against
                             .withForceGlobalBucketAccess(true) // If a bucket is in a different region, try again in the correct region
                             .build();
_

これにより、受信した例外が抑制され、例外の領域でリクエストが自動的に再試行されます。ビルダーで明示的にされるため、このクロスリージョンの動作を認識できます。注:SDKは、最初の失敗後にバケット領域をキャッシュするため、このバケットに対するすべてのリクエストが2回発生する必要はありません。


また、 AWSドキュメント からAmazonS3ClientBuilder.defaultClient();を使用する場合は、〜/ .aws/credentialsおよび〜/ .aws/configファイルが必要です。

〜/ .aws/credentialsコンテンツ:

_[default]
aws_access_key_id = your_id
aws_secret_access_key = your_key
_

〜/ .aws/configの内容:

_[default]
region = us-west-1
_

同じ AWSドキュメント ページから、リージョン/クレデンシャルをハードコーディングしたくない場合、次のようにできますLinuxマシンの環境変数を通常の方法で:

_export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key
export AWS_REGION=your_aws_region
_
17
Battle_Slug

.awsの下に「config」という名前のファイルを作成します。そして、コンテンツの下に配置します。

〜/ .aws/configの内容:

[default]
region = us-west-1
output = json
    BasicAWSCredentials creds = new BasicAWSCredentials("key_ID", "Access_Key");
    AWSStaticCredentialsProvider provider = new 
    AWSStaticCredentialsProvider(creds);

    AmazonSQS sqs =AmazonSQSClientBuilder.standard()
    .withCredentials(provider)
    .withRegion(Regions.US_EAST_2)
    .build();
0
aly