【问题标题】:AmazonS3ClientBuilder.defaultClient() fails to account for region?AmazonS3ClientBuilder.defaultClient() 无法考虑区域?
【发布时间】:2018-03-23 15:35:48
【问题描述】:

Amazon Java SDK 已将 AmazonS3Client 的构造函数标记为已弃用,取而代之的是一些 AmazonS3ClientBuilder.defaultClient()。但是,遵循建议并不会产生同样工作的 AmazonS3 客户端。特别是,客户不知何故未能说明 Region。如果您运行下面的测试,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 开发工具包错误吗?是否有一些“区域默认提供者链”或某种机制从环境中派生区域并将其设置到客户端?替换弃用的方法并没有产生相同的功能,这似乎真的很弱。

【问题讨论】:

  • 下面是我创建 s3client 的方法: AmazonS3 s3client = AmazonS3ClientBuilder.standard().build();
  • @JohnHanley 我有点不愿意硬编码withRegion("us-east-1"),因为这个应用程序要部署到多个区域。我想我可以从环境中派生它,但我对实例凭证的工作方式不够熟悉,并且担心我在桌面上工作的东西在部署到 AWS 时会失败。我有点希望找到某种方式来利用 DefaultAwsRegionProviderChain。
  • 标准方法是使用“环境变量”。我没有使用 DefaultAwsRegionProviderChain,因为我知道我的存储桶在哪里,我把它放在环境变量中。

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


【解决方案1】:

构建器似乎需要一个区域。 可能this thread 是相关的(我会在第三行使用.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 会在第一次失败后缓存存储桶区域,以便 针对此存储桶的每个请求不必发生两次。


另外,如果你想使用AmazonS3ClientBuilder.defaultClient();,那么你需要从AWS documentation ~/.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 documentation 页面,如果您不想硬编码区域/凭据,您可以按照通常的方式将其作为环境变量放在 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

【讨论】:

  • 这个答案大部分是正确的,或者至少为我指明了正确的方向。如果我只是创建 ~/.aws/config 文件并在其中设置默认区域,那么 AmazonS3ClientBuilder.standard().withPathStyleAccessEnabled(true) .build(); 就可以完成工作
  • 在环境中定义AWS_REGION 也可以完成。
  • 在环境中定义 AWS_REGION 似乎在 Windows 上不起作用。
【解决方案2】:
    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();

【讨论】:

    【解决方案3】:

    在 .aws 下创建名为“config”的文件。 并放在内容下方。

    ~/.aws/config 内容:

    [default]
    region = us-west-1
    output = json
    

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2023-03-15
      • 2018-01-14
      • 2020-01-01
      相关资源
      最近更新 更多