AWS SDK – 修正「無法透過區域供應商鏈尋找區域」錯誤
一、簡介
使用 AWS 開發工具包以程式方式連接到 AWS 服務時,可能會出現與 AWS 資源的區域配置相關的常見問題。出現此類問題的原因是未在 CLI 等級或用戶端建構器中設定預設區域。
我們將了解如何修復 Amazon S3 資源的問題以及執行此操作的替代方案。
2. 前提條件
要使用AWS SDK,我們需要一些東西:
- AWS 帳戶:我們需要一個 Amazon Web Services 帳戶。如果我們沒有,我們可以建立一個帳戶。
- AWS 安全憑證:我們的存取金鑰允許我們以程式設計方式呼叫 AWS API 操作。我們可以從安全憑證頁面或IAM 控制台取得 AWS 根帳戶憑證。
- 依照官方文件在本機安裝和設定 AWS CLI 。 AWS CLI 是必要的,因為在本教程中我們將使用它。配置 AWS CLI 時,我們不會設定 AWS 區域。
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 儲存桶操作
讓我們繼續創建 Amazon S3 儲存桶並觀察會發生什麼。
4.1.初始化 Amazon S3 用戶端
首先,我們必須初始化 Amazon S3 用戶端並建立與 AWS 基礎架構的連線:
AWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentialsProvider.getCredentials()))
.build();
ProfileCredentialsProvider
使用設定 AWS CLI 時定義的default
檔憑證。
4.2.建立S3儲存桶
讓我們建立 Amazon S3 儲存桶並遵循一些步驟和最佳實務。
Amazon S3 儲存桶名稱在分區內所有 AWS 區域的所有 AWS 帳戶中必須是唯一的。我們將以程式方式確保這一點。
透過遵循一些其他命名規則,讓我們建立 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.
Amazon S3 儲存桶是特定於區域的,這就是我們看到該錯誤訊息的原因。
4.3.修復配置
現在讓我們看看可以使用哪些技術來解決此錯誤。
透過在建構器本身上使用region
設定的任何顯式區域都優先於其他任何區域。
解決該問題的第一種方法是在初始化 Amazon S3 用戶端時使用建構器方法withRegion()
:
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentialsProvider.getCredentials()))
.withRegion(Regions.EU_CENTRAL_1)
.build();
透過在建構器上設定region
,我們的優勢是能夠覆蓋 CLI 配置並以程式設計方式在任何選擇的區域中建立資源。
建構者尋找 AWS 區域的順序中的第二個選項是搜尋環境變數**AWS_DEFAULT_REGION** .
如果已設置,則該區域用於配置用戶端。
讓我們在 AWS CLI 配置中設定預設區域名稱:
~> aws configure
AWS Access Key ID [None]: <AWS accesskey>
AWS Secret Access Key [None]: <AWS secretkey>
Default region name [None]: eu-central-1
Default output format [None]: json
如果我們不需要程式方法,在 CLI 配置中設定AWS_DEFAULT_REGION
可以避免此類問題。
現在,解決問題後,讓我們再次執行方法createBucket(String bucketName)
,觀察沒有出現錯誤,並且建立的儲存桶的區域正確列印在控制台中:
eu-central-1
5. 結論
在本文中,我們重點解決以程式設計方式和 CLI 配置層級建立 Amazon S3 儲存桶時的區域錯誤。
與往常一樣,範例程式碼可以在 GitHub 上取得。