以编程方式设置AWS区域

Max*_*val 6 java amazon-web-services aws-sdk

我使用aws-java-sdk版本1.11.104。根据AWS凭证doc,默认区域为us-east-1,但是当我创建客户端时未手动设置区域时,如下所示:

AWSCredentialsProvider awsCredentialsProvider =
    new AWSStaticCredentialsProvider(new BasicAWSCredentials(awsAccessKey, awsSecretKey));
AmazonS3 s3Client = 
    AmazonS3ClientBuilder.standard().withCredentials(awsCredentialsProvider).build();
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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.
Run Code Online (Sandbox Code Playgroud)
  1. 为什么不使用默认区域?

    我试图在上面的代码之前添加以下内容,但仍然无法正常工作。

    System.setProperty(SDKGlobalConfiguration.AWS_REGION_ENV_VAR, "us-east-1");
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如何以编程方式设置AWS区域?(我想在运行时为项目的所有类设置它)。

谢谢。

编辑:

我知道我可以.withRegion()在客户端的生成器上使用,但是我期望使用默认区域,或者是通过默认区域提供程序链从环境变量中选择的区域。

小智 12

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

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

我在测试之前设置属性@BeforeClass

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

希望能帮助到你。


Gra*_*ray 4

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

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

  • AmazonEC2ClientBuilder延伸(向上一点)AwsClientBuilder
  • AwsClientBuilder默认情况下使用DefaultAwsRegionProviderChain.
  • DefaultAwsRegionProviderChain使用 3 种机制来确定区域:
    • AwsEnvVarOverrideRegionProvider它查找AWS_REGION无法在运行时设置的环境变量。或者不应该(见下文)。
    • AwsProfileRegionProvider它从您的 AWS 配置文件中读取它。
    • InstanceMetadataRegionProvider它会尝试查找您所在的 EC2 实例并获取其区域。
  1. 为什么不使用默认区域?(请参阅这些aws 文档

us-east-1除了 之外,我在代码中没有看到任何对源代码的引用AwsHostNameUtils.parseRegionName(...)。但我不确定它在哪里使用。

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

是的,环境与系统属性不同。有一些严重的黑客行为允许您在运行时更改环境变量,但用户要小心。