

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for Java 移行ツール
<a name="migration-tool"></a>

AWS SDK for Java は、SDK for Java 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) の高レベルライブラリのコード変更ルールをサポートしています。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) など、他の高レベル API のコード変更ルールはサポートされていません。

制限の詳細については、[このページの最後](#migration-tool-limitations)の部分を参照してください。サポートされていない一般的なコードパターンの詳細と手動による移行手順については、「[サポートされていないコードパターン](migration-tool-unsupported-patterns.md)」を参照してください。

## 移行ツールを使用する
<a name="migration-tool-use"></a>

### Maven プロジェクトを移行する
<a name="migration-tool-use-maven"></a>

[OpenRewrite Maven プラグインツール](https://docs.openrewrite.org/reference/rewrite-maven-plugin)を使用して SDK for Java 1.x Maven ベースのプロジェクトを移行するには、次の手順に従ってください。

1. Maven プロジェクトのルートディレクトリに移動します。

   ターミナル (コマンドライン) ウィンドウを開き、Maven ベースのアプリケーションのルートディレクトリに移動します。

1. プラグインの `rewrite-maven-plugin` コマンドを実行する

   `dryRun` と `run` の、2 つのモード (Maven の目標) から選択できます。

   **`dryRun`**** モード**

   `dryRun` モードでは、プラグインはコンソール出力に差分ログを生成し、 `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*<sdkversion>* を 2.x SDK バージョンに置き換えます。[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 プラグイン](https://docs.openrewrite.org/reference/gradle-plugin-configuration)ツールを使用して SDK for Java 1.x Gradle ベースのプロジェクトを移行するには、次の手順に従ってください。

1. プロジェクトのルートディレクトリに移動します。

   ターミナル (コマンドライン) ウィンドウを開き、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 プラグインと同様に、Gradle プラグインを `dryRun` または `run` モードで実行できます。

   **`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>

移行では、コード変更ルールによってほとんどの V1 コードを V2 の同等コードに移行できますが、一部のクラスとメソッドは移行できません。これらのクラスとメソッドについては、[ステップバイステップの手順](migration-steps.md)に従って、コードを手動で移行します。

サポートされていないコード変更ルールによっては、移行ツールに次の文で始まるコメントが表示される場合があります。

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

コメントの後、ツールには メソッドまたはクラスの V2 バージョンの汎用スタブが出力されます。たとえば、次の出力では、移行ツールが 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 クライアントの違い AWS SDK for Java](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 Policy Builder](migration-iam-policy-builder.md) (Policy)
+ [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 に自動的に変換します。ただし、一部のコードパターンでは手動による移行が必要です。このトピックでは、サポートされていない最も一般的なパターンの詳細な例と、それらを手動で変換する方法を示します。

以下のパターンリストは完全なものではありません。移行ツールの実行後にコードがコンパイルされない場合は、「[ステップバイステップの移行手順](migration-steps.md)」に従って、残りの v1 コードを手動で移行してください。

## パラメータを持つリクエストオブジェクトコンストラクタ
<a name="request-pojo-constructors"></a>

リクエスト POJO (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");
```

移行後 (移行ツールの結果)

```
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");
```

移行後 (移行ツールの結果 - コンパイルされません)

```
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);
```

移行後 (移行ツールの結果 - コンパイルされません)

```
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);
```

移行後 (移行ツールの結果 - コンパイルされません)

```
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();
```