1. 简介

使用 AWS SDK 编程连接 AWS 服务时,常因区域配置不当踩坑。根本原因通常是:CLI 级别或客户端构建器未设置默认区域

本文将以 Amazon S3 为例,演示如何解决该问题及替代方案。

2. 前置条件

使用 AWS SDK 需准备以下内容:

  1. AWS 账户:需注册 AWS 账户(无账户可点击创建)。
  2. AWS 安全凭证:通过安全凭证页面IAM 控制台获取访问密钥。
  3. 本地安装配置 AWS CLI:按官方文档操作。⚠️ 配置 CLI 时需跳过区域设置

3. Maven 依赖

首先添加 AWS Java SDK Core 依赖:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-core</artifactId>
    <version>1.12.777</version>
</dependency>

再添加 AWS Java SDK S3 依赖:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.12.777</version>
</dependency>

4. Amazon S3 存储桶操作

4.1. 初始化 Amazon S3 客户端

先初始化 S3 客户端建立 AWS 基础设施连接:

AWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
  .withCredentials(new AWSStaticCredentialsProvider(credentialsProvider.getCredentials()))
  .build();

ProfileCredentialsProvider 使用 AWS CLI 配置的 default 档案凭证。

4.2. 创建 S3 存储桶

遵循最佳实践创建 S3 存储桶。

存储桶命名规则

创建代码示例:

public CreateS3Bucket() {
    AWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();
    this.s3Client = AmazonS3ClientBuilder.standard()
      .withCredentials(new AWSStaticCredentialsProvider(credentialsProvider.getCredentials()))
      .build();
}

public void createBucket(String bucketName) throws SdkClientException, AmazonServiceException {
    try {
        if (!this.s3Client.doesBucketExistV2(bucketName)) {
            this.s3Client.createBucket(bucketName);
        }

        String bucketRegion = this.s3Client.getBucketLocation(bucketName);
        log.info(bucketRegion);

    } catch (AmazonServiceException e) {
        throw new AmazonServiceException(e.getErrorMessage());
    } catch (SdkClientException e) {
        throw new SdkClientException(e.getMessage());
    }
}

执行 createBucket(String bucketName) 方法时抛出错误:

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.

原因:S3 存储桶具有区域属性,但客户端未指定区域。

4.3. 修复配置

解决方案 1:构建器显式指定区域

构建器中通过 withRegion() 设置区域(优先级最高):

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
  .withCredentials(new AWSStaticCredentialsProvider(credentialsProvider.getCredentials()))
  .withRegion(Regions.EU_CENTRAL_1)
  .build();

优势:可覆盖 CLI 配置,灵活指定任意区域创建资源。

解决方案 2:通过环境变量设置

构建器次选方案:检查环境变量 AWS_DEFAULT_REGION

通过 AWS CLI 配置默认区域:

~> aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: eu-central-1
Default output format [None]: json

适用场景:不希望硬编码区域时,通过 CLI 全局配置避免问题。

修复后再次执行 *createBucket(String bucketName)*,控制台正确输出区域:

eu-central-1

5. 总结

本文通过两种方式解决了 S3 存储桶创建时的区域错误:

  1. 编程方式:在客户端构建器中显式指定区域
  2. CLI 配置:通过 AWS_DEFAULT_REGION 环境变量全局设置

完整示例代码可在 GitHub 获取。


原始标题:AWS SDK – Fixing the “Unable to Find a Region via the Region Provider Chain” Error | Baeldung