【问题标题】:Setting the AWS region programmatically以编程方式设置 AWS 区域
【发布时间】:2017-05-08 21:29:25
【问题描述】:

我使用 aws-java-sdk 版本 1.11.104。根据AWS credentials doc,默认区域是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(),但我期待一个默认区域,或者,通过默认区域提供程序链从环境变量中选择的区域。

【问题讨论】:

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


【解决方案1】:

我有一个类似的场景,我们正在构建一个 AWS 抽象层,这样程序员就不必接触任何 AWS 代码。而且我在单元测试方面也遇到了问题,并尝试将变量AWS_REGION 设置为System.setProperty(String, String)

我找到的解决方案是改为设置属性 aws.regionAwsSystemPropertyRegionProvider 类位于“区域提供者链”上,将从该属性中获取值。

我在测试前设置属性,在@BeforeClass:

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我期待一个默认区域,或者,通过默认区域提供程序链从环境变量中选择的区域。

    是的,当我阅读代码时,它没有默认区域:

    • 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");

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

    【讨论】:

    • 感谢您的回答。您的 AWS 文档链接与我在问题中提出的链接相同,它显示“如果您不选择区域,则默认使用 us-east-1”。然后令人困惑...关于环境变量,它仅用于本地测试,因为我的其他环境(例如生产环境)从AwsEnvVarOverrideRegionProviderAwsProfileRegionProvider获取该区域。我不想使用.withRegion(),也不希望我团队中的所有开发人员都为了测试 AWS 客户端而接触他们的系统。
    • 如果你想要那个@MaximeLaval,那么我会使用不同的AwsRegionProviderChain。您可以采用默认值,然后添加您自己的类来查找系统属性或环境变量。
    • 但是我需要将它传递给我创建的每个客户端,就像使用 .withRegion() 一样,我不想修改现有代码,我希望能够将其测试为是。我想我会使用反射来设置环境变量。
    • 在理想情况下,我不希望开发人员必须在他们的系统上(项目之外)做任何事情。我希望任何开发人员都能够在从 VC 中提取项目后对其进行测试。我可以修改 src/test/resources 配置。
    • @MaximeLaval :你有没有找到任何解决方案。我正在寻找类似的东西,我只需要设置一次区域。 -谢谢阿潘
    【解决方案3】:

    我遇到了同样的问题。我的问题是读取 ~/.aws/config 文件的权限。我把它改成644,每个人都可以读。然后它工作。希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

      • 你必须在回答时添加一点描述。
      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 2019-03-22
      • 2022-10-14
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      相关资源
      最近更新 更多