1. 简介
使用 AWS SDK 编程连接 AWS 服务时,常因区域配置不当踩坑。根本原因通常是:CLI 级别或客户端构建器未设置默认区域。
本文将以 Amazon S3 为例,演示如何解决该问题及替代方案。
2. 前置条件
使用 AWS SDK 需准备以下内容:
- AWS 账户:需注册 AWS 账户(无账户可点击创建)。
- AWS 安全凭证:通过安全凭证页面或IAM 控制台获取访问密钥。
- 本地安装配置 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 存储桶创建时的区域错误:
- 编程方式:在客户端构建器中显式指定区域
- CLI 配置:通过 AWS_DEFAULT_REGION 环境变量全局设置
完整示例代码可在 GitHub 获取。