

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 如何將程式碼從 適用於 Java 的 AWS SDK 1.x 遷移至 2.x
<a name="migration-howto"></a>

您可以透過幾種方式遷移現有的適用於 Java 的 SDK 1.x 應用程式。

1. 使用[遷移工具](migration-tool.md)的自動化方法。

1. 以 2.x 匯入逐步取代 1.x 匯入的[手動方法](migration-steps.md)。

我們建議您從使用遷移工具開始。它會自動化從 1.x 到 2.x 程式碼的大部分例行替換工作。

由於工具[不會遷移所有功能](migration-tool.md#migration-tool-limitations)，因此在執行工具之後，您將需要搜尋剩餘的 v1 程式碼。當您找到工具未遷移的程式碼時，請遵循[step-by-step](migration-steps.md)（手動方法），並使用[遷移指南文章](migration-whats-different.md)來完成遷移。

**Topics**
+ [遷移工具](migration-tool.md)
+ [Step-by-step說明](migration-steps.md)

# 適用於 Java 的 AWS SDK 遷移工具
<a name="migration-tool"></a>

 適用於 Java 的 AWS SDK 提供遷移工具，可協助自動將適用於 Java 的 SDK 1.x (V1) 程式碼遷移至 2.x (V2)。此工具使用開放原始碼、原始程式碼重構工具 [OpenRewrite](https://docs.openrewrite.org/) 來執行遷移。OpenRewrite 使用程式碼修改規則 （稱為「配方」)，將您的原始程式碼從 V1 自動更新為 V2 語法和模式。

此工具支援 SDK 服務用戶端和 [S3 Transfer Manager](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html) 高階程式庫的程式碼修改規則。不支援其他高階 APIs的程式碼修改規則，例如 V1 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html)到 V2 的 [DynamoDB 增強型用戶端 API](dynamodb-enhanced-client.md)。

如需限制的詳細資訊，請參閱[此頁面的結尾](#migration-tool-limitations)。如需手動遷移步驟的常見不支援程式碼模式的詳細範例，請參閱[不支援的程式碼模式](migration-tool-unsupported-patterns.md)。

## 使用遷移工具
<a name="migration-tool-use"></a>

### 遷移 Maven 專案
<a name="migration-tool-use-maven"></a>

請依照下列指示，使用 [OpenRewrite Maven 外掛程式工具遷移適用於 Java 的 SDK 1.x Maven](https://docs.openrewrite.org/reference/rewrite-maven-plugin) 型專案。

1. 導覽至 Maven 專案的根目錄

   開啟終端機 （命令列） 視窗，然後導覽至 Maven 型應用程式的根目錄。

1. 執行外掛程式的`rewrite-maven-plugin`命令

   您可以選擇兩種模式 (Maven 目標）： `dryRun`和 `run`。

   **`dryRun`**** 模式**

   在 `dryRun`模式中，外掛程式會在主控台輸出中產生 diff 日誌，並在 `target/rewrite` 資料夾中產生名為 `rewrite.patch`的修補程式檔案。此模式可讓您預覽將要進行的變更，因為原始程式碼檔案不會進行任何變更。

   下列範例示範如何在 `dryRun` 模式中叫用 外掛程式。

   ```
   mvn org.openrewrite.maven:rewrite-maven-plugin:<rewrite-plugin-version>*:dryRun \
     -Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:<sdkversion>** \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   \$1將 *<rewrite-plugin-version>* 取代為您在此[測試檔案中](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54)看到`rewriteMavenPluginVersion`的值。

   \$1\$1以 2.x SDK 版本取代 *<sdkversion>*。請造訪 [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) 以檢查是否有最新版本。
**重要**  
請務必使用[測試檔案中](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54)`rewrite-maven-plugin`顯示的 版本，因為其他版本可能無法運作。

   來自 `dryRun` 模式的主控台輸出應該類似下列輸出。

   ```
   [WARNING] These recipes would make changes to project/src/test/resources/maven/before/pom.xml:
   [WARNING]     software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   [WARNING]         software.amazon.awssdk.v2migration.UpgradeSdkDependencies
   [WARNING]             org.openrewrite.java.dependencies.AddDependency: {groupId=software.amazon.awssdk, artifactId=apache-client, version=2.27.0, onlyIfUsing=com.amazonaws.ClientConfiguration}
   [WARNING]             org.openrewrite.java.dependencies.AddDependency: {groupId=software.amazon.awssdk, artifactId=netty-nio-client, version=2.27.0, onlyIfUsing=com.amazonaws.ClientConfiguration}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-bom, newGroupId=software.amazon.awssdk, newArtifactId=bom, newVersion=2.27.0}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-s3, newGroupId=software.amazon.awssdk, newArtifactId=s3, newVersion=2.27.0}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-sqs, newGroupId=software.amazon.awssdk, newArtifactId=sqs, newVersion=2.27.0}
   [WARNING] These recipes would make changes to project/src/test/resources/maven/before/src/main/java/foo/bar/Application.java:
   [WARNING]     software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   [WARNING]         software.amazon.awssdk.v2migration.S3GetObjectConstructorToFluent
   [WARNING]             software.amazon.awssdk.v2migration.ConstructorToFluent
   [WARNING]         software.amazon.awssdk.v2migration.S3StreamingResponseToV2
   [WARNING]         software.amazon.awssdk.v2migration.ChangeSdkType
   [WARNING]         software.amazon.awssdk.v2migration.ChangeSdkCoreTypes
   [WARNING]             software.amazon.awssdk.v2migration.ChangeExceptionTypes
   [WARNING]                 org.openrewrite.java.ChangeType: {oldFullyQualifiedTypeName=com.amazonaws.AmazonClientException, newFullyQualifiedTypeName=software.amazon.awssdk.core.exception.SdkException}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRequestId(), newMethodName=requestId}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getErrorCode(), newMethodName=awsErrorDetails().errorCode}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getServiceName(), newMethodName=awsErrorDetails().serviceName}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getErrorMessage(), newMethodName=awsErrorDetails().errorMessage}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRawResponse(), newMethodName=awsErrorDetails().rawResponse().asByteArray}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRawResponseContent(), newMethodName=awsErrorDetails().rawResponse().asUtf8String}
   [WARNING]                 org.openrewrite.java.ChangeType: {oldFullyQualifiedTypeName=com.amazonaws.AmazonServiceException, newFullyQualifiedTypeName=software.amazon.awssdk.awscore.exception.AwsServiceException}
   [WARNING]         software.amazon.awssdk.v2migration.NewClassToBuilderPattern
   [WARNING]             software.amazon.awssdk.v2migration.NewClassToBuilder
   [WARNING]             software.amazon.awssdk.v2migration.V1SetterToV2
   [WARNING]         software.amazon.awssdk.v2migration.V1GetterToV2
   ...
   [WARNING]         software.amazon.awssdk.v2migration.V1BuilderVariationsToV2Builder
   [WARNING]         software.amazon.awssdk.v2migration.NewClassToBuilderPattern
   [WARNING]             software.amazon.awssdk.v2migration.NewClassToBuilder
   [WARNING]             software.amazon.awssdk.v2migration.V1SetterToV2
   [WARNING]         software.amazon.awssdk.v2migration.HttpSettingsToHttpClient
   [WARNING]         software.amazon.awssdk.v2migration.WrapSdkClientBuilderRegionStr
   [WARNING] Patch file available:
   [WARNING]     project/src/test/resources/maven/before/target/rewrite/rewrite.patch
   [WARNING] Estimate time saved: 20m
   [WARNING] Run 'mvn rewrite:run' to apply the recipes.
   ```

   **`run`**** 模式**

   當您在 `run` 模式下執行外掛程式時，它會修改磁碟上的原始碼以套用變更。執行 命令之前，請確定您有原始程式碼的備份。

   下列範例示範如何在 `run` 模式中叫用 外掛程式。

   ```
   mvn org.openrewrite.maven:rewrite-maven-plugin:<rewrite-plugin-version>*:run \
     -Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:<sdkversion>** \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   \$1將 *<rewrite-plugin-version>* 取代為您在此[測試檔案中](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54)看到`rewriteMavenPluginVersionvalue`的 。

   \$1\$1將 *<sdkversion>* 取代為 2.x SDK 版本。請造訪 [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) 以檢查是否有最新版本。

   執行 命令後，編譯您的應用程式並執行測試以驗證變更。

### 遷移 Gradle 專案
<a name="migration-tool-use-gradle"></a>

請依照下列指示，使用 [OpenRewrite Gradle 外掛程式工具遷移適用於 Java 的 SDK 1.x Gradle](https://docs.openrewrite.org/reference/gradle-plugin-configuration) 型專案。

1. 導覽至 Gradle 專案的根目錄

   開啟終端機 （命令列） 視窗，然後導覽至 Gradle 型應用程式的根目錄。

1. 建立 Gradle init 指令碼

   在 目錄中建立具有下列內容`init.gradle`的檔案。

   ```
   initscript {
       repositories {
           maven { url "https://plugins.gradle.org/m2" }
       }
       dependencies {
           classpath("org.openrewrite:plugin:<rewrite-plugin-version>*")
       }
   }
   
   rootProject {
       plugins.apply(org.openrewrite.gradle.RewritePlugin)
       dependencies {
           rewrite("software.amazon.awssdk:v2-migration:latest.release")
       }
   
       afterEvaluate {
           if (repositories.isEmpty()) {
               repositories {
                   mavenCentral()
               }
           }
       }
   }
   ```

   \$1將 *<rewrite-plugin-version>* 取代為您在此[測試檔案中](https://github.com/aws/aws-sdk-java-v2/blob/master/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/gradle/before/init.gradle#L6)看到的版本。

1. 執行 `rewrite`命令

   如同 Maven 外掛程式，您可以在 `dryRun`或 `run` 模式中執行 Gradle 外掛程式。

   **`dryRun` 模式**

   下列範例示範如何在 `dryRun` 模式中叫用 外掛程式。

   ```
   gradle rewriteDryRun --init-script init.gradle \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   **`run` 模式**

   下列範例示範如何在 `run` 模式中叫用 外掛程式。

   ```
   gradle rewriteRun --init-script init.gradle \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

## 目前限制
<a name="migration-tool-limitations"></a>

雖然遷移透過更新至 V2 對等的程式碼修改規則來升級大多數 V1 程式碼，但某些類別和方法不會涵蓋在內。 V2 對於這些類別和方法，請依照[step-by-step指示](migration-steps.md)手動遷移您的程式碼。

對於某些不支援的程式碼修改規則，遷移工具可能會新增以下列開頭的註解：

```
/*AWS SDK for Java v2 migration: Transform for ...
```

在註解之後，工具會輸出方法或類別的 V2 版本一般 Stub。例如，在下列輸出中，遷移工具嘗試遷移 V1 S3 用戶端`setBucketLifecycleConfiguration`的方法：

```
/*AWS SDK for Java v2 migration: Transform for setBucketLifecycleConfiguration method not supported. 
Please manually migrate your code by using builder pattern, update from BucketLifecycleConfiguration.Rule 
to LifecycleRule, StorageClass to TransitionStorageClass, and adjust imports and names.*/
s3.putBucketLifecycleConfiguration(
        PutBucketLifecycleConfigurationRequest.builder()
            .bucket(bucketName)
            .lifecycleConfiguration(BucketLifecycleConfiguration.builder()
                .build())
            .build());
```

下方清單中的連結會帶您前往遷移資訊，以協助您手動遷移程式碼。
+ [第 1 版和第 2 版之間的 S3 用戶端差異 適用於 Java 的 AWS SDK](migration-s3-client.md)
+ [S3 Transfer Manager](migration-s3-transfer-manager.md) (TransferManager)
+ [DynamoDB 物件映射](migration-ddb-mapper.md) (DynamoDBMapper)
+ [EC2 中繼資料公用程式](migration-imds.md) (EC2MetadataUtils)
+ [等待程式](migration-waiters.md) (AmazonDynamoDBWaiters)
+ [IAM 政策建置器](migration-iam-policy-builder.md) （政策）
+ [CloudFront 預先簽署 ](migration-cloudfront-presigning.md)(CloudFrontUrlSigner、CloudFrontCookieSigner)
+ [S3 事件通知 ](migration-s3-event-notification.md)(S3EventNotification)
+ SDK 指標發佈 ([1.x 文件](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html)、[2.x 文件](metrics.md))
+ [不支援的程式碼模式](migration-tool-unsupported-patterns.md) – 需要手動遷移的常見程式碼模式的詳細範例

# 遷移工具不支援的程式碼模式
<a name="migration-tool-unsupported-patterns"></a>

遷移工具會自動將大多數 v1 程式碼轉換為 v2。不過，某些程式碼模式需要手動遷移。本主題提供最常見的不支援模式的詳細範例，並說明如何手動轉換。

下列模式清單並不詳盡。如果您的程式碼在執行遷移工具後未編譯，請依照[step-by-step遷移說明](migration-steps.md)手動遷移剩餘的 v1 程式碼。

## 使用參數請求物件建構函數
<a name="request-pojo-constructors"></a>

對於請求 POJOs(Amazon S3 除外），遷移工具只會轉換設定程式方法。此工具不支援具有參數的建構函數。

**支援的模式：使用設定器請求物件 （無建構器參數）**

之前 （原始 v1 程式碼）：

```
import com.amazonaws.services.sqs.model.SendMessageRequest;

SendMessageRequest request = new SendMessageRequest().withMessageBody("Hello World");
request.setQueueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue");
```

After （遷移工具結果）：

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

SendMessageRequest request = SendMessageRequest.builder()
    .messageBody("Hello World").build();
request = request.toBuilder()
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue").build();
```

**不支援的模式：使用參數請求物件建構函數**

遷移工具無法轉換具有參數的建構函數：

在手動遷移之前，但在遷移工具之後：

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest; // Import updated to v2.

// This pattern requires manual migration.
SendMessageRequest request = new SendMessageRequest(
    "https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", 
    "Hello World");
```

遷移工具會將匯入轉換為 v2，但建構函式程式碼保持不變，且需要手動更新才能使用建置器模式。

手動遷移之後：

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

SendMessageRequest request = SendMessageRequest.builder()
    .messageBody("Hello World")
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue")
    .build();
```

## 具有個別參數的服務用戶端方法
<a name="service-client-method-overloads"></a>

遷移工具無法轉換採用個別參數的服務用戶端方法，而非請求物件 (Amazon S3 除外）。

之前 (v1 程式碼）：

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;

AmazonSQS sqs = new AmazonSQSClient();
// The following v1 method takes individual parameters.
sqs.sendMessage("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", "Hello World");
```

After （遷移工具結果 – 未編譯）：

```
import software.amazon.awssdk.services.sqs.SqsClient;  // Import updated to v2.
// No import statement for the v2 request POJO.

SqsClient sqs = SqsClient.builder().build();

// Does not compile–v2 methods only accept request POJOs.
sqs.sendMessage("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", "Hello World");
```

您必須手動更新方法引數，才能使用請求物件：

```
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.SendMessageRequest; // Add manually.

SqsClient sqs = SqsClient.builder().build();

// Corrected v2 code.
SendMessageRequest request = SendMessageRequest.builder()
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue")
    .messageBody("Hello World")
    .build();
sqs.sendMessage(request);
```

## 請求逾時方法
<a name="request-pojo-timeout-configuration"></a>

遷移工具不會轉換在請求物件上設定逾時的方法。

之前 (v1 程式碼）：

```
import com.amazonaws.services.sqs.model.SendMessageRequest;

SendMessageRequest request = new SendMessageRequest();
request.setSdkRequestTimeout(7);
```

After （遷移工具結果 – 未編譯）：

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;  // Import updated to v2.

SendMessageRequest request = SendMessageRequest.builder().build();

// Does not compile.
request.setSdkRequestTimeout(7);
```

您必須手動遷移以使用 v2 的 `overrideConfiguration`方法：

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
import java.time.Duration;

SendMessageRequest request = SendMessageRequest.builder().build();

// Corrected v2 code.
request = request.toBuilder()
    .overrideConfiguration(o -> o.apiCallTimeout(Duration.ofSeconds(7)))
    .build();
```

## 具有參數的服務用戶端建構函數
<a name="service-client-constructors-with-args"></a>

遷移工具會轉換空的服務用戶端建構函數，但無法轉換接受登入資料或組態等參數的建構函數。

之前 (v1 程式碼）：

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;

AWSCredentials awsCredentials = new BasicAWSCredentials("akid", "skid");
AmazonSQS sqs = new AmazonSQSClient(awsCredentials);
```

After （遷移工具結果 – 未編譯）：

```
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.services.sqs.SqsClient;  // Import updated to v2.

AwsCredentials awsCredentials = AwsBasicCredentials.create("akid", "skid");

// Does not compile.
SqsClient sqs = new SqsClient(awsCredentials);
```

您必須手動更新服務用戶端建構函數，才能使用建置器模式：

```
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;  // Add manually.
import software.amazon.awssdk.services.sqs.SqsClient;

AwsCredentials awsCredentials = AwsBasicCredentials.create("akid", "skid");

// Corrected v2 code.
SqsClient sqs = SqsClient.builder()
    .credentialsProvider(StaticCredentialsProvider.create(awsCredentials))
    .build();
```

# 遷移step-by-step說明與範例
<a name="migration-steps"></a>

本節提供step-by-step指南，將目前使用適用於 Java 的 SDK v1.x 的應用程式遷移至適用於 Java 的 SDK 2.x。第一部分提供步驟的概觀，後面接著詳細的遷移範例。

此處涵蓋的步驟說明正常使用案例的遷移，其中應用程式 AWS 服務 使用模型驅動的服務用戶端呼叫 。如果您需要遷移使用更高層級 APIs的程式碼，例如 [S3 Transfer Manager](migration-s3-transfer-manager.md) 或 [CloudFront 預先簽章](migration-cloudfront-presigning.md)，請參閱 目錄下的 [適用於 Java 的 AWS SDK 1.x 和 2.x 之間的差異](migration-whats-different.md) 一節。



此處所述的方法是建議。您可以使用其他技術，並利用 IDE 的程式碼編輯功能來達到相同的結果。

## 步驟概觀
<a name="migration-steps-overview"></a>

### 1. 首先新增適用於 Java 的 SDK 2.x BOM
<a name="migration-steps-overview-step1"></a>

透過將適用於 Java 的 SDK 2.x 的 Maven BOM （物料清單） 元素新增至您的 POM 檔案，您可以確保所需的所有 v2 相依性都來自相同的版本。POM 可以同時包含 v1 和 v2 相依性。這可讓您逐步遷移程式碼，而不是一次全部變更。

#### 適用於 Java 的 SDK 2.x BOM
<a name="drt_b5n_q1c"></a>

```
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>bom</artifactId>
      <version>2.27.21</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
```

您可以在 Maven Central Repository 上找到[最新版本](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

### 2. 搜尋 v1 類別匯入陳述式的檔案
<a name="migration-steps-overview-step2"></a>

透過掃描應用程式中用於 v1 匯入的 SERVICE\$1IDs的檔案，您會找到使用的唯一 SERVICE\$1IDs。SERVICE\$1ID 是 的簡短唯一名稱 AWS 服務。例如`cognitoidentity`，Amazon Cognito Identity 的 SERVICE\$1ID。

### 3. 從 v1 匯入陳述式判斷 v2 Maven 相依性
<a name="migration-steps-overview-step3"></a>

找到所有唯一的 v1 SERVICE\$1IDs之後，您可以參考 來判斷 v2 相依性的對應 Maven 成品[Maven artifactId 映射的套件名稱](#migration-serviceid-artifactid-mapping)。

### 4. 將 v2 相依性元素新增至 POM 檔案
<a name="migration-steps-overview-step4"></a>

使用步驟 3 中確定的相依性元素更新 Maven POM 檔案。

### 5. 在 Java 檔案中，在 v1 類別上逐漸變更為 v2 類別
<a name="migration-steps-overview-step5"></a>

當您將 v1 類別取代為 v2 類別時，請進行必要的變更以支援 v2 API，例如使用建置器而非建構器，以及使用流暢的 getter 和 setter。

### 6. 從 POM 移除 v1 Maven 相依性，並從檔案移除 v1 匯入
<a name="migration-steps-overview-step6"></a>

遷移程式碼以使用 v2 類別後，請從檔案移除任何剩餘的 v1 匯入，並從建置檔案移除所有相依性。

### 7. 重構程式碼以使用 v2 API 增強功能
<a name="migration-steps-overview-step7"></a>

程式碼成功編譯並通過測試後，您可以利用 v2 增強功能，例如使用不同的 HTTP 用戶端或分頁程式來簡化程式碼。此為選用步驟。

## 遷移範例
<a name="migration-steps-example"></a>

在此範例中，我們會遷移使用適用於 Java v1 的 SDK 並存取數個 的應用程式 AWS 服務。我們在步驟 5 中詳細說明下列 v1 方法。這是類別中的一種方法，其中包含八個方法，應用程式中有 32 個類別。

### 要遷移的 v1 方法
<a name="v1-snippet-collapsed"></a>

只有 v1 SDK 匯入會從 Java 檔案列出如下。

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
...
private static List<Instance> getRunningInstances(AmazonEC2Client ec2, List<String> instanceIds) {
    List<Instance> runningInstances = new ArrayList<>();
    try {
        DescribeInstancesRequest request = new DescribeInstancesRequest()
                .withInstanceIds(instanceIds);
        DescribeInstancesResult result;
        do {
            // DescribeInstancesResponse is a paginated response, so use tokens with multiple requests.
            result = ec2.describeInstances(request);
            request.setNextToken(result.getNextToken());   // Prepare request for next page.
            for (final Reservation r : result.getReservations()) {
                for (final Instance instance : r.getInstances()) {
                    LOGGER.info("Examining instanceId: "+ instance.getInstanceId());
                    // if instance is in a running state, add it to runningInstances list.
                    if (RUNNING_STATES.contains(instance.getState().getName())) {
                        runningInstances.add(instance);
                    }
                }
            }
        } while (result.getNextToken() != null);
    } catch (final AmazonEC2Exception exception) {
        // if instance isn't found, assume its terminated and continue.
        if (exception.getErrorCode().equals(NOT_FOUND_ERROR_CODE)) {
            LOGGER.info("Instance probably terminated; moving on.");
        } else {
            throw exception;
        }
    }
    return runningInstances;
}
```

### 1. 新增 v2 Maven BOM
<a name="migration-steps-example-step1"></a>

將適用於 Java 的 SDK 2.x 的 Maven BOM 與 `dependencyManagement`區段中的任何其他相依性一起新增至 POM。如果您的 POM 檔案具有開發套件 v1 的 BOM，請暫時保留它。稍後的步驟會將其移除。

#### 開始時的 POM 相依性管理
<a name="migration-example-boms"></a>

```
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.example</groupId>             <!--Existing dependency in POM. -->
      <artifactId>bom</artifactId>
      <version>1.3.4</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    ...
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-bom</artifactId>  <!--Existing v1 BOM dependency. -->
      <version>1.11.1000</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    ...
    <dependency>
      <groupId>software.amazon.awssdk</groupId>  <!--Add v2 BOM dependency. -->
      <artifactId>bom</artifactId>
      <version>2.27.21</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
```

### 2. 搜尋 v1 類別匯入陳述式的檔案
<a name="migration-steps-example-step2"></a>

搜尋應用程式的程式碼，找出唯一出現的 `import com.amazonaws.services`。這有助於我們判斷專案使用的 v1 相依性。如果您的應用程式有列出 v1 相依性的 Maven POM 檔案，您可以改為使用此資訊。

在此範例中，我們使用 [`ripgrep`(rg)](https://github.com/BurntSushi/ripgrep) 命令來搜尋程式碼庫。

從程式碼基礎的根目錄，執行下列`ripgrep`命令。`ripgrep` 找到匯入陳述式後，這些陳述式會輸送至 `cut`、 `sort`和 `uniq`命令，以隔離 SERVICE\$1IDs。

```
rg --no-filename 'import\s+com\.amazonaws\.services' | cut -d '.' -f 4 | sort | uniq
```

對於此應用程式，下列 SERVICE\$1IDs會記錄到 主控台。

```
autoscaling
cloudformation
ec2
identitymanagement
```

這表示`import`陳述式中所使用的下列每個套件名稱至少都會出現一次。基於我們的目的，個別類別名稱並不重要。我們只需要尋找使用的 SERVICE\$1IDs。

```
com.amazonaws.services.autoscaling.*
com.amazonaws.services.cloudformation.*
com.amazonaws.services.ec2.*
com.amazonaws.services.identitymanagement.*
```

### 3. 從 v1 匯入陳述式判斷 v2 Maven 相依性
<a name="migration-steps-example-step3"></a>

我們從步驟 2 隔離的 v1 的 SERVICE\$1IDs，例如 `autoscaling`和 `cloudformation`，可以映射到大部分的相同 v2 SERVICE\$1ID。由於 v2 Maven artifactId 在大多數情況下都符合 SERVICE\$1ID，因此您擁有將相依性區塊新增至 POM 檔案所需的資訊。

下表顯示如何判斷 v2 相依性。


| v1 SERVICE\$1ID 映射至 ...套件名稱 | v2 SERVICE\$1ID 映射至 ...套件名稱 | v2 Maven 相依性 | 
| --- | --- | --- | 
|  **ec2** `com.amazonaws.services.ec2.*`  |  **ec2** `software.amazon.awssdk.services.ec2.*`  |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>ec2</artifactId><br /></dependency></pre>  | 
|  **自動擴展** `com.amazonaws.services.autoscaling.*`  |  **自動擴展** `software.amazon.awssdk.services.autoscaling.*`  |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>autoscaling</artifactId><br /></dependency></pre>  | 
| cloudformation`com.amazonaws.services.cloudformation.*` | cloudformation`software.amazon.awssdk.cloudformation.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>cloudformation</artifactId><br /></dependency></pre>  | 
| 身分管理\$1`com.amazonaws.services.identitymanagement.*` | iam\$1`software.amazon.awssdk.iam.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>iam</artifactId><br /></dependency></pre>  | 

\$1 `identitymanagement``iam`映射的 是例外狀況，其中 SERVICE\$1ID 在版本之間不同。如果 Maven 或 Gradle 無法解析 v2 相依性，請參閱 [Maven artifactId 映射的套件名稱](#migration-serviceid-artifactid-mapping) 以取得例外狀況。

### 4. 將 v2 相依性元素新增至 POM 檔案
<a name="migration-steps-example-step4"></a>

在步驟 3 中，我們決定了需要新增到 POM 檔案的四個相依性區塊。我們不需要新增版本，因為我們已在步驟 1 中指定 BOM。新增匯入後，我們的 POM 檔案具有下列相依性元素。

```
    ...
  <dependencies>
    ...
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>autoscaling</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>iam</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>cloudformation</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>ec2</artifactId>
    </dependency>
    ...
  </dependencies>
    ...
```

### 5. 在 Java 檔案中，在 v1 類別上逐漸變更為 v2 類別
<a name="migration-steps-example-step5"></a>

在我們遷移的方法中，我們會看到
+ 來自 的 EC2 服務用戶端`com.amazonaws.services.ec2.AmazonEC2Client`。
+ 使用的數個 EC2 模型類別。例如 `DescribeInstancesRequest`和 `DescribeInstancesResult`。

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
...
private static List<Instance> getRunningInstances(AmazonEC2Client ec2, List<String> instanceIds)
    List<Instance> runningInstances = new ArrayList<>();
    try {
        DescribeInstancesRequest request = new DescribeInstancesRequest()
                .withInstanceIds(instanceIds);
        DescribeInstancesResult result;
        do {
            // DescribeInstancesResponse is a paginated response, so use tokens with multiple re
            result = ec2.describeInstances(request);
            request.setNextToken(result.getNextToken());   // Prepare request for next page.
            for (final Reservation r : result.getReservations()) {
                for (final Instance instance : r.getInstances()) {
                    LOGGER.info("Examining instanceId: "+ instance.getInstanceId());
                    // if instance is in a running state, add it to runningInstances list.
                    if (RUNNING_STATES.contains(instance.getState().getName())) {
                        runningInstances.add(instance);
                    }
                }
            }
        } while (result.getNextToken() != null);
    } catch (final AmazonEC2Exception exception) {
        // if instance isn't found, assume its terminated and continue.
        if (exception.getErrorCode().equals(NOT_FOUND_ERROR_CODE)) {
            LOGGER.info("Instance probably terminated; moving on.");
        } else {
            throw exception;
        }
    }
    return runningInstances;
}
...
```

我們的目標是將所有 v1 匯入取代為 v2 匯入。我們會一次繼續一個類別。

#### a. 取代匯入陳述式或類別名稱
<a name="migration-example-step5-substep1"></a>

我們看到 `describeRunningInstances`方法的第一個參數是 v1 `AmazonEC2Client`執行個體。執行以下任意一項：
+ 將 的匯入取代`com.amazonaws.services.ec2.AmazonEC2Client`為 `software.amazon.awssdk.services.ec2.Ec2Client`，並`AmazonEC2Client`變更為 `Ec2Client`。
+ 將參數類型變更為 ，`Ec2Client`並讓 IDE 提示我們正確匯入。我們的 IDE 會提示我們匯入 v2 類別，因為用戶端名稱不同 -`AmazonEC2Client` 和 `Ec2Client`。如果兩個版本中的類別名稱相同，則此方法無法運作。

#### b. 將 v1 模型類別取代為 v2 對等項目
<a name="migration-example-step5-substep2"></a>

變更 v2 之後`Ec2Client`，如果我們使用 IDE，我們會在下列陳述式中看到編譯錯誤。

```
                    result = ec2.describeInstances(request);
```

編譯錯誤是因為使用 v1 的 執行個體`DescribeInstancesRequest`做為 v2 `Ec2Client``describeInstances`方法的參數。若要修正，請進行下列取代或匯入陳述式。


| 取代 | 取代為 | 
| --- | --- | 
|  <pre>import com.amazonaws.services.ec2.model.DescribeInstancesRequest</pre>  |  <pre>import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest</pre>  | 

#### c. 將 v1 建構器變更為 v2 建置器。
<a name="migration-example-step5-substep3"></a>

我們仍然看到編譯錯誤，因為 [v2 類別上沒有建構函數](migration-whats-different.md#immutable-classes)。若要修正，請進行下列變更。


| 變更 | 至 | 
| --- | --- | 
|  <pre>final DescribeInstancesRequest request = new DescribeInstancesRequest()<br />        .withInstanceIds(instanceIdsCopy);</pre>  |  <pre>final DescribeInstancesRequest request = DescribeInstancesRequest.builder()<br />        .instanceIds(instanceIdsCopy)<br />        .build();</pre>  | 

#### d. 將 v1 `*Result`回應物件取代為 v2 對`*Response`等項目
<a name="migration-example-step5-substep4"></a>

v1 和 v2 之間的一致差異是 [v2 中的所有回應物件都以 結尾，`*Response`而不是 `*Result`](migration-whats-different.md#model-classname-changes)。將 v1 `DescribeInstancesResult`匯入取代為 v2 匯入，`DescribeInstancesResponse`。

#### d. 進行 API 變更
<a name="migration-example-step5-substep5"></a>

下列陳述式需要一些變更。

```
request.setNextToken(result.getNextToken());
```

在 v2 中，[設定程式方法](migration-whats-different.md#setter-getter-methods)不使用 `set`或 搭配 `prefix`。字首`get`為 的 Getter 方法也會出現在適用於 Java 的 SDK 2.x 中

`request` 執行個體等模型類別在 v2 中是不可變的，因此我們需要使用`DescribeInstancesRequest`建置器建立新的 。

在 v2 中， 陳述式會變成以下內容。

```
request = DescribeInstancesRequest.builder()
        .nextToken(result.nextToken())
        .build();
```

#### d. 重複此動作，直到方法編譯為 v2 類別
<a name="migration-example-step5-substep6"></a>

繼續執行其餘的程式碼。將 v1 匯入取代為 v2 匯入並修正編譯錯誤。如有需要，請參閱 [v2 API 參考](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/ec2/package-summary.html)和[什麼是不同的參考](migration-whats-different.md)。

遷移此單一方法後，我們有下列 v2 程式碼。

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;

import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
import software.amazon.awssdk.services.ec2.model.Instance;
import software.amazon.awssdk.services.ec2.model.Reservation;
...
private static List<Instance> getRunningInstances(Ec2Client ec2, List<String> instanceIds) {
    List<Instance> runningInstances = new ArrayList<>();
        try {
            DescribeInstancesRequest request = DescribeInstancesRequest.builder()
                    .instanceIds(instanceIds)
                    .build();
            DescribeInstancesResponse result;
            do {
                // DescribeInstancesResponse is a paginated response, so use tokens with multiple re
                result = ec2.describeInstances(request);
                request = DescribeInstancesRequest.builder()   // Prepare request for next page.
                        .nextToken(result.nextToken())
                        .build();
                for (final Reservation r : result.reservations()) {
                    for (final Instance instance : r.instances()) {
                        // if instance is in a running state, add it to runningInstances list.
                        if (RUNNING_STATES.contains(instance.state().nameAsString())) {
                            runningInstances.add(instance);
                        }
                    }
                }
            } while (result.nextToken() != null);
        } catch (final Ec2Exception exception) {
            // if instance isn't found, assume its terminated and continue.
            if (exception.awsErrorDetails().errorCode().equals(NOT_FOUND_ERROR_CODE)) {
                    LOGGER.info("Instance probably terminated; moving on.");
            } else {
                throw exception;
            }
        }
        return runningInstances;
    }
...
```

由於我們正在以八種方法遷移 Java 檔案中的單一方法，因此在處理檔案時，我們會混合使用 v1 和 v2 匯入。我們在執行步驟時新增了最後六個匯入陳述式。

遷移所有程式碼後，將不再有 v1 匯入陳述式。

### 6. 從 POM 移除 v1 Maven 相依性，並從檔案移除 v1 匯入
<a name="migration-steps-example-step6"></a>

遷移 檔案中的所有 v1 程式碼後，我們會有下列 v2 SDK 匯入陳述式。

```
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.ServiceMetadata;
import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.CreateTagsRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
import software.amazon.awssdk.services.ec2.model.Instance;
import software.amazon.awssdk.services.ec2.model.InstanceStateName;
import software.amazon.awssdk.services.ec2.model.Reservation;
import software.amazon.awssdk.services.ec2.model.Tag;
import software.amazon.awssdk.services.ec2.model.TerminateInstancesRequest;
```

遷移應用程式*中的所有*檔案後，我們不再需要 POM 檔案中的 v1 相依性。如果使用 和所有 v1 相依性區塊，請從 `dependencyManagement`區段移除 v1 BOM。

### 7. 重構程式碼以使用 v2 API 增強功能
<a name="migration-steps-example-step7"></a>

對於我們遷移的程式碼片段，我們可以選擇性地使用 v2 分頁程式，並讓 SDK 管理更多資料的字符型請求。

我們可以將整個 `do` 子句取代為以下內容。

```
                DescribeInstancesIterable responses = ec2.describeInstancesPaginator(request);

                responses.reservations().stream()
                        .forEach(reservation -> reservation.instances()
                                .forEach(instance -> {
                                    if (RUNNING_STATES.contains(instance.state().nameAsString())) {
                                        runningInstances.put(instance.instanceId(), instance);
                                    }
                                }));
```

## Maven artifactId 映射的套件名稱
<a name="migration-serviceid-artifactid-mapping"></a>

當您將 Maven 或 Gradle 專案從適用於 Java 的 SDK v1 遷移至 v2 時，您需要找出要新增至建置檔案的相依性。[遷移step-by-step說明與範例](#migration-steps) （步驟 3) 中所述的方法使用匯入陳述式中的套件名稱做為起點，以決定要新增至建置檔案的相依性 （做為 artifactIds)。

您可以使用本主題中的資訊，將 v1 套件名稱對應至 v2 artifactIds。

### 套件名稱和 Maven artifactIds 中使用的常見命名慣例
<a name="migration-naming-convention"></a>

下表顯示 SDKs用於指定 SERVICE\$1ID 的常見命名慣例。SERVICE\$1ID 是 的唯一識別符 AWS 服務。例如，Amazon S3 服務的 SERVICE\$1ID 是 `s3`，而 `cognitoidentity` 是 Amazon Cognito Identity 的 SERVICE\$1ID。


| v1 套件名稱 （匯入陳述式） | v1 artifactId | v2 artifactId | v2 套件名稱 （匯入陳述式） | 
| --- | --- | --- | --- | 
| com.amazonaws.services.SERVICE\$1ID | aws-java-sdk-SERVICE\$1ID | SERVICE\$1ID | software.amazon.awssdk.services.SERVICE\$1ID | 
|   | 
| Amazon Cognito Identity (SERVICE\$1ID：cognitoidentity) 的範例 | 
| com.amazonaws.services.cognitoidentity | aws-java-sdk-cognitoidentity | cognitoidentity | software.amazon.awssdk.services.cognitoidentity | 

### SERVICE\$1ID 差異
<a name="migration-serviceid-diffs"></a>

#### 在 v1 內
<a name="migration-serviceid-diffs-withinv1"></a>

在某些情況下，相同服務的套件名稱和 artifactId 中的 SERVICE\$1ID 會有所不同。例如，下表的 CloudWatch Metrics 資料列顯示 `metrics`是套件名稱中的 SERVICE\$1ID，但 `cloudwatchmetrics`是 artifactId 的 SERVICE\$1ID。

#### 在 v2 內
<a name="migration-serviceid-diffs-withinv2"></a>

套件名稱和 artifactIds 中使用的 SERVICE\$1ID 沒有差異。

#### 在 v1 和 v2 之間
<a name="migration-serviceid-diffs-btwv1v2"></a>

對於大多數服務，v2 中的 SERVICE\$1ID 與套件名稱和 artifactIds 中的 v1 的 SERVICE\$1ID 相同。其中一個範例是 `cognitoedentity` SERVICE\$1ID，如上表所示。不過，某些 SERVICE\$1IDs會因 SDKs 而有所不同，如下表所示。

任一 v1 資料欄中的**粗體 SERVICE\$1ID** 表示它與 v2 中使用的 SERVICE\$1ID 不同。


| 服務名稱 | v1 套件名稱 | v1 artifactId | v2 artifactId | v2 套件名稱 | 
| --- | --- | --- | --- | --- | 
|  |  所有套件名稱都以 開頭`com.amazonaws.services`，如第一列所示。  |  所有 artifactIds都包含在標籤中，如第一列所示。  |  所有 artifactIds都包含在標籤中，如第一列所示。  |  所有套件名稱都以 開頭`software.amazon.awssdk`，如第一列所示。  | 
|  | 
| API Gateway | com.amazonaws.services.apigateway | <artifactId>aws-java-sdk-api-gateway</artifactId> | <artifactId>apigateway</artifactId> | software.amazon.awssdk.services.apigateway | 
| 應用程式登錄檔 | appregistry | appregistry | servicecatalogappregistry | servicecatalogappregistry | 
| Application Discovery | applicationdiscovery | 探索 | applicationdiscovery | applicationdiscovery | 
| 增強版 AI 執行期 | augmentedairuntime | augmentedairuntime | sagemakera2iruntime | sagemakera2iruntime | 
| Certificate Manager | certificatemanager | acm | acm | acm | 
| CloudControl API | cloudcontrolapi | cloudcontrolapi | cloudcontrol | cloudcontrol | 
| CloudSearch | cloudsearchv2 | cloudsearch | cloudsearch | cloudsearch | 
| CloudSearch 網域 | cloudsearchdomain | cloudsearch | cloudsearchdomain | cloudsearchdomain | 
| CloudWatch Events | cloudwatchevents | 事件 | cloudwatchevents | cloudwatchevents | 
| CloudWatch Evidently | cloudwatch 顯而易見 | cloudwatch 明顯地 | evidently | evidently | 
| CloudWatch Logs | logs | logs | cloudwatchlogs | cloudwatchlogs | 
| CloudWatch Metrics | 指標 | cloudwatchmetrics | cloudwatch | cloudwatch | 
| CloudWatch Rum | cloudwatchrum | cloudwatchrum | rum | rum | 
| Cognito 身分提供者 | cognitoidp | cognitoidp | cognitoidentityprovider | cognitoidentityprovider | 
| Connect 行銷活動 | connectcampaign | connectcampaign | 連線行銷活動 | 連線行銷活動 | 
| Connect Wisdom | connectwisdom | connectwisdom | wisdom | wisdom | 
| 資料庫遷移服務 | databasemigrationservice | dms | 資料庫遷移 | 資料庫遷移 | 
| DataZone | 資料區域 | datazoneexternal | 資料區域 | 資料區域 | 
| DynamoDB | dynamodbv2 | dynamodb | dynamodb | dynamodb | 
| 彈性檔案系統 | elasticfile 系統 | efs | efs | efs | 
| 彈性映射減少 | elasticmapreduce | emr | emr | emr | 
| Glue DataBrew | gluedatabrew | gluedatabrew | databrew | databrew | 
| IAM Roles Anywhere | iamrolesanywhere | iamrolesanywhere | rolesanywhere | rolesanywhere | 
| 身分管理 | 身分管理 | iam | iam | iam | 
| IoT 資料 | iotdata | iot | iotdataplane | iotdataplane | 
| Kinesis Analytics | kinesisanalytics | kinesis | kinesisanalytics | kinesisanalytics | 
| Kinesis Firehose | kinesisfirehose | kinesis | firehose | firehose | 
| Kinesis Video Signaling 頻道 | kinesisvideosignaling 頻道 | kinesisvideosignaling 頻道 | kinesisvideosignaling | kinesisvideosignaling | 
| Lex | lexruntime | lex | lexruntime | lexruntime | 
| 注視視覺 | lookoutforvision | lookoutforvision | lookoutvision | lookoutvision | 
| 大型主機現代化 | 大型主機模式 | 大型主機模式 | m2 | m2 | 
| Marketplace 計量 | 市場計量 | Marketplacemeteringservice | 市場計量 | 市場計量 | 
| 受管 Grafana | 受管格拉法納 | 受管格拉法納 | grafana | grafana | 
| 機械 Turk | 泥濘 | Mechanicalturkrequester | 泥濘 | 泥濘 | 
| Migration Hub 策略建議 | migrationhubstrategyrecommendations | migrationhubstrategyrecommendations | migrationhubstrategy | migrationhubstrategy | 
| Nimble Studio | nimblestudio | nimblestudio | nimble | nimble | 
| 私有 5G | private5g | private5g | 私有網路 | 私有網路 | 
| Prometheus | prometheus | prometheus | amp | amp | 
| 資源回收筒 | 資源回收筒 | 資源回收筒 | rbin | rbin | 
| Redshift 資料 API | redshiftdataapi | redshiftdataapi | redshiftdata | redshiftdata | 
| Route 53 | route53網域 | route53 | route53網域 | route53網域 | 
| Sage Maker Edge Manager | sagemakeredgemanager | sagemakeredgemanager | sagemakeredge | sagemakeredge | 
| 安全字符 | securitytoken | sts | sts | sts | 
| 伺服器遷移 | 伺服器遷移 | 伺服器遷移 | sms | sms | 
| 簡易電子郵件 | simpleemail | ses | ses | ses | 
| 簡易電子郵件 V2 | simpleemailv2 | sesv2 | sesv2 | sesv2 | 
| 簡易系統管理 | Simplesystems 管理 | ssm | ssm | ssm | 
| 簡單工作流程 | Simpleworkflow | Simpleworkflow | swf | swf | 
| 步驟函數 | 步驟函數 | 步驟函數 | sfn | sfn | 