

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

# のバージョン 1.x から 2.x への移行 AWS SDK for Java
<a name="migration"></a>

 AWS SDK for Java 2.x は、Java 8 以降上に構築された 1.x コードベースの大幅な書き換えです。これには、整合性と使いやすさの向上や強力に改善されたイミュータブル性などの多くの更新が含まれています。このセクションでは、バージョン 2.x の主な新機能の説明、およびバージョン 1.x から 2.x にコードを移行する方法についてのガイダンスが用意されています。

**Topics**
+ [バージョン 2 の新機能](#migration-whats-new)
+ [1.x クライアントを使用してアプリケーションを検索する](migration-find-apps-using-v1.md)
+ [移行方法](migration-howto.md)
+ [1.x と 2.x の相違点](migration-whats-different.md)
+ [SDK for Java 1.x と 2.x を並行して使用する](migration-side-by-side.md)

## バージョン 2 の新機能
<a name="migration-whats-new"></a>
+ 独自の HTTP クライアントを設定できます。「[HTTP transport configuration](http-configuration.md)」を参照してください。
+ 非同期クライアントは、ノンブロッキング I/O をサポートし、`CompletableFuture`オブジェクトを返します。[非同期プログラミング](asynchronous.md)を参照してください。
+ 複数ページを返すオペレーションには、自動ページ分割レスポンスがあります。これにより、後続のページを確認して取得する必要がなくなり、レスポンスをどのように処理するかのコードに集中できます。「[ページ分割](pagination.md)」を参照してください。
+  AWS Lambda 関数の SDK 開始時間のパフォーマンスが向上しました。「[SDK start time performance improvements](lambda-optimize-starttime.md)」を参照してください。
+ バージョン 2.x は、リクエストを作成するための、新しい簡易的な方法をサポートします。  
**Example**  

  ```
  dynamoDbClient.putItem(request -> request.tableName(TABLE))
  ```

新機能の詳細と特定のコード例については、このガイドの他のセクションを参照してください。
+  [クイックスタート](get-started.md) 
+  [セットアップ](setup.md) 
+  [AWS SDK for Java 2.x のコード例 ](java_code_examples.md)
+  [SDK を使用する](using.md) 
+  [のセキュリティ AWS SDK for Java](security.md) 

# AWS SDK for Java 1.x クライアントを使用してアプリケーションを検索する
<a name="migration-find-apps-using-v1"></a>

に移行する前に AWS SDK for Java 2.x、環境内のどのアプリケーションが SDK for Java 1.x クライアントを使用しているかを特定する必要があります。CloudTrail ログを使用して、SDK の使用状況を追跡したり、アプリケーションログで非推奨の警告を検索したり、ソースコードとビルド設定を調べたり、デプロイ可能な Java アーティファクトを調べたりできます。環境で使用可能なメソッドを使用します。

## CloudTrail Lake を使用して 1.x クライアントでアプリケーションを検索する
<a name="migration-find-v1-apps-with-cloudtrail"></a>

AWS CloudTrail Lake では、CloudTrail によって記録されたイベントをクエリできます。アプリケーションで使用される SDK バージョンを識別するデータレイクを作成するには、次の手順に従ってください。

1. CloudTrail データレイクを作成します。イベントデータストアを作成するには、[ユーザーガイド](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-event-data-store.html)を参照してください。

1. データストアを作成したら、レコードの内容を調べます。レコード本文には、リクエストされたアクション、日次、場所を示すフィールドが含まれています。詳細については、[CloudTrail レコードコンテンツのユーザーガイド](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)を参照してください。

1. データに対してクエリを実行します。[ユーザーガイドに従ってクエリを実行し、クエリ結果を保存します](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-run-query.html)。

各レコードの *[userAgent]* フィールドには、リクエストを行った SDK バージョンが含まれています。このフィールドを使用して、SDK for Java 1.x を使用するアプリケーションを識別します。

次のサンプルクエリは、EventDatastoreID の 2025 年 6 月 17 日以降に SDK for Java 1.x で行われたユーザーアプリケーションおよびサードパーティーツールからのすべてのリクエストを検索します`sample-Data-Store-Id`。

```
select userIdentity, eventSource, awsRegion,
    eventName, eventType, eventTime, userAgent,
    requestParameters, sourceIPAddress
 from sample-Data-Store-Id
where eventTime > '2025-06-17 00:00:00'
and userAgent like '%aws-sdk-java/1.%'
and userAgent not like '%aws-internal/%'
order by eventTime desc
```

以下は、クエリ結果のイベントコンテンツの例です。

```
{
    "userIdentity": "{
         "type": "IAMUser",
         "principalId": "AIDAJ45Q7YFFAREXAMPLE",
         "arn": "arn:aws:iam::123456789012:user/Alice",
         "accountId": "123456789012",
         "accessKeyId": "",
         "userName": "Alice"
    }",
    "eventSource": "dynamodb.amazonaws.com",
    "awsRegion": "us-west-2",
    "eventName": "ListTables",
    "eventType": "AwsApiCall",
    "eventTime": "2025-07-01 02:23:52.000",
    "userAgent": "aws-sdk-java/1.12.746 Linux/5.10.240 OpenJDK/11.0.25+9-LTS ...",
    "requestParameters": "",
    "sourceIPAddress": "12.345.6.78"
}
```

この情報を使用して、リクエストが行われた日時と場所を判断できます。

この例では、Alice という名前の IAM ユーザー認証情報を使用して、IP アドレス `12.345.6.78` から `2025-07-01 02:23:52 (UTC)` に DynamoDB `ListTables` リクエストが行われています。*userAgent* フィールドの値は、JDK 11 を使用する `1.12.746` Linux システムから AWS SDK for Java のバージョンを使用してリクエストが行われたことを示します。

 AWS CloudTrail イベントレコードのフィールドの説明については、[CloudTrail record contents for management, data, and network activity events](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)」を参照してください。

アカウントで CloudTrail が有効になっていない場合は、組織の AWS アカウント管理者に連絡して有効にするか、次のセクションで説明する代替方法のいずれかを使用します。

CloudTrail Lake は、クエリごとに取り込まれたデータとスキャンされたデータに対して課金されます。コストを最小限に抑えるには、クエリを特定の時間範囲とリージョンにフィルタリングします。現在の料金については、「[AWS CloudTrail 料金表](https://aws.amazon.com/cloudtrail/pricing/)」を参照してください。

## SDK 非推奨のアプリケーション警告レベルのログを検索する
<a name="migration-find-v1-apps-log-warning"></a>

バージョン 1.12.767 (2024 年 7 月 30 日にリリース) 以降、 AWS SDK for Java 1.x はアプリケーションの起動時に非推奨警告を発行します。この警告のアプリケーションログを検索して、SDK for Java 1.x を使用しているアプリケーションとホストを特定できます。

警告の正確な表現は SDK バージョンによって異なります。
+ バージョン 1.12.767 から 1.12.796:

  `WARNING: The AWS SDK for Java 1.x entered maintenance mode starting July 31, 2024 and will reach end of support on December 31, 2025...`
+ バージョン 1.12.797 以降:

  `WARNING: The AWS SDK for Java 1.x reached end of support on December 31, 2025...`

末尾は、警告メッセージが追加のテキストで続く`...`ことを示します。共通プレフィックスを検索`The AWS SDK for Java 1.x`して、いずれかのバージョンの警告を検索できます。

次の例は、 を使用してこの警告を検索する方法を示しています`grep`。

```
grep -r "The AWS SDK for Java 1.x" /path/to/your/application/logs/
```

警告が見つかった場合、`grep`コマンドは一致するログ行を出力します。警告が見つからない場合は、アプリケーションが SDK for Java 1.x を使用していないか、1.12.767 より前のバージョンを使用しています。その場合は、このドキュメントで説明されている他の方法のいずれかを使用します。

## ソースコードと依存関係を検索する
<a name="migration-find-v1-apps-source-code"></a>

コードベースとビルド設定ファイルで AWS SDK for Java 1.x への参照を検索できます。キー識別子は、すべての SDK for Java 1.x アーティファクトで使用される`com.amazonaws`グループ ID です。

次の例は`grep`、 を使用して一般的な Java プロジェクトファイル全体の`com.amazonaws`リファレンスを検索する方法を示しています。

**例: SDK for Java 1.x インポートの Java ソースファイルを検索する (プロジェクトのルートディレクトリから実行)**

```
grep -r "import com.amazonaws" --include="*.java" .
```

出力の例:

```
src/main/java/com/example/App.java:import com.amazonaws.services.s3.AmazonS3;
```

**注記**  
`com.amazonaws` パッケージは、 などの SDK for Java 1.x に含まれていないライブラリでも使用されます`aws-lambda-java-core`。インポートが SDK for Java 1.x からのものであることを確認するには、`pom.xml`、、`build.gradle`または依存関係管理設定の対応するアーティファクト ID が で始まることを確認します`aws-java-sdk-`。

**例: Maven `pom.xml` ファイルで SDK for Java 1.x の依存関係を検索する (プロジェクトのルートディレクトリから実行)**

```
grep -r "com.amazonaws" --include="pom.xml" .
```

出力の例:

```
pom.xml:    <groupId>com.amazonaws</groupId>
```

**例: SDK for Java 1.x 依存関係の Gradle ビルドファイルを検索する (プロジェクトのルートディレクトリから実行)**

```
grep -r "com.amazonaws:aws-java-sdk" --include="*.gradle" .
```

出力の例:

```
build.gradle:    implementation 'com.amazonaws:aws-java-sdk-s3:1.12.xxx'
```

上記の`grep`コマンドは、ソースファイルとビルドファイルで直接宣言された SDK for Java 1.x リファレンスを識別します。ただし、アプリケーションは SDK for Java 1.x に推移的に依存している場合もあります。これは、SDK 自体に依存するサードパーティーのライブラリを通じて行われます。ビルドツールの依存関係ツリーを使用して、直接 SDK for Java 1.x 依存関係と推移的 SDK for Java 1.x 依存関係の両方を検索します。ビルドシステムに一致する例を選択します。

**例: Maven を使用してすべての推移的な SDK for Java 1.x 依存関係を検索する (プロジェクトのルートディレクトリから実行)**

```
mvn dependency:tree -Dincludes=com.amazonaws
```

出力の例:

```
[INFO] com.example:my-application:jar:1.0-SNAPSHOT
[INFO] +- com.amazonaws:aws-java-sdk-s3:jar:1.12.746:compile
[INFO] |  \- com.amazonaws:aws-java-sdk-core:jar:1.12.746:compile
[INFO] \- some.thirdparty:library:jar:2.3.1:compile
[INFO]    \- com.amazonaws:aws-java-sdk-dynamodb:jar:1.12.600:compile
```

`-Dincludes=com.amazonaws` フラグはツリーをフィルタリングして、SDK for Java 1.x アーティファクトのみを表示します。この例では、 `aws-java-sdk-s3`は直接的な依存関係ですが、 によってもたらされる推移的な依存関係`aws-java-sdk-dynamodb`です`some.thirdparty:library`。

**例: Gradle を使用して、すべての推移的な SDK for Java 1.x 依存関係を検索する (プロジェクトのルートディレクトリから実行)**

```
gradle dependencies --configuration runtimeClasspath | grep "com.amazonaws"
```

出力の例:

```
+--- com.amazonaws:aws-java-sdk-s3:1.12.746
|    \--- com.amazonaws:aws-java-sdk-core:1.12.746
\--- com.amazonaws:aws-java-sdk-dynamodb:1.12.600
```

Gradle には Maven の と同等の依存関係フィルターが組み込まれていないため`-Dincludes`、パイプスルーが最も簡単なアプローチ`grep`です。

## デプロイ可能な Java アーティファクトを検査する
<a name="migration-find-v1-apps-inspect-artifacts"></a>

デプロイ可能な Java アーティファクト (JARs、WARs、または EARs) を検査し、 AWS SDK for Java 1.x がアプリケーションにパッケージ化されているかどうかを確認できます。Java アーカイブファイルは ZIP 形式のファイルです。SDK for Java 1.x が存在するかどうかを判断するには、アーカイブ`com/amazonaws/sdk/versionInfo.properties`内の ファイルを探します。このファイルは `aws-java-sdk-core`モジュールに含まれ、SDK バージョン番号が含まれています。

### `jar` コマンドを使用したクイックチェック
<a name="migration-find-v1-apps-jar-command"></a>

すべての依存関係クラスが最上位レベルでマージされる uber-jar の場合、アーカイブコンテンツを一覧表示し、バージョンファイルを検索します。

次の例では、 をアプリケーションの JAR ファイルへのパス`myapp.jar`に置き換えます。

```
jar -tf myapp.jar | grep 'versionInfo.properties'
```

SDK が存在する場合、出力は次のとおりです。

```
com/amazonaws/sdk/versionInfo.properties
```

`jar` コマンドが環境で使用できない場合 (JRE 専用または最小限のコンテナイメージなど）、`unzip -l`代わりに を使用できます。

```
unzip -l myapp.jar | grep 'versionInfo.properties'
```

バージョンを出力するには:

```
unzip -p myapp.jar com/amazonaws/sdk/versionInfo.properties
```

出力の例:

```
platform=java
version=1.12.xxx
```

**注記**  
上記のコマンドは、uber-jars の最上位エントリのみを検索します。SDK クラスはJARs (依存関係が外部) またはネストされた JARs (WARs、EARs`lib/`または または の Lambda パッケージなど) 内では見つかりません`WEB-INF/lib/`。シン JARs の場合は、代わりにビルド設定 (`pom.xml`、`build.gradle`) または依存関係ツリーを確認してください。ネストされた JARs の場合は、ディスクに抽出せずに ZIP アーカイブを再帰的に読み取ることができるツールを使用して、バンドルされた JARs を検索します。

# コードを AWS SDK for Java 1.x から 2.x に移行する方法
<a name="migration-howto"></a>

既存の SDK for Java 1.x アプリケーションは、いくつかの方法で移行できます。

1. [移行ツール](migration-tool.md)を使用した自動化されたアプローチ。

1. 1.x インポートを 2.x インポートに段階的に置き換える[手動アプローチ](migration-steps.md)。

最初に移行ツールを使用することをお勧めします。これにより、1.x から 2.x コードへのルーティン的な置換作業の多くが自動化されます。

ツールは[すべての機能を移行するわけではない](migration-tool.md#migration-tool-limitations)ため、ツールの実行後に残りの v1 コードを検索する必要があります。ツールによって移行されなかったコードを見つけたら、[ステップバイステップの手順](migration-steps.md) (手動アプローチ) に従い、[移行ガイドの記事](migration-whats-different.md)を使用して移行を完了してください。

**Topics**
+ [移行ツール](migration-tool.md)
+ [ステップバイステップの手順](migration-steps.md)

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

# ステップバイステップの移行手順
<a name="migration-steps"></a>

このセクションでは、現在 SDK for Java v1.x を使用しているアプリケーションを SDK for Java 2.x に移行するためのステップバイステップガイドを提供します。最初のパートでは、手順の概要と移行の詳細な例を示します。

ここで説明するステップでは、アプリケーションがモデル駆動型サービスクライアント AWS のサービス を使用して を呼び出す通常のユースケースの移行について説明します。[S3 Transfer Manager](migration-s3-transfer-manager.md) や [CloudFront 事前署名](migration-cloudfront-presigning.md)などの上位レベルの API を使用するコードを移行する必要がある場合は、[AWS SDK for Java 1.x と 2.x の違い](migration-whats-different.md) の目次内のセクションを参照してください。



ここで説明するアプローチは提案です。他の手法を使用し、IDE のコード編集機能を活用して同じ結果を得ることができます。

## 手順の概要
<a name="migration-steps-overview"></a>

### 1. SDK for Java 2.x BOM の追加から始める
<a name="migration-steps-overview-step1"></a>

SDK for Java 2.x の Maven BOM (部品表) 要素を POM ファイルに追加することで、必要なすべての v2 依存関係が同一バージョンになります。POM には、v1 と v2 の両方の依存関係を含めることができます。これにより、コードを一度にすべて変更するのではなく、段階的に移行できます。

#### SDK for Java 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 リポジトリで[最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)を検索してください。

### 2. v1 クラスインポートステートメントのファイルを検索する
<a name="migration-steps-overview-step2"></a>

アプリケーションのファイルをスキャンして v1 インポートで使用される SERVICE\$1ID を調べると、使用される一意の SERVICE\$1ID が見つかります。SERVICE\$1ID は、 の短い一意の名前です AWS のサービス。例えば、`cognitoidentity` はAmazon Cognito ID の SERVICE\$1ID です。

### 3. v1 インポートステートメントから v2 Maven の依存関係を特定する
<a name="migration-steps-overview-step3"></a>

一意の v1 SERVICE\$1ID がすべて見つかったら、[パッケージ名から Maven artifactId へのマッピング](#migration-serviceid-artifactid-mapping) を参照して、v2 の依存関係に対応する Maven アーティファクトを特定できます。

### 4. POM ファイルに v2 依存関係要素を追加する
<a name="migration-steps-overview-step4"></a>

ステップ 3 で特定した依存関係要素で Maven POM ファイルを更新します。

### 5. Java ファイルで、v1 クラスを v2 クラスに段階的に変更する
<a name="migration-steps-overview-step5"></a>

v1 クラスを v2 クラスに置き換えるときは、コンストラクタの代わりにビルダーを使用する、Fluent ゲッターやセッターを使用するなど、v2 API をサポートするために必要な変更を加えます。

### 6. POM から v1 Maven の依存関係を削除し、ファイルから v1 インポートを削除する
<a name="migration-steps-overview-step6"></a>

v2 クラスを使用するようにコードを移行したら、ファイルからの v1 の残りのインポートと、ビルドファイルからのすべての依存関係を削除します。

### 7. v2 API の拡張機能を使用するようにコードをリファクタリングする
<a name="migration-steps-overview-step7"></a>

コードが正常にコンパイルされてテストに合格したら、別の HTTP クライアントやページネーターを使用してコードを簡素化するなど、v2 の拡張機能を活用できます。これは任意の手順です。

## 移行の例
<a name="migration-steps-example"></a>

この例では、SDK for Java v1 を使用し、複数の AWS のサービスにアクセスするアプリケーションを移行します。ステップ 5 では、次の v1 メソッドについて詳しく説明します。これは、8 つのメソッドを含むクラスの 1 つのメソッドであり、アプリケーションには 32 のクラスがあります。

### 移行する v1 メソッド
<a name="v1-snippet-collapsed"></a>

Java ファイルから v1 SDK インポートのみを以下に列挙します。

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

`dependencyManagement` セクションの他の依存関係とともに、SDK for Java 2.x の Maven BOM を POM に追加します。POM ファイルに SDK の 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\$1ID が隔離されます。

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

このアプリケーションでは、次の SERVICE\$1ID がコンソールにログ記録されます。

```
autoscaling
cloudformation
ec2
identitymanagement
```

これは、`import` ステートメントで次の各パッケージ名が少なくとも 1 回出現したことを示しています。今回の目的では、個々のクラス名は関係ありません。使用される SERVICE\$1ID が必要なだけです。

```
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\$1ID (例えば `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>  | 
| identitymanagement\$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. POM ファイルに v2 依存関係要素を追加する
<a name="migration-steps-example-step4"></a>

ステップ 3 では、POM ファイルに追加する必要がある 4 つの依存関係ブロックを特定しました。ステップ 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>

移行するメソッドでは、以下が確認できます。
+ `com.amazonaws.services.ec2.AmazonEC2Client` からの EC2 サービスクライアント。
+ 使用される複数の 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 インポートに置き換えることです。一度に 1 つずつクラスを処理します。

#### 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 に正しいインポートを表示させます。クライアント名が異なるため (`AmazonEC2Client` および `Ec2Client`)、IDE から v2 クラスをインポートするように求められます。クラス名が両方のバージョンで同じ場合、このアプローチは機能しません。

#### 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 のすべてのレスポンスオブジェクトが `*Result` ではなく `*Response` で終わることです](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` のゲッターメソッドも SDK for Java 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;
    }
...
```

8 つのメソッドを持つ Java ファイルの 1 つのメソッドを移行するため、ファイルを処理する際に v1 と v2 のインポートが混在することになります。ステップの実行時に、最後の 6 つのインポートステートメントを追加しました。

すべてのコードを移行すると、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 依存関係は必要ありません。使用している場合は、`dependencyManagement` セクションから v1 BOM と、すべての v1 依存関係ブロックを削除します。

### 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 プロジェクトを SDK for Java の v1 から v2 に移行するときは、ビルドファイルに追加する依存関係を特定する必要があります。[ステップバイステップの移行手順](#migration-steps) (ステップ 3) で説明されているアプローチでは、インポートステートメントのパッケージ名を開始点として使用して、ビルドファイルに追加する依存関係 (artifactIds) を決定します。

このトピックの情報を使用して、v1 パッケージ名を v2 artifactIds にマッピングできます。

### パッケージ名と Maven artifactIds で使用される一般的な命名規則
<a name="migration-naming-convention"></a>

次の表は、SDK が特定の SERVICE\$1ID に使用する一般的な命名規則を示しています。SERVICE\$1ID は の一意の識別子です AWS のサービス。例えば、Amazon S3 サービスの SERVICE\$1ID は `s3` であり、`cognitoidentity` は Amazon Cognito ID の 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 ID の例 (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>

同じサービスであっても、パッケージ名の SERVICE\$1ID と artifactId の SERVICE\$1ID が異なる場合があります。例えば、次の表の CloudWatch Metrics 行は、`metrics` がパッケージ名の SERVICE\$1ID であり、`cloudwatchmetrics` が artifactId の SERVICE\$1ID であることを示しています。

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

パッケージ名と artifactId で使用される SERVICE\$1ID に違いはありません。

#### V1 と V2 間
<a name="migration-serviceid-diffs-btwv1v2"></a>

ほとんどのサービスでは、v2 の SERVICE\$1ID はパッケージ名と artifactId の両方で v1 の SERVICE\$1ID と同じです。この例は、前の表に示した `cognitoedentity` SERVICE\$1ID です。ただし、次の表に示すように、一部の SERVICE\$1ID は SDK によって異なります。

いずれかの v1 列の**太字の SERVICE\$1ID** は、v2 で使用される SERVICE\$1ID とは異なることを示します。


| サービス名 | v1 パッケージ名 | v1 artifactId | v2 artifactId | v2 パッケージ名 | 
| --- | --- | --- | --- | --- | 
|  |  最初の行に示すように、すべてのパッケージ名は `com.amazonaws.services` で始まります。  |  最初の行に示すように、すべての artifactId はタグで囲まれます。  |  最初の行に示すように、すべての artifactId はタグで囲まれます。  |  最初の行に示すように、すべてのパッケージ名は `software.amazon.awssdk` で始まります。  | 
|  | 
| API ゲートウェイ | com.amazonaws.services.apigateway | <artifactId>aws-java-sdk-api-gateway</artifactId> | <artifactId>apigateway</artifactId> | software.amazon.awssdk.services.apigateway | 
| App Registry | appregistry | appregistry | servicecatalogappregistry | servicecatalogappregistry | 
| Application Discovery | applicationdiscovery | 検出 | applicationdiscovery | applicationdiscovery | 
| Augmented AI Runtime | augmentedairuntime | augmentedairuntime | sagemakera2iruntime | sagemakera2iruntime | 
| Certificate Manager | certificatemanager | acm | acm | acm | 
| CloudControl API | cloudcontrolapi | cloudcontrolapi | cloudcontrol | cloudcontrol | 
| CloudSearch | cloudsearchv2 | cloudsearch | cloudsearch | cloudsearch | 
| CloudSearch Domain | cloudsearchdomain | cloudsearch | cloudsearchdomain | cloudsearchdomain | 
| CloudWatch Events | cloudwatchevents | イベント | cloudwatchevents | cloudwatchevents | 
| CloudWatch Evidently | cloudwatchevidently | cloudwatchevidently | evidently | evidently | 
| CloudWatch Logs | ログ | ログ | cloudwatchlogs | cloudwatchlogs | 
| CloudWatch メトリクス | メトリクス | cloudwatchmetrics | cloudwatch | cloudwatch | 
| CloudWatch RUM | cloudwatchrum | cloudwatchrum | rum | rum | 
| Cognito Identity Provider | cognitoidp | cognitoidp | cognitoidentityprovider | cognitoidentityprovider | 
| Connect Campaign | connectcampaign | connectcampaign | connectcampaigns | connectcampaigns | 
| Connect Wisdom | connectwisdom | connectwisdom | wisdom | wisdom | 
| Database Migration Service | databasemigrationservice | dms | databasemigration | databasemigration | 
| DataZone | datazone | datazoneexternal | datazone | datazone | 
| DynamoDB | dynamodbv2 | dynamodb | dynamodb | dynamodb | 
| Elastic File System | elasticfilesystem | efs | efs | efs | 
| Elastic Map Reduce | elasticmapreduce | emr | emr | emr | 
| Glue DataBrew | gluedatabrew | gluedatabrew | databrew | databrew | 
| IAM Roles Anywhere | iamrolesanywhere | iamrolesanywhere | rolesanywhere | rolesanywhere | 
| ID 管理 | identitymanagement | iam | iam | iam | 
| IoT Data | iotdata | iot | iotdataplane | iotdataplane | 
| Kinesis Analytics | kinesisanalytics | kinesis | kinesisanalytics | kinesisanalytics | 
| Kinesis Firehose | kinesisfirehose | kinesis | firehose | firehose | 
| Kinesis Video Signaling Channels | kinesisvideosignalingchannels | kinesisvideosignalingchannels | kinesisvideosignaling | kinesisvideosignaling | 
| Lex | lexruntime | lex | lexruntime | lexruntime | 
| Lookout For Vision | lookoutforvision | lookoutforvision | lookoutvision | lookoutvision | 
| Mainframe Modernization | mainframemodernization | mainframemodernization | m2 | m2 | 
| Marketplace Metering | marketplacemetering | marketplacemeteringservice | marketplacemetering | marketplacemetering | 
| Managed Grafana | managedgrafana | managedgrafana | grafana | grafana | 
| Mechanical Turk | mturk | mechanicalturkrequester | mturk | mturk | 
| Migration Hub Strategy の推奨事項 | migrationhubstrategyrecommendations | migrationhubstrategyrecommendations | migrationhubstrategy | migrationhubstrategy | 
| Nimble Studio | nimblestudio | nimblestudio | nimble | nimble | 
| Private 5G | private5g | private5g | privatenetworks | privatenetworks | 
| Prometheus | prometheus | prometheus | amp | amp | 
| ごみ箱 | recyclebin | recyclebin | rbin | rbin | 
| Redshift Data API | redshiftdataapi | redshiftdataapi | Redshiftdata | Redshiftdata | 
| Route 53 | route53domains | route53 | route53domains | route53domains | 
| Sage Maker Edge Manager | sagemakeredgemanager | sagemakeredgemanager | sagemakeredge | sagemakeredge | 
| Security Token | securitytoken | sts | sts | sts | 
| Server Migration | servermigration | servermigration | sms | sms | 
| Simple Email | simpleemail | ses | ses | ses | 
| Simple Email V2 | simpleemailv2 | sesv2 | sesv2 | sesv2 | 
| Simple Systems Management | simplesystemsmanagement | ssm | ssm | ssm | 
| Simple Workflow | simpleworkflow | simpleworkflow | swf | swf | 
| ステップ関数 | ステップ関数 | ステップ関数 | sfn | sfn | 

# AWS SDK for Java 1.x と 2.x の違い
<a name="migration-whats-different"></a>

このセクションでは、アプリケーションをバージョン 1.x から AWS SDK for Java バージョン 2.x に変換するときに注意すべき主な変更点について説明します。

## パッケージ名の変更
<a name="mig-diff-package-name-change"></a>

SDK for Java 1.x から SDK for Java 2.x への主な変更点は、パッケージ名の変更です。SDK 2.x ではパッケージ名が `software.amazon.awssdk` で始まりますが、SDK 1.x では `com.amazonaws` で始まります。

これらの同じ名前は、SDK 1.x から SDK 2.x までの Maven アーティファクトを区別します。SDK 2.x の Maven アーティファクトは `software.amazon.awssdk` groupId を使用しますが、SDK 1.x では `com.amazonaws` groupId を使用します。

SDK 2.x のアーティファクトのみを使用するプロジェクトの `com.amazonaws` 依存関係がコードに必要になる場合があります。その一例が、サーバーサイド AWS Lambdaで使用する場合です。これは、このガイドの前半の「[Apache Maven プロジェクトのセットアップ](setup-project-maven.md#modules-dependencies)」セクションで説明しました。

**注記**  
SDK 1.x のいくつかのパッケージ名には、`v2` を含みます。この場合の `v2` の使用は、通常、パッケージ内のコードがバージョン 2 のサービスで動作するように設定されていることを意味します。  
フルパッケージ名は `com.amazonaws` で始まるため、これらは SDK 1.x コンポーネントです。SDK 1.x のパッケージ名の例は次のとおりです。  
`com.amazonaws.services.dynamodbv2`
`com.amazonaws.retry.v2`
`com.amazonaws.services.apigatewayv2`
`com.amazonaws.services.simpleemailv2`

## プロジェクトへのバージョン 2.x の追加
<a name="adding-v2"></a>

Maven は、 AWS SDK for Java 2.x を使用するときに依存関係を管理するための推奨方法です。バージョン 2x のコンポーネントをプロジェクトに追加するには、SDK の依存関係で `pom.xml` ファイルを更新します。

**Example**  

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

<dependencies>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>dynamodb</artifactId>
    </dependency>
</dependencies>
```

プロジェクトをバージョン 2.x に移行するときに、[バージョン 1.x と 2.x を併用](migration-side-by-side.md)することもできます。

## イミュータブルな POJO
<a name="immutable-classes"></a>

クライアントとオペレーションリクエスト、および応答オブジェクトがイミュータブルになり、作成後に変更できなくなりました。リクエストあるいはレスポンス変数を再利用するには、新しいオブジェクトを構築してそれを割り当てる必要があります。

**Example 1.x でリクエストオブジェクトを更新する場合**  

```
DescribeAlarmsRequest request = new DescribeAlarmsRequest();
DescribeAlarmsResult response = cw.describeAlarms(request);

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

**Example 2.x でリクエストオブジェクトを更新する場合**  

```
DescribeAlarmsRequest request = DescribeAlarmsRequest.builder().build();
DescribeAlarmsResponse response = cw.describeAlarms(request);

request = DescribeAlarmsRequest.builder()
        .nextToken(response.nextToken())
        .build();
```

## セッターメソッドとゲッターメソッド
<a name="setter-getter-methods"></a>

 AWS SDK for Java 2.x では、セッターメソッド名に `set`または `with` プレフィックスは含まれません。たとえば、`*.withEndpoint()` は現在 `*.endpoint()` です。

ゲッターメソッド名は `get` プレフィックスを使用しません。

**Example 1.x でセッターメソッドを使用する場合**  

```
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
        		.withRegion("us-east-1")
        		.build();
```

**Example 2.x でセッターメソッドを使用する場合**  

```
DynamoDbClient client = DynamoDbClient.builder()
        		.region(Region.US_EAST_1)
        		.build();
```

**Example 1.x でゲッターメソッドを使用する場合**  

```
String token = request.getNextToken();
```

**Example 2.x でゲッターメソッドを使用する場合**  

```
String token = request.nextToken();
```

## モデルクラス名
<a name="model-classname-changes"></a>

サービスレスポンスを表すモデルクラス名は、v2 では v1 で使用される `Response` ではなく、`Result` で終わります。

**Example v1 でのレスポンスを表すクラス名**  

```
CreateApiKeyResult
AllocateAddressResult
```

**Example v2 でのレスポンスを表すクラス名**  

```
CreateApiKeyResponse
AllocateAddressResponse
```

## ライブラリとユーティリティの移行状況
<a name="migration-libraries-utilities"></a>

### SDK for Java ライブラリとユーティリティ
<a name="migration-java-sdk-libs-utils"></a>

次の表は、SDK for Java のライブラリとユーティリティの移行ステータスを示しています。


| バージョン 1.12.x の名前 | バージョン 2.x の名前 | バージョン 2.x 以降 | 
| --- | --- | --- | 
| DynamoDBMapper | [DynamoDbEnhancedClient](dynamodb-enhanced-client.md) | 2.12.0 | 
| ウェイター | [ウェーター](waiters.md) | 2.15.0 | 
| CloudFrontUrlSigner、CloudFrontCookieSigner | [CloudFrontUtilities](https://aws.amazon.com/blogs/developer/amazon-cloudfront-signed-urls-and-cookies-are-now-supported-in-aws-sdk-for-java-2-x/) | 2.18.33 | 
| TransferManager | [S3TransferManager](transfer-manager.md) | 2.19.0 | 
| EC2 メタデータクライアント |  [EC2 メタデータクライアント](examples-ec2-IMDS.md)  | 2.19.29 | 
| S3 URI パーサー |  [S3 URI パーサー](https://aws.amazon.com/blogs/devops/s3-uri-parsing-is-now-available-in-aws-sdk-for-java-2-x/)  | 2.20.41 | 
| IAM Policy Builder | [IAM Policy Builder](feature-iam-policy-builder.md) | 2.20.126 | 
| S3 イベント通知 | [S3 イベント通知](examples-s3-event-notifications.md#s3-event-notification-read) | 2.25.11  | 
| Amazon SQS のクライアント側のバッファリング | [Amazon SQS の自動リクエストバッチ処理 API](sqs-auto-batch.md) | 2.28.0 | 
| 進行状況のリスナー | 進行状況のリスナー | [未リリース](https://github.com/aws/aws-sdk-java-v2/issues/25) | 

### 関連ライブラリ
<a name="migration-other-sdks"></a>

次の表は、個別にリリースされているものの、SDK for Java 2.x で動作するライブラリの一覧です。


| SDK for Java のバージョン 2.x で使用されている名前 | バージョン以降 | 
| --- | --- | 
|  [Amazon S3 暗号化クライアント](https://docs.aws.amazon.com/amazon-s3-encryption-client/latest/developerguide/what-is-s3-encryption-client.html)  |  3.0.01  | 
| [AWS Database Encryption SDK for DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) | 3.0.02 | 

#### 1Amazon S3 暗号化クライアント
<a name="migration-s3-encryption-sdk"></a>

Amazon S3 の暗号化クライアントは、次の Maven 依存関係を使用して利用できます。

```
<dependency>
    <groupId>software.amazon.encryption.s3</groupId>
    <artifactId>amazon-s3-encryption-client-java</artifactId>
    <version>3.x</version>
</dependency>
```

#### 2AWS DynamoDB 用データベース暗号化 SDK
<a name="migration-ddb-encryption-sdk"></a>

 AWS Database Encryption SDK for DynamoDB は、次の Maven 依存関係を使用して V2 で使用できます。

```
<dependency> 
    <groupId>software.amazon.cryptography</groupId>
    <artifactId>aws-database-encryption-sdk-dynamodb</artifactId>
    <version>3.x</version>
</dependency>
```

Java SDK の v1 で動作する DynamoDB の暗号化ライブラリに関する情報は、「[AWS Database Encryption SDK デベロッパーガイド](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/java.html)」 (「*Amazon DynamoDB Encryption Client for Java*」) および [GitHub](https://github.com/aws/aws-dynamodb-encryption-java) を参照してください

Java SDK の V2 と互換性のある DynamoDB 暗号化ライブラリの詳細については、「[AWS Database Encryption SDK デベロッパーガイド](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html)」と [GitHub ソース](https://github.com/aws/aws-database-encryption-sdk-dynamodb)を参照してください。

暗号化ライブラリに関する移行情報は、「[AWS Database Encryption SDK デベロッパーガイド](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html)」を参照してください。

### ライブラリとユーティリティの移行の詳細
<a name="migrate-libs-utils-details"></a>
+ [Transfer Manager](migration-s3-transfer-manager.md)
+ [EC2 メタデータユーティリティ](migration-imds.md)
+ [CloudFront の事前署名](migration-cloudfront-presigning.md)
+ [S3 URI 解析](migration-s3-uri-parser.md)
+ [DynamoDB マッピング/ドキュメント API](migration-ddb-mapper.md) 
+ [IAM Policy Builder](migration-iam-policy-builder.md)
+ [S3 イベント通知](migration-s3-event-notification.md)
+ SDK メトリクスの公開 ([1.x ドキュメント](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html)、[2.x ドキュメント](metrics.md))

# クライアントの変更
<a name="migration-clients"></a>

## クライアントビルダー
<a name="client-builder"></a>

すべてのクライアントは、クライアントビルダーメソッドを使用して作成する必要があります。コンストラクタは利用できなくなりました。

**Example バージョン 1.x でクライアントを作成する場合**  

```
AmazonDynamoDB ddbClient = AmazonDynamoDBClientBuilder.defaultClient();
AmazonDynamoDBClient ddbClient = new AmazonDynamoDBClient();
```

**Example バージョン 2.x でクライアントを作成する場合**  

```
DynamoDbClient ddbClient = DynamoDbClient.create();
DynamoDbClient ddbClient = DynamoDbClient.builder().build();
```

## クライアントのクラス名
<a name="class-names"></a>

すべてのクライアント名は完全キャメルケースになり、`Amazon` によるプレフィックスは使用されなくなりました。上記の変更は、 AWS CLIで使用される名前と連携します。

**Example 1.x のクラス名の場合**  

```
AmazonDynamoDB
AWSACMPCAAsyncClient
```

**Example 2.x のクラス名の場合**  

```
DynamoDbClient
AcmAsyncClient
```


**クライアントのクラス名の変更**  

| 1.x クライアント | 2.x クライアント | 
| --- | --- | 
| com.amazonaws.services.acmpca.AWSACMPCAAsyncClient | software.amazon.awssdk.services.acm.AcmAsyncClient | 
| com.amazonaws.services.acmpca.AWSACMPCAClient | software.amazon.awssdk.services.acm.AcmClient | 
| com.amazonaws.services.alexaforbusiness.AmazonAlexaForBusinessAsyncClient | software.amazon.awssdk.services.alexaforbusiness.AlexaForBusinessAsyncClient | 
| com.amazonaws.services.alexaforbusiness.AmazonAlexaForBusinessClient | software.amazon.awssdk.services.alexaforbusiness.AlexaForBusinessClient | 
| com.amazonaws.services.apigateway.AmazonApiGatewayAsyncClient | software.amazon.awssdk.services.apigateway.ApiGatewayAsyncClient | 
| com.amazonaws.services.apigateway.AmazonApiGatewayClient | software.amazon.awssdk.services.apigateway.ApiGatewayClient | 
| com.amazonaws.services.applicationautoscaling.AWSApplicationAutoScalingAsyncClient | software.amazon.awssdk.services.applicationautoscaling.ApplicationAutoScalingAsyncClient | 
| com.amazonaws.services.applicationautoscaling.AWSApplicationAutoScalingClient | software.amazon.awssdk.services.applicationautoscaling.ApplicationAutoScalingClient | 
| com.amazonaws.services.applicationdiscovery.AWSApplicationDiscoveryAsyncClient | software.amazon.awssdk.services.applicationdiscovery.ApplicationDiscoveryAsyncClient | 
| com.amazonaws.services.applicationdiscovery.AWSApplicationDiscoveryClient | software.amazon.awssdk.services.applicationdiscovery.ApplicationDiscoveryClient | 
| com.amazonaws.services.appstream.AmazonAppStreamAsyncClient | software.amazon.awssdk.services.appstream.AppStreamAsyncClient | 
| com.amazonaws.services.appstream.AmazonAppStreamClient | software.amazon.awssdk.services.appstream.AppStreamClient | 
| com.amazonaws.services.appsync.AWSAppSyncAsyncClient | software.amazon.awssdk.services.appsync.AppSyncAsyncClient | 
| com.amazonaws.services.appsync.AWSAppSyncClient | software.amazon.awssdk.services.appsync.AppSyncClient | 
| com.amazonaws.services.athena.AmazonAthenaAsyncClient | software.amazon.awssdk.services.athena.AthenaAsyncClient | 
| com.amazonaws.services.athena.AmazonAthenaClient | software.amazon.awssdk.services.athena.AthenaClient | 
| com.amazonaws.services.autoscaling.AmazonAutoScalingAsyncClient | software.amazon.awssdk.services.autoscaling.AutoScalingAsyncClient | 
| com.amazonaws.services.autoscaling.AmazonAutoScalingClient | software.amazon.awssdk.services.autoscaling.AutoScalingClient | 
| com.amazonaws.services.autoscalingplans.AWSAutoScalingPlansAsyncClient | software.amazon.awssdk.services.autoscalingplans.AutoScalingPlansAsyncClient | 
| com.amazonaws.services.autoscalingplans.AWSAutoScalingPlansClient | software.amazon.awssdk.services.autoscalingplans.AutoScalingPlansClient | 
| com.amazonaws.services.batch.AWSBatchAsyncClient | software.amazon.awssdk.services.batch.BatchAsyncClient | 
| com.amazonaws.services.batch.AWSBatchClient | software.amazon.awssdk.services.batch.BatchClient | 
| com.amazonaws.services.budgets.AWSBudgetsAsyncClient | software.amazon.awssdk.services.budgets.BudgetsAsyncClient | 
| com.amazonaws.services.budgets.AWSBudgetsClient | software.amazon.awssdk.services.budgets.BudgetsClient | 
| com.amazonaws.services.certificatemanager.AWSCertificateManagerAsyncClient | software.amazon.awssdk.services.acm.AcmAsyncClient | 
| com.amazonaws.services.certificatemanager.AWSCertificateManagerClient | software.amazon.awssdk.services.acm.AcmClient | 
| com.amazonaws.services.cloud9.AWSCloud9AsyncClient | software.amazon.awssdk.services.cloud9.Cloud9AsyncClient | 
| com.amazonaws.services.cloud9.AWSCloud9Client | software.amazon.awssdk.services.cloud9.Cloud9Client | 
| com.amazonaws.services.clouddirectory.AmazonCloudDirectoryAsyncClient | software.amazon.awssdk.services.clouddirectory.CloudDirectoryAsyncClient | 
| com.amazonaws.services.clouddirectory.AmazonCloudDirectoryClient | software.amazon.awssdk.services.clouddirectory.CloudDirectoryClient | 
| com.amazonaws.services.cloudformation.AmazonCloudFormationAsyncClient | software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient | 
| com.amazonaws.services.cloudformation.AmazonCloudFormationClient | software.amazon.awssdk.services.cloudformation.CloudFormationClient | 
| com.amazonaws.services.cloudfront.AmazonCloudFrontAsyncClient | software.amazon.awssdk.services.cloudfront.CloudFrontAsyncClient | 
| com.amazonaws.services.cloudfront.AmazonCloudFrontClient | software.amazon.awssdk.services.cloudfront.CloudFrontClient | 
| com.amazonaws.services.cloudhsm.AWSCloudHSMAsyncClient | software.amazon.awssdk.services.cloudhsm.CloudHsmAsyncClient | 
| com.amazonaws.services.cloudhsm.AWSCloudHSMClient | software.amazon.awssdk.services.cloudhsm.CloudHsmClient | 
| com.amazonaws.services.cloudhsmv2.AWSCloudHSMV2AsyncClient | software.amazon.awssdk.services.cloudhsmv2.CloudHsmV2AsyncClient | 
| com.amazonaws.services.cloudhsmv2.AWSCloudHSMV2Client | software.amazon.awssdk.services.cloudhsmv2.CloudHsmV2Client | 
| com.amazonaws.services.cloudsearchdomain.AmazonCloudSearchDomainAsyncClient | software.amazon.awssdk.services.cloudsearchdomain.CloudSearchDomainAsyncClient | 
| com.amazonaws.services.cloudsearchdomain.AmazonCloudSearchDomainClient | software.amazon.awssdk.services.cloudsearchdomain.CloudSearchDomainClient | 
| com.amazonaws.services.cloudsearchv2.AmazonCloudSearchAsyncClient | software.amazon.awssdk.services.cloudsearch.CloudSearchAsyncClient | 
| com.amazonaws.services.cloudsearchv2.AmazonCloudSearchClient | software.amazon.awssdk.services.cloudsearch.CloudSearchClient | 
| com.amazonaws.services.cloudtrail.AWSCloudTrailAsyncClient | software.amazon.awssdk.services.cloudtrail.CloudTrailAsyncClient | 
| com.amazonaws.services.cloudtrail.AWSCloudTrailClient | software.amazon.awssdk.services.cloudtrail.CloudTrailClient | 
| com.amazonaws.services.cloudwatch.AmazonCloudWatchAsyncClient | software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient | 
| com.amazonaws.services.cloudwatch.AmazonCloudWatchClient | software.amazon.awssdk.services.cloudwatch.CloudWatchClient | 
| com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsAsyncClient | software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsAsyncClient | 
| com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClient | software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsClient | 
| com.amazonaws.services.codebuild.AWSCodeBuildAsyncClient | software.amazon.awssdk.services.codebuild.CodeBuildAsyncClient | 
| com.amazonaws.services.codebuild.AWSCodeBuildClient | software.amazon.awssdk.services.codebuild.CodeBuildClient | 
| com.amazonaws.services.codecommit.AWSCodeCommitAsyncClient | software.amazon.awssdk.services.codecommit.CodeCommitAsyncClient | 
| com.amazonaws.services.codecommit.AWSCodeCommitClient | software.amazon.awssdk.services.codecommit.CodeCommitClient | 
| com.amazonaws.services.codedeploy.AmazonCodeDeployAsyncClient | software.amazon.awssdk.services.codedeploy.CodeDeployAsyncClient | 
| com.amazonaws.services.codedeploy.AmazonCodeDeployClient | software.amazon.awssdk.services.codedeploy.CodeDeployClient | 
| com.amazonaws.services.codepipeline.AWSCodePipelineAsyncClient | software.amazon.awssdk.services.codepipeline.CodePipelineAsyncClient | 
| com.amazonaws.services.codepipeline.AWSCodePipelineClient | software.amazon.awssdk.services.codepipeline.CodePipelineClient | 
| com.amazonaws.services.codestar.AWSCodeStarAsyncClient | software.amazon.awssdk.services.codestar.CodeStarAsyncClient | 
| com.amazonaws.services.codestar.AWSCodeStarClient | software.amazon.awssdk.services.codestar.CodeStarClient | 
| com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityAsyncClient | software.amazon.awssdk.services.cognitoidentity.CognitoIdentityAsyncClient | 
| com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient | software.amazon.awssdk.services.cognitoidentity.CognitoIdentityClient | 
| com.amazonaws.services.cognitoidp.AWSCognitoIdentityProviderAsyncClient | software.amazon.awssdk.services.cognitoidentityprovider.CognitoIdentityProviderAsyncClient | 
| com.amazonaws.services.cognitoidp.AWSCognitoIdentityProviderClient | software.amazon.awssdk.services.cognitoidentityprovider.CognitoIdentityProviderClient | 
| com.amazonaws.services.cognitosync.AmazonCognitoSyncAsyncClient | software.amazon.awssdk.services.cognitosync.CognitoSyncAsyncClient | 
| com.amazonaws.services.cognitosync.AmazonCognitoSyncClient | software.amazon.awssdk.services.cognitosync.CognitoSyncClient | 
| com.amazonaws.services.comprehend.AmazonComprehendAsyncClient | software.amazon.awssdk.services.comprehend.ComprehendAsyncClient | 
| com.amazonaws.services.comprehend.AmazonComprehendClient | software.amazon.awssdk.services.comprehend.ComprehendClient | 
| com.amazonaws.services.config.AmazonConfigAsyncClient | software.amazon.awssdk.services.config.ConfigAsyncClient | 
| com.amazonaws.services.config.AmazonConfigClient | software.amazon.awssdk.services.config.ConfigClient | 
| com.amazonaws.services.connect.AmazonConnectAsyncClient | software.amazon.awssdk.services.connect.ConnectAsyncClient | 
| com.amazonaws.services.connect.AmazonConnectClient | software.amazon.awssdk.services.connect.ConnectClient | 
| com.amazonaws.services.costandusagereport.AWSCostAndUsageReportAsyncClient | software.amazon.awssdk.services.costandusagereport.CostAndUsageReportAsyncClient | 
| com.amazonaws.services.costandusagereport.AWSCostAndUsageReportClient | software.amazon.awssdk.services.costandusagereport.CostAndUsageReportClient | 
| com.amazonaws.services.costexplorer.AWSCostExplorerAsyncClient | software.amazon.awssdk.services.costexplorer.CostExplorerAsyncClient | 
| com.amazonaws.services.costexplorer.AWSCostExplorerClient | software.amazon.awssdk.services.costexplorer.CostExplorerClient | 
| com.amazonaws.services.databasemigrationservice.AWSDatabaseMigrationServiceAsyncClient | software.amazon.awssdk.services.databasemigration.DatabaseMigrationAsyncClient | 
| com.amazonaws.services.databasemigrationservice.AWSDatabaseMigrationServiceClient | software.amazon.awssdk.services.databasemigration.DatabaseMigrationClient | 
| com.amazonaws.services.datapipeline.DataPipelineAsyncClient | software.amazon.awssdk.services.datapipeline.DataPipelineAsyncClient | 
| com.amazonaws.services.datapipeline.DataPipelineClient | software.amazon.awssdk.services.datapipeline.DataPipelineAsyncClient | 
| com.amazonaws.services.dax.AmazonDaxAsyncClient | software.amazon.awssdk.services.dax.DaxAsyncClient | 
| com.amazonaws.services.dax.AmazonDaxClient | software.amazon.awssdk.services.dax.DaxClient | 
| com.amazonaws.services.devicefarm.AWSDeviceFarmAsyncClient | software.amazon.awssdk.services.devicefarm.DeviceFarmAsyncClient | 
| com.amazonaws.services.devicefarm.AWSDeviceFarmClient | software.amazon.awssdk.services.devicefarm.DeviceFarmClient | 
| com.amazonaws.services.directconnect.AmazonDirectConnectAsyncClient | software.amazon.awssdk.services.directconnect.DirectConnectAsyncClient | 
| com.amazonaws.services.directconnect.AmazonDirectConnectClient | software.amazon.awssdk.services.directconnect.DirectConnectClient | 
| com.amazonaws.services.directory.AWSDirectoryServiceAsyncClient | software.amazon.awssdk.services.directory.DirectoryAsyncClient | 
| com.amazonaws.services.directory.AWSDirectoryServiceClient | software.amazon.awssdk.services.directory.DirectoryClient | 
| com.amazonaws.services.dlm.AmazonDLMAsyncClient | software.amazon.awssdk.services.dlm.DlmAsyncClient | 
| com.amazonaws.services.dlm.AmazonDLMClient | software.amazon.awssdk.services.dlm.DlmClient | 
| com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient | software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient | 
| com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient | software.amazon.awssdk.services.dynamodb.DynamoDbClient | 
| com.amazonaws.services.dynamodbv2.AmazonDynamoDBStreamsAsyncClient | software.amazon.awssdk.services.dynamodb.streams.DynamoDbStreamsAsyncClient | 
| com.amazonaws.services.dynamodbv2.AmazonDynamoDBStreamsClient | software.amazon.awssdk.services.dynamodb.streams.DynamoDbStreamsClient | 
| com.amazonaws.services.ec2.AmazonEC2AsyncClient | software.amazon.awssdk.services.ec2.Ec2AsyncClient | 
| com.amazonaws.services.ec2.AmazonEC2Client | software.amazon.awssdk.services.ec2.Ec2Client | 
| com.amazonaws.services.ecr.AmazonECRAsyncClient | software.amazon.awssdk.services.ecr.EcrAsyncClient | 
| com.amazonaws.services.ecr.AmazonECRClient | software.amazon.awssdk.services.ecr.EcrClient | 
| com.amazonaws.services.ecs.AmazonECSAsyncClient | software.amazon.awssdk.services.ecs.EcsAsyncClient | 
| com.amazonaws.services.ecs.AmazonECSClient | software.amazon.awssdk.services.ecs.EcsClient | 
| com.amazonaws.services.eks.AmazonEKSAsyncClient | software.amazon.awssdk.services.eks.EksAsyncClient | 
| com.amazonaws.services.eks.AmazonEKSClient | software.amazon.awssdk.services.eks.EksClient | 
| com.amazonaws.services.elasticache.AmazonElastiCacheAsyncClient | software.amazon.awssdk.services.elasticache.ElastiCacheAsyncClient | 
| com.amazonaws.services.elasticache.AmazonElastiCacheClient | software.amazon.awssdk.services.elasticache.ElastiCacheClient | 
| com.amazonaws.services.elasticbeanstalk.AWSElasticBeanstalkAsyncClient | software.amazon.awssdk.services.elasticbeanstalk.ElasticBeanstalkAsyncClient | 
| com.amazonaws.services.elasticbeanstalk.AWSElasticBeanstalkClient | software.amazon.awssdk.services.elasticbeanstalk.ElasticBeanstalkClient | 
| com.amazonaws.services.elasticfilesystem.AmazonElasticFileSystemAsyncClient | software.amazon.awssdk.services.efs.EfsAsyncClient | 
| com.amazonaws.services.elasticfilesystem.AmazonElasticFileSystemClient | software.amazon.awssdk.services.efs.EfsClient | 
| com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingAsyncClient | software.amazon.awssdk.services.elasticloadbalancing.ElasticLoadBalancingAsyncClient | 
| com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient | software.amazon.awssdk.services.elasticloadbalancing.ElasticLoadBalancingClient | 
| com.amazonaws.services.elasticloadbalancingv2.AmazonElasticLoadBalancingAsyncClient | software.amazon.awssdk.services.elasticloadbalancingv2.ElasticLoadBalancingV2AsyncClient | 
| com.amazonaws.services.elasticloadbalancingv2.AmazonElasticLoadBalancingClient | software.amazon.awssdk.services.elasticloadbalancingv2.ElasticLoadBalancingV2Client | 
| com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceAsyncClient | software.amazon.awssdk.services.emr.EmrAsyncClient | 
| com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClient | software.amazon.awssdk.services.emr.EmrClient | 
| com.amazonaws.services.elasticsearch.AWSElasticsearchAsyncClient | software.amazon.awssdk.services.elasticsearch.ElasticsearchAsyncClient | 
| com.amazonaws.services.elasticsearch.AWSElasticsearchClient | software.amazon.awssdk.services.elasticsearch.ElasticsearchClient | 
| com.amazonaws.services.elastictranscoder.AmazonElasticTranscoderAsyncClient | software.amazon.awssdk.services.elastictranscoder.ElasticTranscoderAsyncClient | 
| com.amazonaws.services.elastictranscoder.AmazonElasticTranscoderClient | software.amazon.awssdk.services.elastictranscoder.ElasticTranscoderClient | 
| com.amazonaws.services.fms.AWSFMSAsyncClient | software.amazon.awssdk.services.fms.FmsAsyncClient | 
| com.amazonaws.services.fms.AWSFMSClient | software.amazon.awssdk.services.fms.FmsClient | 
| com.amazonaws.services.gamelift.AmazonGameLiftAsyncClient | software.amazon.awssdk.services.gamelift.GameLiftAsyncClient | 
| com.amazonaws.services.gamelift.AmazonGameLiftClient | software.amazon.awssdk.services.gamelift.GameLiftClient | 
| com.amazonaws.services.glacier.AmazonGlacierAsyncClient | software.amazon.awssdk.services.glacier.GlacierAsyncClient | 
| com.amazonaws.services.glacier.AmazonGlacierClient | software.amazon.awssdk.services.glacier.GlacierClient | 
| com.amazonaws.services.glue.AWSGlueAsyncClient | software.amazon.awssdk.services.glue.GlueAsyncClient | 
| com.amazonaws.services.glue.AWSGlueClient | software.amazon.awssdk.services.glue.GlueClient | 
| com.amazonaws.services.greengrass.AWSGreengrassAsyncClient | software.amazon.awssdk.services.greengrass.GreengrassAsyncClient | 
| com.amazonaws.services.greengrass.AWSGreengrassClient | software.amazon.awssdk.services.greengrass.GreengrassClient | 
| com.amazonaws.services.guardduty.AmazonGuardDutyAsyncClient | software.amazon.awssdk.services.guardduty.GuardDutyAsyncClient | 
| com.amazonaws.services.guardduty.AmazonGuardDutyClient | software.amazon.awssdk.services.guardduty.GuardDutyClient | 
| com.amazonaws.services.health.AWSHealthAsyncClient | software.amazon.awssdk.services.health.HealthAsyncClient | 
| com.amazonaws.services.health.AWSHealthClient | software.amazon.awssdk.services.health.HealthClient | 
| com.amazonaws.services.identitymanagement.AmazonIdentityManagementAsyncClient | software.amazon.awssdk.services.iam.IamAsyncClient | 
| com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient | software.amazon.awssdk.services.iam.IamClient | 
| com.amazonaws.services.importexport.AmazonImportExportAsyncClient | 非推奨 | 
| com.amazonaws.services.importexport.AmazonImportExportClient | 非推奨 | 
| com.amazonaws.services.inspector.AmazonInspectorAsyncClient | software.amazon.awssdk.services.inspector.InspectorAsyncClient | 
| com.amazonaws.services.inspector.AmazonInspectorClient | software.amazon.awssdk.services.inspector.InspectorClient | 
| com.amazonaws.services.iot.AWSIotAsyncClient | software.amazon.awssdk.services.iot.IotAsyncClient | 
| com.amazonaws.services.iot.AWSIotClient | software.amazon.awssdk.services.iot.IotClient | 
| com.amazonaws.services.iot1clickdevices.AWSIoT1ClickDevicesAsyncClient | software.amazon.awssdk.services.iot1clickdevices.Iot1ClickDevicesAsyncClient | 
| com.amazonaws.services.iot1clickdevices.AWSIoT1ClickDevicesClient | software.amazon.awssdk.services.iot1clickdevices.Iot1ClickDevicesClient | 
| com.amazonaws.services.iot1clickprojects.AWSIoT1ClickProjectsAsyncClient | software.amazon.awssdk.services.iot1clickprojects.Iot1ClickProjectsAsyncClient | 
| com.amazonaws.services.iot1clickprojects.AWSIoT1ClickProjectsClient | software.amazon.awssdk.services.iot1clickprojects.Iot1ClickProjectsClient | 
| com.amazonaws.services.iotanalytics.AWSIoTAnalyticsAsyncClient | software.amazon.awssdk.services.iotanalytics.IotAnalyticsAsyncClient | 
| com.amazonaws.services.iotanalytics.AWSIoTAnalyticsClient | software.amazon.awssdk.services.iotanalytics.IotAnalyticsClient | 
| com.amazonaws.services.iotdata.AWSIotDataAsyncClient | software.amazon.awssdk.services.iotdata.IotDataAsyncClient | 
| com.amazonaws.services.iotdata.AWSIotDataClient | software.amazon.awssdk.services.iotdata.IotDataClient | 
| com.amazonaws.services.iotjobsdataplane.AWSIoTJobsDataPlaneAsyncClient | software.amazon.awssdk.services.iotdataplane.IotDataPlaneAsyncClient | 
| com.amazonaws.services.iotjobsdataplane.AWSIoTJobsDataPlaneClient | software.amazon.awssdk.services.iotdataplane.IotDataPlaneClient | 
| com.amazonaws.services.kinesis.AmazonKinesisAsyncClient | software.amazon.awssdk.services.kinesis.KinesisAsyncClient | 
| com.amazonaws.services.kinesis.AmazonKinesisClient | software.amazon.awssdk.services.kinesis.KinesisClient | 
| com.amazonaws.services.kinesisanalytics.AmazonKinesisAnalyticsAsyncClient | software.amazon.awssdk.services.kinesisanalytics.KinesisAnalyticsAsyncClient | 
| com.amazonaws.services.kinesisanalytics.AmazonKinesisAnalyticsClient | software.amazon.awssdk.services.kinesisanalytics.KinesisAnalyticsClient | 
| com.amazonaws.services.kinesisfirehose.AmazonKinesisFirehoseAsyncClient | software.amazon.awssdk.services.firehose.FirehoseAsyncClient | 
| com.amazonaws.services.kinesisfirehose.AmazonKinesisFirehoseClient | software.amazon.awssdk.services.firehose.FirehoseClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoArchivedMediaAsyncClient | software.amazon.awssdk.services.kinesisvideoarchivedmedia.KinesisVideoArchivedMediaAsyncClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoArchivedMediaClient | software.amazon.awssdk.services.kinesisvideoarchivedmedia.KinesisVideoArchivedMediaClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoAsyncClient | software.amazon.awssdk.services.kinesisvideo.KinesisVideoAsyncClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoClient | software.amazon.awssdk.services.kinesisvideo.KinesisVideoClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoMediaAsyncClient | software.amazon.awssdk.services.kinesisvideomedia.KinesisVideoMediaAsyncClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoMediaClient | software.amazon.awssdk.services.kinesisvideomedia.KinesisVideoMediaClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoPutMediaClient | サポート外  | 
| com.amazonaws.services.kms.AWSKMSAsyncClient | software.amazon.awssdk.services.kms.KmsAsyncClient | 
| com.amazonaws.services.kms.AWSKMSClient | software.amazon.awssdk.services.kms.KmsClient | 
| com.amazonaws.services.lambda.AWSLambdaAsyncClient | software.amazon.awssdk.services.lambda.LambdaAsyncClient | 
| com.amazonaws.services.lambda.AWSLambdaClient | software.amazon.awssdk.services.lambda.LambdaClient | 
| com.amazonaws.services.lexmodelbuilding.AmazonLexModelBuildingAsyncClient | software.amazon.awssdk.services.lexmodelbuilding.LexModelBuildingAsyncClient | 
| com.amazonaws.services.lexmodelbuilding.AmazonLexModelBuildingClient | software.amazon.awssdk.services.lexmodelbuilding.LexModelBuildingClient | 
| com.amazonaws.services.lexruntime.AmazonLexRuntimeAsyncClient | software.amazon.awssdk.services.lexruntime.LexRuntimeAsyncClient | 
| com.amazonaws.services.lexruntime.AmazonLexRuntimeClient | software.amazon.awssdk.services.lexruntime.LexRuntimeClient | 
| com.amazonaws.services.lightsail.AmazonLightsailAsyncClient | software.amazon.awssdk.services.lightsail.LightsailAsyncClient | 
| com.amazonaws.services.lightsail.AmazonLightsailClient | software.amazon.awssdk.services.lightsail.LightsailClient | 
| com.amazonaws.services.logs.AWSLogsAsyncClient | software.amazon.awssdk.services.logs.LogsAsyncClient | 
| com.amazonaws.services.logs.AWSLogsClient | software.amazon.awssdk.services.logs.LogsClient | 
| com.amazonaws.services.machinelearning.AmazonMachineLearningAsyncClient | software.amazon.awssdk.services.machinelearning.MachineLearningAsyncClient | 
| com.amazonaws.services.machinelearning.AmazonMachineLearningClient | software.amazon.awssdk.services.machinelearning.MachineLearningClient | 
| com.amazonaws.services.macie.AmazonMacieAsyncClient | software.amazon.awssdk.services.macie.MacieAsyncClient | 
| com.amazonaws.services.macie.AmazonMacieClient | software.amazon.awssdk.services.macie.MacieClient | 
| com.amazonaws.services.marketplacecommerceanalytics.AWSMarketplaceCommerceAnalyticsAsyncClient | software.amazon.awssdk.services.marketplacecommerceanalytics.MarketplaceCommerceAnalyticsAsyncClient | 
| com.amazonaws.services.marketplacecommerceanalytics.AWSMarketplaceCommerceAnalyticsClient | software.amazon.awssdk.services.marketplacecommerceanalytics.MarketplaceCommerceAnalyticsClient | 
| com.amazonaws.services.marketplaceentitlement.AWSMarketplaceEntitlementAsyncClient | software.amazon.awssdk.services.marketplaceentitlement.MarketplaceEntitlementAsyncClient | 
| com.amazonaws.services.marketplaceentitlement.AWSMarketplaceEntitlementClient | software.amazon.awssdk.services.marketplaceentitlement.MarketplaceEntitlementClient | 
| com.amazonaws.services.marketplacemetering.AWSMarketplaceMeteringAsyncClient | software.amazon.awssdk.services.marketplacemetering.MarketplaceMeteringAsyncClient | 
| com.amazonaws.services.marketplacemetering.AWSMarketplaceMeteringClient | software.amazon.awssdk.services.marketplacemetering.MarketplaceMeteringClient | 
| com.amazonaws.services.mediaconvert.AWSMediaConvertAsyncClient | software.amazon.awssdk.services.mediaconvert.MediaConvertAsyncClient | 
| com.amazonaws.services.mediaconvert.AWSMediaConvertClient | software.amazon.awssdk.services.mediaconvert.MediaConvertClient | 
| com.amazonaws.services.medialive.AWSMediaLiveAsyncClient | software.amazon.awssdk.services.medialive.MediaLiveAsyncClient | 
| com.amazonaws.services.medialive.AWSMediaLiveClient | software.amazon.awssdk.services.medialive.MediaLiveClient | 
| com.amazonaws.services.mediapackage.AWSMediaPackageAsyncClient | software.amazon.awssdk.services.mediapackage.MediaPackageAsyncClient | 
| com.amazonaws.services.mediapackage.AWSMediaPackageClient | software.amazon.awssdk.services.mediapackage.MediaPackageClient | 
| com.amazonaws.services.mediastore.AWSMediaStoreAsyncClient | software.amazon.awssdk.services.mediastore.MediaStoreAsyncClient | 
| com.amazonaws.services.mediastore.AWSMediaStoreClient | software.amazon.awssdk.services.mediastore.MediaStoreClient | 
| com.amazonaws.services.mediastoredata.AWSMediaStoreDataAsyncClient | software.amazon.awssdk.services.mediastoredata.MediaStoreDataAsyncClient | 
| com.amazonaws.services.mediastoredata.AWSMediaStoreDataClient | software.amazon.awssdk.services.mediastoredata.MediaStoreDataClient | 
| com.amazonaws.services.mediatailor.AWSMediaTailorAsyncClient | software.amazon.awssdk.services.mediatailor.MediaTailorAsyncClient | 
| com.amazonaws.services.mediatailor.AWSMediaTailorClient | software.amazon.awssdk.services.mediatailor.MediaTailorClient | 
| com.amazonaws.services.migrationhub.AWSMigrationHubAsyncClient | software.amazon.awssdk.services.migrationhub.MigrationHubAsyncClient | 
| com.amazonaws.services.migrationhub.AWSMigrationHubClient | software.amazon.awssdk.services.migrationhub.MigrationHubClient | 
| com.amazonaws.services.mobile.AWSMobileAsyncClient | software.amazon.awssdk.services.mobile.MobileAsyncClient | 
| com.amazonaws.services.mobile.AWSMobileClient | software.amazon.awssdk.services.mobile.MobileClient | 
| com.amazonaws.services.mq.AmazonMQAsyncClient | software.amazon.awssdk.services.mq.MqAsyncClient | 
| com.amazonaws.services.mq.AmazonMQClient | software.amazon.awssdk.services.mq.MqClient | 
| com.amazonaws.services.mturk.AmazonMTurkAsyncClient | software.amazon.awssdk.services.mturk.MTurkAsyncClient | 
| com.amazonaws.services.mturk.AmazonMTurkClient | software.amazon.awssdk.services.mturk.MTurkClient | 
| com.amazonaws.services.neptune.AmazonNeptuneAsyncClient | software.amazon.awssdk.services.neptune.NeptuneAsyncClient | 
| com.amazonaws.services.neptune.AmazonNeptuneClient | software.amazon.awssdk.services.neptune.NeptuneClient | 
| com.amazonaws.services.opsworks.AWSOpsWorksAsyncClient | software.amazon.awssdk.services.opsworks.OpsWorksAsyncClient | 
| com.amazonaws.services.opsworks.AWSOpsWorksClient | software.amazon.awssdk.services.opsworks.OpsWorksClient | 
| com.amazonaws.services.opsworkscm.AWSOpsWorksCMAsyncClient | software.amazon.awssdk.services.opsworkscm.OpsWorksCmAsyncClient | 
| com.amazonaws.services.opsworkscm.AWSOpsWorksCMClient | software.amazon.awssdk.services.opsworkscm.OpsWorksCmClient | 
| com.amazonaws.services.organizations.AWSOrganizationsAsyncClient | software.amazon.awssdk.services.organizations.OrganizationsAsyncClient | 
| com.amazonaws.services.organizations.AWSOrganizationsClient | software.amazon.awssdk.services.organizations.OrganizationsClient | 
| com.amazonaws.services.pi.AWSPIAsyncClient | software.amazon.awssdk.services.pi.PiAsyncClient | 
| com.amazonaws.services.pi.AWSPIClient | software.amazon.awssdk.services.pi.PiClient | 
| com.amazonaws.services.pinpoint.AmazonPinpointAsyncClient | software.amazon.awssdk.services.pinpoint.PinpointAsyncClient | 
| com.amazonaws.services.pinpoint.AmazonPinpointClient | software.amazon.awssdk.services.pinpoint.PinpointClient | 
| com.amazonaws.services.polly.AmazonPollyAsyncClient | software.amazon.awssdk.services.polly.PollyAsyncClient | 
| com.amazonaws.services.polly.AmazonPollyClient | software.amazon.awssdk.services.polly.PollyClient | 
| com.amazonaws.services.pricing.AWSPricingAsyncClient | software.amazon.awssdk.services.pricing.PricingAsyncClient | 
| com.amazonaws.services.pricing.AWSPricingClient | software.amazon.awssdk.services.pricing.PricingClient | 
| com.amazonaws.services.rds.AmazonRDSAsyncClient | software.amazon.awssdk.services.rds.RdsAsyncClient | 
| com.amazonaws.services.rds.AmazonRDSClient | software.amazon.awssdk.services.rds.RdsClient | 
| com.amazonaws.services.redshift.AmazonRedshiftAsyncClient | software.amazon.awssdk.services.redshift.RedshiftAsyncClient | 
| com.amazonaws.services.redshift.AmazonRedshiftClient | software.amazon.awssdk.services.redshift.RedshiftClient | 
| com.amazonaws.services.rekognition.AmazonRekognitionAsyncClient | software.amazon.awssdk.services.rekognition.RekognitionAsyncClient | 
| com.amazonaws.services.rekognition.AmazonRekognitionClient | software.amazon.awssdk.services.rekognition.RekognitionClient | 
| com.amazonaws.services.resourcegroups.AWSResourceGroupsAsyncClient | software.amazon.awssdk.services.resourcegroups.ResourceGroupsAsyncClient | 
| com.amazonaws.services.resourcegroups.AWSResourceGroupsClient | software.amazon.awssdk.services.resourcegroups.ResourceGroupsClient | 
| com.amazonaws.services.resourcegroupstaggingapi.AWSResourceGroupsTaggingAPIAsyncClient | software.amazon.awssdk.services.resourcegroupstaggingapi.ResourceGroupsTaggingApiAsyncClient | 
| com.amazonaws.services.resourcegroupstaggingapi.AWSResourceGroupsTaggingAPIClient | software.amazon.awssdk.services.resourcegroupstaggingapi.ResourceGroupsTaggingApiClient | 
| com.amazonaws.services.route53.AmazonRoute53AsyncClient | software.amazon.awssdk.services.route53.Route53AsyncClient | 
| com.amazonaws.services.route53.AmazonRoute53Client | software.amazon.awssdk.services.route53.Route53Client | 
| com.amazonaws.services.route53domains.AmazonRoute53DomainsAsyncClient | software.amazon.awssdk.services.route53domains.Route53DomainsAsyncClient | 
| com.amazonaws.services.route53domains.AmazonRoute53DomainsClient | software.amazon.awssdk.services.route53domains.Route53DomainsClient | 
| com.amazonaws.services.s3.AmazonS3Client | software.amazon.awssdk.services.s3.S3Client | 
| com.amazonaws.services.sagemaker.AmazonSageMakerAsyncClient | software.amazon.awssdk.services.sagemaker.SageMakerAsyncClient | 
| com.amazonaws.services.sagemaker.AmazonSageMakerClient | software.amazon.awssdk.services.sagemaker.SageMakerClient | 
| com.amazonaws.services.sagemakerruntime.AmazonSageMakerRuntimeAsyncClient | software.amazon.awssdk.services.sagemakerruntime.SageMakerRuntimeAsyncClient | 
| com.amazonaws.services.sagemakerruntime.AmazonSageMakerRuntimeClient | software.amazon.awssdk.services.sagemakerruntime.SageMakerRuntimeClient | 
| com.amazonaws.services.secretsmanager.AWSSecretsManagerAsyncClient | software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClient | 
| com.amazonaws.services.secretsmanager.AWSSecretsManagerClient | software.amazon.awssdk.services.secretsmanager.SecretsManagerClient | 
| com.amazonaws.services.securitytoken.AWSSecurityTokenServiceAsyncClient | software.amazon.awssdk.services.sts.StsAsyncClient | 
| com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient | software.amazon.awssdk.services.sts.StsClient | 
| com.amazonaws.services.serverlessapplicationrepository.AWSServerlessApplicationRepositoryAsyncClient | software.amazon.awssdk.services.serverlessapplicationrepository.ServerlessApplicationRepositoryAsyncClient | 
| com.amazonaws.services.serverlessapplicationrepository.AWSServerlessApplicationRepositoryClient | software.amazon.awssdk.services.serverlessapplicationrepository.ServerlessApplicationRepositoryClient | 
| com.amazonaws.services.servermigration.AWSServerMigrationAsyncClient | software.amazon.awssdk.services.sms.SmsAsyncClient | 
| com.amazonaws.services.servermigration.AWSServerMigrationClient | software.amazon.awssdk.services.sms.SmsClient | 
| com.amazonaws.services.servicecatalog.AWSServiceCatalogAsyncClient | software.amazon.awssdk.services.servicecatalog.ServiceCatalogAsyncClient | 
| com.amazonaws.services.servicecatalog.AWSServiceCatalogClient | software.amazon.awssdk.services.servicecatalog.ServiceCatalogClient | 
| com.amazonaws.services.servicediscovery.AWSServiceDiscoveryAsyncClient | software.amazon.awssdk.services.servicediscovery.ServiceDiscoveryAsyncClient | 
| com.amazonaws.services.servicediscovery.AWSServiceDiscoveryClient | software.amazon.awssdk.services.servicediscovery.ServiceDiscoveryClient | 
| com.amazonaws.services.shield.AWSShieldAsyncClient | software.amazon.awssdk.services.shield.ShieldAsyncClient | 
| com.amazonaws.services.shield.AWSShieldClient | software.amazon.awssdk.services.shield.ShieldClient | 
| com.amazonaws.services.simpledb.AmazonSimpleDBAsyncClient | software.amazon.awssdk.services.simpledb.SimpleDbAsyncClient | 
| com.amazonaws.services.simpledb.AmazonSimpleDBClient | software.amazon.awssdk.services.simpledb.SimpleDbClient | 
| com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceAsyncClient | software.amazon.awssdk.services.ses.SesAsyncClient | 
| com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient | software.amazon.awssdk.services.ses.SesClient | 
| com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementAsyncClient | software.amazon.awssdk.services.ssm.SsmAsyncClient | 
| com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementClient | software.amazon.awssdk.services.ssm.SsmClient | 
| com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowAsyncClient | software.amazon.awssdk.services.swf.SwfAsyncClient | 
| com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient | software.amazon.awssdk.services.swf.SwfClient | 
| com.amazonaws.services.snowball.AmazonSnowballAsyncClient | software.amazon.awssdk.services.snowball.SnowballAsyncClient | 
| com.amazonaws.services.snowball.AmazonSnowballClient | software.amazon.awssdk.services.snowball.SnowballClient | 
| com.amazonaws.services.sns.AmazonSNSAsyncClient | software.amazon.awssdk.services.sns.SnsAsyncClient | 
| com.amazonaws.services.sns.AmazonSNSClient | software.amazon.awssdk.services.sns.SnsClient | 
| com.amazonaws.services.sqs.AmazonSQSAsyncClient | software.amazon.awssdk.services.sqs.SqsAsyncClient | 
| com.amazonaws.services.sqs.AmazonSQSClient | software.amazon.awssdk.services.sqs.SqsClient | 
| com.amazonaws.services.stepfunctions.AWSStepFunctionsAsyncClient | software.amazon.awssdk.services.sfn.SfnAsyncClient | 
| com.amazonaws.services.stepfunctions.AWSStepFunctionsClient | software.amazon.awssdk.services.sfn.SfnClient | 
| com.amazonaws.services.storagegateway.AWSStorageGatewayAsyncClient | software.amazon.awssdk.services.storagegateway.StorageGatewayAsyncClient | 
| com.amazonaws.services.storagegateway.AWSStorageGatewayClient | software.amazon.awssdk.services.storagegateway.StorageGatewayClient | 
| com.amazonaws.services.support.AWSSupportAsyncClient | software.amazon.awssdk.services.support.SupportAsyncClient | 
| com.amazonaws.services.support.AWSSupportClient | software.amazon.awssdk.services.support.SupportClient | 
| com.amazonaws.services.transcribe.AmazonTranscribeAsyncClient | software.amazon.awssdk.services.transcribe.TranscribeAsyncClient | 
| com.amazonaws.services.transcribe.AmazonTranscribeClient | software.amazon.awssdk.services.transcribe.TranscribeClient | 
| com.amazonaws.services.translate.AmazonTranslateAsyncClient | software.amazon.awssdk.services.translate.TranslateAsyncClient | 
| com.amazonaws.services.translate.AmazonTranslateClient | software.amazon.awssdk.services.translate.TranslateClient | 
| com.amazonaws.services.waf.AWSWAFAsyncClient | software.amazon.awssdk.services.waf.WafAsyncClient | 
| com.amazonaws.services.waf.AWSWAFClient | software.amazon.awssdk.services.waf.WafClient | 
| com.amazonaws.services.waf.AWSWAFRegionalAsyncClient | software.amazon.awssdk.services.waf.regional.WafRegionalAsyncClient | 
| com.amazonaws.services.waf.AWSWAFRegionalClient | software.amazon.awssdk.services.waf.regional.WafRegionalClient | 
| com.amazonaws.services.workdocs.AmazonWorkDocsAsyncClient | software.amazon.awssdk.services.workdocs.WorkDocsAsyncClient | 
| com.amazonaws.services.workdocs.AmazonWorkDocsClient | software.amazon.awssdk.services.workdocs.WorkDocsClient | 
| com.amazonaws.services.workmail.AmazonWorkMailAsyncClient | software.amazon.awssdk.services.workmail.WorkMailAsyncClient | 
| com.amazonaws.services.workmail.AmazonWorkMailClient | software.amazon.awssdk.services.workmail.WorkMailClient | 
| com.amazonaws.services.workspaces.AmazonWorkspacesAsyncClient | software.amazon.awssdk.services.workspaces.WorkSpacesAsyncClient | 
| com.amazonaws.services.workspaces.AmazonWorkspacesClient | software.amazon.awssdk.services.workspaces.WorkSpacesClient | 
| com.amazonaws.services.xray.AWSXRayAsyncClient | software.amazon.awssdk.services.xray.XRayAsyncClient | 
| com.amazonaws.services.xray.AWSXRayClient | software.amazon.awssdk.services.xray.XRayClient | 

# クライアント作成のデフォルト
<a name="client-creation-defaults"></a>

バージョン 2.x では、デフォルトのクライアント作成ロジックに次の変更が加えられました。
+ S3 のデフォルトの認証情報プロバイダーチェーンには、匿名の認証情報が含まれなくなりました。`AnonymousCredentialsProvider` を使用して S3 に手動で匿名アクセスを指定する必要があります。
+ デフォルトのクライアント作成に関連する以下の環境変数には変更があります。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ デフォルトのクライアント作成に関連する以下のシステムプロパティには変更があります。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ バージョン 2.x では、次のシステムプロパティはサポートされていません。
+     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ カスタムの `endpoints.json` ファイルからリージョンの設定をロードすることはサポートされなくなりました。

# クライアント設定
<a name="client-configuration"></a>

1.x では、クライアントまたはクライアントビルダーで `ClientConfiguration` インスタンスを設定して、SDK クライアント設定が変更されていました。バージョン 2.x では、クライアント設定は別々の設定クラスに分割されています。別の設定クラスを使用することで、同期と非同期クライアントで異なる HTTP クライアントを設定したとしても、同じ `ClientOverrideConfiguration` クラスを使用できます。

**Example バージョン 1.x のクライアント設定の場合**  

```
AmazonDynamoDBClientBuilder.standard()
.withClientConfiguration(clientConfiguration)
.build()
```

**Example バージョン 2.x の同期クライアント設定の場合**  

```
ProxyConfiguration.Builder proxyConfig = ProxyConfiguration.builder();

ApacheHttpClient.Builder httpClientBuilder =
        ApacheHttpClient.builder()
                        .proxyConfiguration(proxyConfig.build());

ClientOverrideConfiguration.Builder overrideConfig =
        ClientOverrideConfiguration.builder();

DynamoDbClient client =
        DynamoDbClient.builder()
                      .httpClientBuilder(httpClientBuilder)
                      .overrideConfiguration(overrideConfig.build())
                      .build();
```

**Example バージョン 2.x の非同期クライアント設定の場合**  

```
NettyNioAsyncHttpClient.Builder httpClientBuilder =
        NettyNioAsyncHttpClient.builder();

ClientOverrideConfiguration.Builder overrideConfig =
        ClientOverrideConfiguration.builder();

ClientAsyncConfiguration.Builder asyncConfig =
        ClientAsyncConfiguration.builder();

DynamoDbAsyncClient client =
        DynamoDbAsyncClient.builder()
                           .httpClientBuilder(httpClientBuilder)
                           .overrideConfiguration(overrideConfig.build())
                           .asyncConfiguration(asyncConfig.build())
                           .build();
```

## HTTP クライアント
<a name="client-configuration-http"></a>

### 重要な変更点
<a name="client-configuration-http-notables"></a>
+ バージョン 2.x では、`clientBuilder.httpClientBuilder` を使用して実装を指定することで、ランタイムに使用する HTTP クライアントを変更できます。
+ `clientBuilder.httpClient` を使用して HTTP クライアントをサービスクライアントビルダーに渡すと、サービスクライアントが閉じても HTTP クライアントはデフォルトで閉じられません。これにより、サービスクライアント間で HTTP クライアントを共有できます。
+ 非同期 HTTP クライアントがノンブロッキング IO を使用するようになりました。
+ 一部のオペレーションでは、パフォーマンスを向上させるために HTTP/2 を使用するようになりました。

### 設定の変更
<a name="client-configuration-http-setting-diffs"></a>


| 設定 | 1.x | 2.x 同期、Apache | 2.x 非同期、Netty | 
| --- | --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig = <br />    new ClientConfiguration()</pre>  |  <pre>ApacheHttpClient.Builder httpClientBuilder = <br />    ApacheHttpClient.builder()</pre>  |  <pre>NettyNioAsyncHttpClient.Builder httpClientBuilder = <br />    NettyNioAsyncHttpClient.builder()</pre>  | 
| 最大接続数 |  <pre>clientConfig.setMaxConnections(...)<br />clientConfig.withMaxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConcurrency(...)</pre>  | 
| 接続タイムアウト |  <pre>clientConfig.setConnectionTimeout(...)<br />clientConfig.withConnectionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)<br />httpClientBuilder.connectionAcquisitionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)</pre>  | 
| ソケットタイムアウト |  <pre>clientConfig.setSocketTimeout(...)<br />clientConfig.withSocketTimeout(...)</pre>  |  <pre>httpClientBuilder.socketTimeout(...)</pre>  |  <pre>httpClientBuilder.writeTimeout(...)<br />httpClientBuilder.readTimeout(...)</pre>  | 
| 接続 TTL |  <pre>clientConfig.setConnectionTTL(...)<br />clientConfig.withConnectionTTL(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  | 
| 接続の最大アイドル |  <pre>clientConfig.setConnectionMaxIdleMillis(...)<br />clientConfig.withConnectionMaxIdleMillis(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  | 
| アイドル状態後の検証 |  <pre>clientConfig.setValidateAfterInactivityMillis(...)<br />clientConfig.withValidateAfterInactivityMillis(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| ローカルアドレス |  <pre>clientConfig.setLocalAddress(...)<br />clientConfig.withLocalAddress(...)</pre>  |  <pre>httpClientBuilder.localAddress(...)</pre>  | サポートされません | 
| Expect-continue が有効 |  <pre>clientConfig.setUseExpectContinue(...)<br />clientConfig.withUseExpectContinue(...)</pre>  |  <pre>httpClientBuilder.expectContinueEnabled(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| 接続リーパー |  <pre>clientConfig.setUseReaper(...)<br />clientConfig.withReaper(...)</pre>  |  <pre>httpClientBuilder.useIdleConnectionReaper(...)</pre>  |  <pre>httpClientBuilder.useIdleConnectionReaper(...)</pre>  | 
|  |  <pre>AmazonDynamoDBClientBuilder.standard()<br />    .withClientConfiguration(clientConfiguration)<br />    .build()</pre>  |  <pre>DynamoDbClient.builder()<br />    .httpClientBuilder(httpClientBuilder)<br />    .build()</pre>  |  <pre>DynamoDbAsyncClient.builder()<br />.httpClientBuilder(httpClientBuilder)<br />.build()</pre>  | 

## HTTP クライアントプロキシ
<a name="client-configuration-http-proxy"></a>


| 設定 | 1.x | 2.x 同期、Apache | 2.x 非同期、Netty | 
| --- | --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ProxyConfiguration.Builder proxyConfig =<br />    ProxyConfiguration.builder()</pre>  |  <pre>ProxyConfiguration.Builder proxyConfig =<br />    ProxyConfiguration.builder()</pre>  | 
| プロキシのホスト |  <pre>clientConfig.setProxyHost(...)<br />clientConfig.withProxyHost(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre>  |  <pre>proxyConfig.host(...)</pre>  | 
| プロキシのポート |  <pre>clientConfig.setProxyPort(...)<br />clientConfig.withProxyPort(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre> [プロキシポート](http-configuration-apache.md#http-configuration-apache-proxy-conf-ex)が `endpoint` に埋め込まれています  |  <pre>proxyConfig.port(...)</pre>  | 
| プロキシユーザー名 |  <pre>clientConfig.setProxyUsername(...)<br />clientConfig.withProxyUsername(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  | 
| プロキシのパスワード |  <pre>clientConfig.setProxyPassword(...)<br />clientConfig.withProxyPassword(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  | 
| プロキシのドメイン |  <pre>clientConfig.setProxyDomain(...)<br />clientConfig.withProxyDomain(...)</pre>  |  <pre>proxyConfig.ntlmDomain(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| プロキシのワークステーション |  <pre>clientConfig.setProxyWorkspace(...)<br />clientConfig.withProxyWorkstation(...)</pre>  |  <pre>proxyConfig.ntlmWorkstation(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| プロキシの認証方法 |  <pre>clientConfig.setProxyAuthenticationMethods(...)<br />clientConfig.withProxyAuthenticationMethods(...)</pre>  |  [サポートされていない](https://github.com/aws/aws-sdk-java-v2/issues/858)  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| プリエンプティブな基本プロキシ認証 |  <pre>clientConfig.setPreemptiveBasicProxyAuth(...)<br />clientConfig.withPreemptiveBasicProxyAuth(...)</pre>  |  <pre>proxyConfig.preemptiveBasicAuthenticationEnabled(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| 非プロキシホスト |  <pre>clientConfig.setNonProxyHosts(...)<br />clientConfig.withNonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  | 
| ソケットプロキシの無効化 |  <pre>clientConfig.setDisableSocketProxy(...)<br />clientConfig.withDisableSocketProxy(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|  |  <pre>AmazonDynamoDBClientBuilder.standard()<br />    .withClientConfiguration(clientConfiguration)<br />    .build()</pre>  |  <pre>httpClientBuilder.proxyConfiguration(<br />    proxyConfig.build())</pre>  |  <pre>httpClientBuilder.proxyConfiguration(<br />    proxyConfig.build())</pre>  | 

## クライアントの上書き
<a name="client-override-config-diffs"></a>


| 設定 | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfig =<br />    ClientOverrideConfiguration.builder()</pre>  | 
| ユーザーエージェントのプレフィックス |  <pre>clientConfig.setUserAgentPrefix(...)<br />clientConfig.withUserAgentPrefix(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.USER_AGENT_PREFIX, ...)</pre>  | 
| ユーザーエージェントのサフィックス |  <pre>clientConfig.setUserAgentSuffix(...)<br />clientConfig.withUserAgentSuffix(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.USER_AGENT_SUFFIX, ...)</pre>  | 
| Signer |  <pre>clientConfig.setSignerOverride(...)<br />clientConfig.withSignerOverride(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.SIGNER, ...)</pre>  | 
| 追加のヘッダー |  <pre>clientConfig.addHeader(...)<br />clientConfig.withHeader(...)</pre>  |  <pre>overrideConfig.putHeader(...)</pre>  | 
| リクエストタイムアウト |  <pre>clientConfig.setRequestTimeout(...)<br />clientConfig.withRequestTimeout(...)</pre>  |  <pre>overrideConfig.apiCallAttemptTimeout(...)</pre>  | 
| クライアントの実行タイムアウト |  <pre>clientConfig.setClientExecutionTimeout(...)<br />clientConfig.withClientExecutionTimeout(...)</pre>  |  <pre>overrideConfig.apiCallTimeout(...)</pre>  | 
| Gzip の使用 |  <pre>clientConfig.setUseGzip(...)<br />clientConfig.withGzip(...)</pre>  |  サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new))  | 
| ソケットバッファのサイズに関するヒント |  <pre>clientConfig.setSocketBufferSizeHints(...)<br />clientConfig.withSocketBufferSizeHints(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| レスポンスメタデータのキャッシュ |  <pre>clientConfig.setCacheResponseMetadata(...)<br />clientConfig.withCacheResponseMetadata(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| レスポンスメタデータのキャッシュサイズ |  <pre>clientConfig.setResponseMetadataCacheSize(...)<br />clientConfig.withResponseMetadataCacheSize(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| DNS リゾルバー |  <pre>clientConfig.setDnsResolver(...)<br />clientConfig.withDnsResolver(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| TCP キープアライブ |  <pre>clientConfig.setUseTcpKeepAlive(...)<br />clientConfig.withTcpKeepAlive(...)</pre>  |  このオプションは HTTP クライアント設定になりました <pre>- ApacheHttpClient.builder().tcpKeepAlive(true)<br />- NettyNioAsyncHttpClient.builder().tcpKeepAlive(true)</pre>  | 
| ランダムな保護 |  <pre>clientConfig.setSecureRandom(...)<br />clientConfig.withSecureRandom(...)</pre>  | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|  |  <pre>AmazonDynamoDBClientBuilder.standard()<br />    .withClientConfiguration(clientConfiguration)<br />    .build()</pre>  |  <pre>DynamoDbClient.builder()<br />    .overrideConfiguration(overrideConfig.build())<br />    .build()</pre>  | 

## クライアント上書きの再試行
<a name="client-override-retry-config-diffs"></a>


| 設定 | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfigBuilder = <br />    ClientOverrideConfiguration.builder();</pre>  | 
| 最大エラー再試行回数 |  <pre>clientConfig.setMaxErrorRetry(...)<br />clientConfig.withMaxErrorRetry(...)</pre>  |  <pre>// Configure the default retry strategy.<br />overrideConfigBuilder.retryStrategy(b -> b.maxAttempts(...));</pre>  | 
| スロットリングされた再試行の使用 |  <pre>clientConfig.setUseThrottleRetries(...)<br />clientConfig.withUseThrottleRetries(...)</pre>  | サポートされません | 
| スロットリング前の最大連続再試行回数 |  <pre>clientConfig.setMaxConsecutiveRetriesBeforeThrottling(...)<br />clientConfig.withMaxConsecutiveRetriesBeforeThrottling(...)</pre>  | サポートされません | 
|  |  <pre>AmazonDynamoDBClientBuilder.standard()<br />    .withClientConfiguration(clientConfiguration)<br />    .build()</pre>  |  <pre>DynamoDbClient.builder()<br />        .overrideConfiguration(overrideConfigBuilder.build())<br />        .build();<br /><br />// You also have the option to use a lambda expression to configure and<br />// build the 'ClientOverrideConfiguration.Builder'.<br />DynamoDbClient client = DynamoDbClient.builder()<br />        .overrideConfiguration(o -> o.retryStrategy(b -> b.maxAttempts(5)))<br />        .build();</pre>  | 

## 非同期クライアント
<a name="client-async-config-diffs"></a>


| 設定 | 1.x | 2.x | 
| --- | --- | --- | 
|  |  |  <pre>ClientAsyncConfiguration.Builder asyncConfig =<br />    ClientAsyncConfiguration.builder()</pre>  | 
| エグゼキュター |  <pre>AmazonDynamoDBAsyncClientBuilder.standard()<br />    .withExecutorFactory(...)<br />    .build()</pre>  |  <pre>asyncConfig.advancedOption(<br />    SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR, ...)</pre>  | 
|  |  |  <pre>DynamoDbAsyncClient.builder()<br />    .asyncConfiguration(asyncConfig)<br />    .build()</pre>  | 

## その他のクライアントの変更
<a name="client-config-other-diffs"></a>

1.x の次の `ClientConfiguration` オプションは SDK の 2.x で変更されており、直接同等のオプションはありません。


| 設定 | 1.x | 2.x の同等オプション | 
| --- | --- | --- | 
| プロトコル |  <pre>clientConfig.setProtocol(Protocol.HTTP)<br />clientConfig.withProtocol(Protocol.HTTP)</pre>  |  デフォルトでは、プロトコル設定は HTTPS です。設定を変更するには、クライアントビルダーで プロトコル設定に HTTP エンドポイントを指定します。 <pre>clientBuilder.endpointOverride(<br />    URI.create("http://..."))</pre>  | 

# 認証情報プロバイダーの変更
<a name="migration-client-credentials"></a>

このセクションでは、AWS SDK for Java のバージョン 1.x と 2.x 間の認証情報プロバイダクラスとメソッドの名前変更のマッピングを提供しています。

## 重要な相違点
<a name="client-credentials"></a>
+ デフォルトの認証情報プロバイダは、バージョン 2.x の環境変数前にシステムプロパティをロードします。詳細については、「[認証情報の使用](credentials.md)」を参照してください。
+ コンストラクタメソッドは、`create` あるいは `builder` メソッドで置き換えられます。  
**Example**  

  ```
  DefaultCredentialsProvider.create();
  ```
+ 非同期リフレッシュはデフォルトで設定されなくなりました。認証情報プロバイダーの `builder` で指定する必要があります。  
**Example**  

  ```
  ContainerCredentialsProvider provider = ContainerCredentialsProvider.builder()
          		.asyncCredentialUpdateEnabled(true)
          		.build();
  ```
+ `ProfileCredentialsProvider.builder()` を使用して、カスタムプロファイルファイルへのパスを指定できます。  
**Example**  

  ```
  ProfileCredentialsProvider profile = ProfileCredentialsProvider.builder()
          		.profileFile(ProfileFile.builder().content(Paths.get("myProfileFile.file")).build())
          		.build();
  ```
+ プロファイルのファイル形式がより AWS CLI に一致するように変更されました。詳細については、「*AWS Command Line Interface ユーザーガイド*」の「[AWS CLI の設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)」を参照してください。

## バージョン 1.x と 2.x 間でマッピングされた認証情報プロバイダの変更
<a name="credentials-changes-mapping"></a>

### `AWSCredentialsProvider`
<a name="credentials-provider-changes-AWSCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.AWSCredentialsProvider | software.amazon.awssdk.auth.credentials.AwsCredentialsProvider | 
| メソッド名 | getCredentials | resolveCredentials | 
| サポートされていないメソッド | refresh | サポートされません | 

### `DefaultAWSCredentialsProviderChain`
<a name="credentials-provider-changes-DefaultAWSCredentialsProviderChain"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider | 
| 作成 | new DefaultAWSCredentialsProviderChain | DefaultCredentialsProvider.create | 
| サポートされていないメソッド | getInstance | サポートされません | 
| 外部設定の優先順位 |  システムプロパティの前の環境変数  |  環境変数の前のシステムプロパティ  | 

### `AWSStaticCredentialsProvider`
<a name="credentials-provider-changes-AWSStaticCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.AWSStaticCredentialsProvider | software.amazon.awssdk.auth.credentials.StaticCredentialsProvider | 
| 作成 | new AWSStaticCredentialsProvider | StaticCredentialsProvider.create | 

### `EnvironmentVariableCredentialsProvider`
<a name="credentials-provider-changes-EnvironmentVariableCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.EnvironmentVariableCredentialsProvider | software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider | 
| 作成 | new EnvironmentVariableCredentialsProvider | EnvironmentVariableCredentialsProvider.create | 
| 環境変数名 | AWS\$1ACCESS\$1KEY | AWS\$1ACCESS\$1KEY\$1ID | 
|  | AWS\$1SECRET\$1KEY | AWS\$1SECRET\$1ACCESS\$1KEY | 

### `SystemPropertiesCredentialsProvider`
<a name="credentials-provider-changes-SystemPropertiesCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.SystemPropertiesCredentialsProvider | software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider | 
| 作成 | new SystemPropertiesCredentialsProvider | SystemPropertiesCredentialsProvider.create | 
| システムプロパティ名 | aws.secretKey | aws.secretAccessKey | 

### `ProfileCredentialsProvider`
<a name="credentials-provider-changes-ProfileCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.profile.ProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider | 
| 作成 | new ProfileCredentialsProvider | ProfileCredentialsProvider.create | 
| カスタムプロファイルの場所 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | 

### `ContainerCredentialsProvider`
<a name="credentials-provider-changes-ContainerCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.ContainerCredentialsProvider | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider | 
| 作成 | new ContainerCredentialsProvider | ContainerCredentialsProvider.create | 
| 非同期更新の指定 | サポートされません | デフォルトの動作 | 

### `InstanceProfileCredentialsProvider`
<a name="credentials-provider-changes-InstanceProfileCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.InstanceProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| 作成 | new InstanceProfileCredentialsProvider | InstanceProfileCredentialsProvider.create | 
| 非同期更新の指定 | new InstanceProfileCredentialsProvider(true) |  `InstanceProfileCredentialProvider.builder().asyncCredentialUpdateEnabled(true).build()`  | 
| システムプロパティ名 | com.amazonaws.sdk.disableEc2Metadata | aws.disableEc2Metadata | 
|  | com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | aws.ec2MetadataServiceEndpoint | 

### `STSAssumeRoleSessionCredentialsProvider`
<a name="credentials-provider-changes-STSAssumeRoleSessionCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider | 
| 作成 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | StsAssumeRoleCredentialsProvider.builder | 
| 非同期更新 | デフォルトの動作 | デフォルトの動作 | 
| 設定 | new STSAssumeRoleSessionCredentialsProvider.Builder | StsClient および AssumeRoleRequestリクエストの設定 | 

### `STSSessionCredentialsProvider`
<a name="credentials-provider-changes-STSSessionCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.STSSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsGetSessionTokenCredentialsProvider | 
| 作成 |  `new STSSessionCredentialsProvider`  | StsGetSessionTokenCredentialsProvider.builder | 
| 非同期更新 | デフォルトの動作 | StsGetSessionTokenCredentialsProvider.builder | 
| 設定 | コンストラクタのパラメータ | ビルダーでの StsClient と GetSessionTokenRequestリクエストの設定 | 

### `WebIdentityFederationSessionCredentialsProvider`
<a name="credentials-provider-changes-WebIdentityFederationSessionCredentialsProvider"></a>


| 変更カテゴリ | 1.x | 2.x | 
| --- | --- | --- | 
| パッケージ/クラス名 | com.amazonaws.auth.WebIdentityFederationSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleWithWebIdentityCredentialsProvider | 
| 作成 |  `new WebIdentityFederationSessionCredentialsProvider`  | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| 非同期更新 | デフォルトの動作 | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| 設定 | コンストラクタのパラメータ | ビルダーでの StsClient と AssumeRoleWithWebIdentityRequestリクエストの設定 | 

### 置換されたクラス
<a name="credentials-provider-changes-Replacements"></a>


| 1.x クラス | 2.x 置換クラス | 
| --- | --- | 
| com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider および software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider  | 
| com.amazonaws.services.s3.S3CredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider および software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider  | 

### 削除されたクラス
<a name="credentials-provider-changes-Removed"></a>


| 1.x クラス | 
| --- | 
| com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider | 
| com.amazonaws.auth.PropertiesFileCredentialsProvider | 

# リージョンの変更
<a name="migration-client-region"></a>

このセクションでは、`Region` と `Regions` クラスの使用に関する AWS SDK for Java 2.x における変更の導入を説明しています。

## リージョンの設定
<a name="region-configuration"></a>
+ 一部の AWS サービスにはリージョン固有のエンドポイントがありません。これらのサービスを使用している場合、リージョンを `Region.AWS_GLOBAL` または `Region.AWS_CN_GLOBAL` に設定する必要があります。  
**Example**  

  ```
  Region region = Region.AWS_GLOBAL;
  ```
+  `com.amazonaws.regions.Regions` と `com.amazonaws.regions.Region` クラスが 1 つのクラスである `software.amazon.awssdk.regions.Region` に結合されました。

## メソッドとクラス名のマッピング
<a name="region-method-mapping"></a>

次の表では、AWS SDK for Java の 1.x と 2.x 間のリージョン関連クラスをマッピングしています。上記のクラスのインスタンスを作成するには、`of()` メソッドを使用できます。

**Example**  

```
RegionMetadata regionMetadata = RegionMetadata.of(Region.US_EAST_1);
```


**1.x リージョンのクラスメソッドの変更**  

| 1.x | 2.x | 
| --- | --- | 
|  `Regions.fromName`  |  `Region.of`  | 
|  `Regions.getName`  |  `Region.id`  | 
|  `Regions.getDescription`  |  `Region.metadata().description()`  | 
|  `Regions.getCurrentRegion`  |  サポート外  | 
|  `Regions.DEFAULT_REGION`  |  サポート外  | 
|  `Regions.name`  |  `Region.id`  | 


**1.x リージョンのクラスメソッドの変更**  

| 1.x | 2.x | 
| --- | --- | 
|  `Region.getName`  |  `Region.id`  | 
|  `Region.hasHttpsEndpoint`  |  サポート外  | 
|  `Region.hasHttpEndpoint`  |  サポート外  | 
|  `Region.getAvailableEndpoints`  |  サポート外  | 
|  `Region.createClient`  |  サポート外  | 


**RegionMetadata class method changes**  

| 1.x | 2.x | 
| --- | --- | 
|  `RegionMetadata.getName`  |  `RegionMetadata.name`  | 
|  `RegionMetadata.getDomain`  |  `RegionMetadata.domain`  | 
|  `RegionMetadata.getPartition`  |  `RegionMetadata.partition`  | 


**ServiceMetadata class method changes**  

| 1.x | 2.x | 
| --- | --- | 
|  `Region.getServiceEndpoint`  |  `ServiceMetadata.endpointFor(Region)`  | 
|  `Region.isServiceSupported`  |  `ServiceMetadata.regions().contains(Region)`  | 

# オペレーション、リクエスト、レスポンスの変更
<a name="migration-operation-requests-responses"></a>

SDK for Java のバージョン 2 では、リクエストはクライアントオペレーションに渡されます。たとえば、 `DynamoDbClient's` `PutItemRequest` は `DynamoDbClient.putItem` オペレーションに渡されます。これらのオペレーションは AWS のサービス、 などの からのレスポンスを返します`PutItemResponse`。

SDK for Java のバージョン 2 には、バージョン 1 から次の変更があります。
+ 複数のレスポンスページを持つオペレーションに、レスポンス内のすべての項目を自動的にイテレーションする `Paginator` メソッドが追加されました。
+ リクエストとレスポンスを変更することはできません。
+ コンストラクタの代わりに静的ビルダーメソッドを使用してリクエストとレスポンスを作成する必要があります。たとえば、バージョン 1 の`new PutItemRequest().withTableName(...)` は `PutItemRequest.builder().tableName(...).build()` になりました。
+ オペレーションは、`dynamoDbClient.putItem(request -> request.tableName(...))` リクエストを作成する簡単な方法をサポートします。

以下のセクションでは、バージョン 1 とバージョン 2 の具体的な変更点について説明します。一部のパラメータタイプの変更は[移行ツール](migration-tool.md)を使用して自動的に変換できますが、その他の変更ではコードを手動で更新する必要があります。

# Date パラメータの変更
<a name="migration-date-parameters"></a>

バージョン 1 では、多くのオペレーションが時間ベースのパラメータに `java.util.Date` オブジェクトを受け入れます。バージョン 2 では、これらのオペレーションは代わりに `java.time.Instant` オブジェクトを使用します。

[移行ツールを使用して](migration-tool.md) `Date` パラメータを自動的に変換することも、 `Date` オブジェクトで `toInstant()` メソッドを呼び出すことで手動でパラメータを変換することもできます。

**Example - バージョン 1 で有効期限を持つ署名付き URL を生成する**  

```
// Generate a presigned URL that expires at a specific date
Date expiration = new Date(System.currentTimeMillis() + 3600000); // 1 hour from now
URL presignedUrl = s3Client.generatePresignedUrl(bucketName, keyName, expiration);
```

**Example - バージョン 2 で有効インスタントを持つ署名付き URL を生成する**  

```
// Generate a presigned URL that expires at a specific instant
Date expiration = new Date(System.currentTimeMillis() + 3600000); // 1 hour from now
PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(
    GetObjectPresignRequest.builder()
        .getObjectRequest(GetObjectRequest.builder()
            .bucket(bucketName)
            .key(keyName)
            .build())
        .signatureDuration(Duration.between(Instant.now(), expiration.toInstant()))
        .build());
```

# バイナリデータ処理の変更
<a name="migration-binary-data"></a>

バージョン 1 では、バイナリデータは `ByteBuffer` オブジェクトを使用して直接処理されていました。バージョン 2 では、SDK はバイナリデータを使用するためのより便利で型の安全性が高い方法を提供する `SdkBytes` オブジェクトを使用します。

[移行ツール](migration-tool.md)を使用して自動的に `SdkBytes` を `ByteBuffer` に変換することも、返された `SdkBytes` オブジェクトで `asByteBuffer()` を呼び出すことで手動で変換することもできます。

**Example - バージョン 1 でメッセージ属性からバイナリデータを取得する**  

```
// Get binary data from a message attribute
MessageAttributeValue messageAttributeValue = new MessageAttributeValue();
ByteBuffer binaryValue = messageAttributeValue.getBinaryValue();
String binaryString = new String(messageAttributeValue.getBinaryValue().array());
```

**Example - バージョン 2 でメッセージ属性からバイナリデータを取得する**  

```
// Get binary data from a message attribute
MessageAttributeValue messageAttributeValue = MessageAttributeValue.builder().build();
ByteBuffer binaryValue = messageAttributeValue.binaryValue().asByteBuffer();
String binaryString = new String(messageAttributeValue.binaryValue().asByteBuffer().array());
```

# タイムアウトパラメータの変更
<a name="migration-timeout-parameters"></a>

バージョン 1 では、タイムアウト値はミリ秒を表す整数値として指定されていました。バージョン 2 では、タイムアウトパラメータは `java.time.Duration` オブジェクトを使用して、型の安全性と明確性を向上させます。

数値によるタイムアウト値は、[移行ツールを使用して](migration-tool.md)自動的に変換することも、適切な `Duration` ファクトリメソッドで数値をラッピングして手動で変換することもできます。

**Example - バージョン 1 でリクエストタイムアウトを設定する**  

```
// Set request timeout in milliseconds
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setRequestTimeout(5000); // 5 seconds
```

**Example - バージョン 2 でリクエストタイムアウトを設定する**  

```
// Set request timeout using Duration
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setRequestTimeout(Duration.ofMillis(5000)); // 5 seconds

// Or more clearly:
clientConfiguration.setRequestTimeout(Duration.ofSeconds(5)); // 5 seconds
```

タイムアウト値には、次の `Duration` ファクトリメソッドを使用できます。
+ `Duration.ofMillis(long millis)` - ミリ秒値の場合。
+ `Duration.ofSeconds(long seconds)` - 秒値の場合。
+ `Duration.ofMinutes(long minutes)` - 分値の場合。

# の 1.x と 2.x のストリーミングオペレーションの違い AWS SDK for Java
<a name="migration-streaming-ops"></a>

Amazon S3 の `getObject` や `putObject` メソッドなどのストリーミングオペレーションは、 SDK のバージョン 2.x でノンブロッキング I/O をサポートしています。その結果、リクエストとレスポンスのモデルオブジェクトでは `InputStream` をパラメータとして使用しなくなりました。代わりに、同期リクエストのリクエストオブジェクトでは、バイト単位のストリームである `RequestBody` を受け付けるようになりました。非同期の場合は `AsyncRequestBody` を受け付けます。

**Example 1.x での Amazon S3 `putObject` オペレーション**  

```
s3client.putObject(BUCKET, KEY, new File(file_path));
```

**Example 2.x での Amazon S3 `putObject` オペレーション**  

```
s3client.putObject(PutObjectRequest.builder()
                                 .bucket(BUCKET)
                                 .key(KEY)
                                 .build(),
                 RequestBody.of(Paths.get("myfile.in")));
```

V2 では、ストリーミングレスポンスオブジェクトは同期クライアントで `ResponseTransformer` を受け付け、非同期クライアントで `AsyncResponseTransformer` を受け付けます。

**Example 1.x での Amazon S3 `getObject` オペレーション**  

```
S3Object o = s3.getObject(bucket, key);
S3ObjectInputStream s3is = o.getObjectContent();
FileOutputStream fos = new FileOutputStream(new File(key));
```

**Example 2.x での Amazon S3 `getObject` オペレーション**  

```
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(),
		ResponseTransformer.toFile(Paths.get("key")));
```

SDK for Java 2.x では、ストリーミングレスポンスオペレーションには、レスポンスをメモリにロードし、一般的なタイプのインメモリ変換を簡素化する `AsBytes` メソッドがあります。

# の 1.x と 2.x のシリアル化の違い AWS SDK for Java
<a name="migration-serialization-changes"></a>

## パラメータをリクエストするための List オブジェクトの違い
<a name="serialization-diffs-list-obj-to-req-param"></a>

SDK for Java v1.x と v2.x では、List オブジェクトをリクエストパラメータに対してシリアル化する方法が異なります。

SDK for Java 1.x は空のリストをシリアル化しませんが、 SDK for Java 2.x は空のリストを空のパラメータとしてシリアル化します。

たとえば、`SampleRequest` を取得する `SampleOperation` を使用するサービスを考えてみましょう。`SampleRequest` は、次の例に示すように、String 型 `str1` と List 型 `listParam` の 2 つのパラメータを受け入れます。

**Example 1.x の `SampleOperation` の例**  

```
SampleRequest v1Request = new SampleRequest()
    .withStr1("TestName");

sampleServiceV1Client.sampleOperation(v1Request);
```
ワイヤレベルのロギングでは、`listParam` パラメータがシリアル化されていないことが示されています。  

```
Action=SampleOperation&Version=2011-01-01&str1=TestName
```

**Example 2.x の `SampleOperation` の例**  

```
sampleServiceV2Client.sampleOperation(b -> b
    .str1("TestName"));
```
ワイヤレベルのロギングでは、値がないまま `listParam` パラメータがシリアル化されたことが示されています。  

```
Action=SampleOperation&Version=2011-01-01&str1=TestName&listParam=
```

## V1 の POJO と V2 のビルダーの比較
<a name="serialization-json-objects"></a>

V1 SDK for Java は変更可能な POJO クラスを使用するため、[Jackson](https://github.com/FasterXML/jackson-docs) などのシリアル化ライブラリと逆シリアル化ライブラリはモデルオブジェクトを直接使用できます。

対照的に、V2 SDK for Java は変更不可能なモデルオブジェクトを使用します。逆シリアル化/シリアル化を実行するには、中間ビルダーを使用する必要があります。

次の例は、Jackson `ObjectMapper` を使用して V1 と V2 で `headBucket` API コールを逆シリアル化/シリアル化する場合の違いを示しています。

```
    public void sendRequest() throws IOException {
        final String bucketName = "amzn-s3-demo-bucket";
        final ObjectMapper mapper = new ObjectMapper();

        // V1 uses POJOs to serialize and deserialize.
        final AmazonS3 v1S3Client = AmazonS3ClientBuilder.defaultClient();
        HeadBucketResult resultV1 = v1S3Client.headBucket(
            new HeadBucketRequest(bucketName));

        String v1Serialized = mapper.writeValueAsString(resultV1);

        HeadBucketResult deserializedV1 = mapper.readValue(v1Serialized, HeadBucketResult.class);
        
        // V2 uses builders to serialize and deserialize.
        S3Client v2S3Client = S3Client.create();
        HeadBucketResponse v2Response = v2S3Client.headBucket(
            b -> b.bucket(bucketName));

        String v2Serialized = mapper.writeValueAsString(
            v2Response.toBuilder());

        HeadBucketResponse v2Deserialized = mapper.readValue(
            v2Serialized, HeadBucketResponse.serializableBuilderClass())
            .build();
    }
```

# の 1.x と 2.x の逆シリアル化の違い AWS SDK for Java
<a name="migration-deserialization-changes"></a>

## V2 の空のコレクションと V1 の `nulls` の比較
<a name="deserialization-diffs-list-obj-to-req-param"></a>

SDK for Java v1.x と v2.x では、空のリストとマップを使用して JSON レスポンスを逆シリアル化する方法が異なります。

SDK がリストまたはマップとしてモデル化されたプロパティが欠落したレスポンスを受信すると、V1 は欠落したプロパティを `null` に逆シリアル化しますが、V2 はプロパティを変更不可能な空のコレクションオブジェクトに逆シリアル化します。

たとえば、DynamoDB クライアントから `describeTable` メソッドに対して返されたレスポンスを考えてみましょう。次のメソッドの例には、グローバルセカンダリインデックスを持たないテーブルで `describeTable` メソッドを実行する V2 DynamoDB クライアントと V1 DynamoDB クライアントの両方が含まれています。

**Example レスポンスで欠落している、リストとしてモデル化されたプロパティの逆シリアル化**  

```
public void deserializationDiffs(){

    DescribeTableResponse v2Response = dynamoDbClientV2.describeTable(builder -> builder.tableName(TABLE_NAME));
    // V2 provides has* methods on model objects for list/map members. No null check needed.
    LOGGER.info( String.valueOf(v2Response.table().hasGlobalSecondaryIndexes()) );
    LOGGER.info( String.valueOf(v2Response.table().globalSecondaryIndexes().isEmpty()) );
    // V2 deserialize to an empty collection.
    LOGGER.info(v2Response.table().globalSecondaryIndexes().toString());

    // V1 deserialize to null.
    DescribeTableResult v1Result = dynamoDbClientV1.describeTable(new DescribeTableRequest(TABLE_NAME));
    if (v1Result.getTable().getGlobalSecondaryIndexes() != null){
        LOGGER.info(v1Result.getTable().getGlobalSecondaryIndexes().toString());
    } else {
        LOGGER.info("The list of global secondary indexes returned by the V1 call is <null>");
    }
}
```
以下は、ログ記録された出力を示しています。  

```
INFO  org.example.DeserializationDifferences:45 - false
INFO  org.example.DeserializationDifferences:46 - true
INFO  org.example.DeserializationDifferences:48 - []
INFO  org.example.DeserializationDifferences:55 - The list of global secondary indexes returned by the V1 call is <null>
```

Java SDK 2.x は、`null` を返すのではなく、空のリストとマップを変更不可能な空のコレクションに逆シリアル化することで、より安全で簡潔なコードを促進するという慣用的なアプローチを採用しています。V2 では、前の例に示した `hasGlobalSecondaryIndexes` のように、`has*` メソッドを使用してサービスがリストまたはマップとしてモデル化された属性を返したかを確認できます。

このアプローチは、明示的な `null` チェックが不要になるため、存在しないデータ構造や空のデータ構造を処理するための最新の Java のベストプラクティスに沿ったものとなっています。

### 完全な例
<a name="full-example-deserialization"></a>

```
package org.example;

import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.BillingMode;
import software.amazon.awssdk.services.dynamodb.model.DescribeTableResponse;
import software.amazon.awssdk.services.dynamodb.model.KeyType;
import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;

import java.util.UUID;

public class DeserializationDifferences {
    private static final Logger LOGGER = LoggerFactory.getLogger(DeserializationDifferences.class);
    private static final String TABLE_NAME = "DeserializationTable-" + UUID.randomUUID();
    DynamoDbClient dynamoDbClientV2 = DynamoDbClient.create();
    AmazonDynamoDB dynamoDbClientV1 = AmazonDynamoDBClientBuilder.standard().withRegion(Regions.US_EAST_1).build();

    public static void main(String[] args) {

        DeserializationDifferences difference = new DeserializationDifferences();
        difference.createTable();
        difference.deserializationDiffs();
        difference.deleteTable();
    }

    public void createTable(){
        dynamoDbClientV2.createTable(b -> b
                .billingMode(BillingMode.PAY_PER_REQUEST)
                .tableName(TABLE_NAME)
                .keySchema(b1 -> b1.attributeName("Id").keyType(KeyType.HASH))
                .attributeDefinitions(b2 -> b2.attributeName("Id").attributeType(ScalarAttributeType.S)));
        dynamoDbClientV2.waiter().waitUntilTableExists(b -> b.tableName(TABLE_NAME));
    }

    public void deserializationDiffs(){

        DescribeTableResponse v2Response = dynamoDbClientV2.describeTable(builder -> builder.tableName(TABLE_NAME));
        // V2 provides has* methods on model objects for list/map members. No null check needed.
        LOGGER.info( String.valueOf(v2Response.table().hasGlobalSecondaryIndexes()) );
        LOGGER.info( String.valueOf(v2Response.table().globalSecondaryIndexes().isEmpty()) );
        // V2 deserialize to an empty collection.
        LOGGER.info(v2Response.table().globalSecondaryIndexes().toString());

        // V1 deserialize to null.
        DescribeTableResult v1Result = dynamoDbClientV1.describeTable(new DescribeTableRequest(TABLE_NAME));
        if (v1Result.getTable().getGlobalSecondaryIndexes() != null){
            LOGGER.info(v1Result.getTable().getGlobalSecondaryIndexes().toString());
        } else {
            LOGGER.info("The list of global secondary indexes returned by the V1 call is <null>");
        }
    }

    public void deleteTable(){
        dynamoDbClientV2.deleteTable(b -> b.tableName(TABLE_NAME));
        dynamoDbClientV2.waiter().waitUntilTableNotExists(b -> b.tableName(TABLE_NAME));
    }
}
```

V1 および V2 クライアントからの `describeTable` メソッドの JSON レスポンスには、 `GlobalSecondaryIndexes` 属性が含まれていません。

```
{
  "Table": {
    "AttributeDefinitions": [
      {
        "AttributeName": "Id",
        "AttributeType": "S"
      }
    ],
    "BillingModeSummary": {
      "BillingMode": "PAY_PER_REQUEST",
      "LastUpdateToPayPerRequestDateTime": ...
    },
    "CreationDateTime": ...,
    "DeletionProtectionEnabled": false,
    "ItemCount": 0,
    "KeySchema": [
      {
        "AttributeName": "Id",
        "KeyType": "HASH"
      }
    ],
    "ProvisionedThroughput": {
      "NumberOfDecreasesToday": 0,
      "ReadCapacityUnits": 0,
      "WriteCapacityUnits": 0 
    },
    "TableArn": "arn:aws:dynamodb:us-east-1:11111111111:table/DeserializationTable-...",
    "TableId": "...",
    "TableName": "DeserializationTable-...",
    "TableSizeBytes": 0,
    "TableStatus": "ACTIVE",
    "TableThroughputModeSummary": {
      "LastUpdateToPayPerRequestDateTime": ...,
      "TableThroughputMode": "PAY_PER_REQUEST"
    },
    "WarmThroughput": {
      "ReadUnitsPerSecond": 12000,
      "Status": "ACTIVE",
      "WriteUnitsPerSecond": 4000
    }
  }
}
```

# 例外変更
<a name="migration-exception-changes"></a>

例外クラス名、およびその構成と関係が変更されました。`software.amazon.awssdk.core.exception.SdkException` は、他のすべての例外が拡張する新しいベース `Exception` クラスです。

この表では、例外クラス名の変更をマッピングしています。


| 1.x | 2.x | 
| --- | --- | 
|   `com.amazonaws.SdkBaseException` `com.amazonaws.AmazonClientException`   |   `software.amazon.awssdk.core.exception.SdkException`   | 
|   `com.amazonaws.SdkClientException`   |   `software.amazon.awssdk.core.exception.SdkClientException`   | 
|   `com.amazonaws.AmazonServiceException`   |   `software.amazon.awssdk.awscore.exception.AwsServiceException`   | 

以下の表では、バージョン 1.x と 2.x 間の例外クラスのメソッドをマッピングしています。


| 1.x | 2.x | 
| --- | --- | 
|   `AmazonServiceException.getRequestId`   |   `SdkServiceException.requestId`   | 
|   `AmazonServiceException.getServiceName`   |   `AwsServiceException.awsErrorDetails().serviceName`   | 
|   `AmazonServiceException.getErrorCode`   |   `AwsServiceException.awsErrorDetails().errorCode`   | 
|   `AmazonServiceException.getErrorMessage`   |   `AwsServiceException.awsErrorDetails().errorMessage`   | 
|   `AmazonServiceException.getStatusCode`   |   `AwsServiceException.awsErrorDetails().sdkHttpResponse().statusCode`   | 
|   `AmazonServiceException.getHttpHeaders`   |   `AwsServiceException.awsErrorDetails().sdkHttpResponse().headers`   | 
|   `AmazonServiceException.rawResponse`   |   `AwsServiceException.awsErrorDetails().rawResponse`   | 

# サービス固有の変更
<a name="migration-service-changes"></a>

## Amazon S3 の変更
<a name="s3-operations-name"></a>

SDK for Java 2.x では、デフォルトで匿名アクセスが無効になっています。そのため、`AnonymousCredentialsProvider` を使用して匿名アクセスを有効にする必要があります。

### オペレーション名の変更
<a name="s3-op-name-changes"></a>

Amazon S3 クライアントの多くのオペレーション名は、AWS SDK for Java 2.x で変更されました。バージョン 1.x では、Amazon S3 クライアントはサービス API から直接生成されません。その結果、SDK オペレーションとサービス API 間で不整合が発生しました。バージョン 2.x では、サービス API に対してより互換性がある Amazon S3 クライアントを生成するようになりました。

次の表は、2 つのバージョンのオペレーション名を示しています。


**Amazon S3 のオペレーション名**  

| 1.x | 2.x | 
| --- | --- | 
| abortMultipartUpload | abortMultipartUpload | 
| changeObjectStorageClass  | copyObject | 
| completeMultipartUpload  | completeMultipartUpload | 
| copyObject | copyObject | 
| copyPart | uploadPartCopy | 
| createBucket | createBucket | 
| deleteBucket | deleteBucket | 
| deleteBucketAnalyticsConfiguration | deleteBucketAnalyticsConfiguration | 
| deleteBucketCrossOriginConfiguration | deleteBucketCors | 
| deleteBucketEncryption | deleteBucketEncryption | 
| deleteBucketInventoryConfiguration | deleteBucketInventoryConfiguration | 
| deleteBucketLifecycleConfiguration | deleteBucketLifecycle | 
| deleteBucketMetricsConfiguration | deleteBucketMetricsConfiguration | 
| deleteBucketPolicy | deleteBucketPolicy | 
| deleteBucketReplicationConfiguration | deleteBucketReplication | 
| deleteBucketTaggingConfiguration | deleteBucketTagging | 
| deleteBucketWebsiteConfiguration | deleteBucketWebsite | 
| deleteObject | deleteObject | 
| deleteObjectTagging | deleteObjectTagging | 
| deleteObjects | deleteObjects | 
| deleteVersion | deleteObject | 
| disableRequesterPays | putBucketRequestPayment | 
| doesBucketExist | headBucket | 
| doesBucketExistV2 | headBucket | 
| doesObjectExist | headObject | 
| enableRequesterPays | putBucketRequestPayment | 
| generatePresignedUrl | [S3Presigner](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/presigner/S3Presigner.html) | 
| getBucketAccelerateConfiguration | getBucketAccelerateConfiguration | 
| getBucketAcl | getBucketAcl | 
| getBucketAnalyticsConfiguration | getBucketAnalyticsConfiguration | 
| getBucketCrossOriginConfiguration | getBucketCors | 
| getBucketEncryption | getBucketEncryption | 
| getBucketInventoryConfiguration | getBucketInventoryConfiguration | 
| getBucketLifecycleConfiguration | getBucketLifecycle-または-getBucketLifecycleConfiguration | 
| getBucketLocation | getBucketLocation | 
| getBucketLoggingConfiguration | getBucketLogging | 
| getBucketMetricsConfiguration | getBucketMetricsConfiguration | 
| getBucketNotificationConfiguration | getBucketNotification-または-getBucketNotificationConfiguration | 
| getBucketPolicy | getBucketPolicy | 
| getBucketReplicationConfiguration | getBucketReplication | 
| getBucketTaggingConfiguration | getBucketTagging | 
| getBucketVersioningConfiguration | getBucketVersioning | 
| getBucketWebsiteConfiguration | getBucketWebsite | 
| getObject | getObject | 
| getObjectAcl | getObjectAcl | 
| getObjectAsString | getObjectAsBytes().asUtf8String | 
| getObjectMetadata | headObject | 
| getObjectTagging | getObjectTagging | 
| getResourceUrl | [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Utilities.html#getUrl(java.util.function.Consumer)](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Utilities.html#getUrl(java.util.function.Consumer)) | 
| getS3AccountOwner | listBuckets | 
| getUrl | [S3Utilities\$1getUrl](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Utilities.html#getUrl(java.util.function.Consumer)) | 
| headBucket | headBucket | 
| initiateMultipartUpload | createMultipartUpload | 
| isRequesterPaysEnabled | getBucketRequestPayment | 
| listBucketAnalyticsConfigurations | listBucketAnalyticsConfigurations | 
| listBucketInventoryConfigurations | listBucketInventoryConfigurations | 
| listBucketMetricsConfigurations | listBucketMetricsConfigurations | 
| listBuckets | listBuckets | 
| listMultipartUploads | listMultipartUploads | 
| listNextBatchOfObjects | listObjectsV2Paginator | 
| listNextBatchOfVersions | listObjectVersionsPaginator | 
| listObjects | listObjects | 
| listObjectsV2 | listObjectsV2 | 
| listParts | listParts | 
| listVersions | listObjectVersions | 
| putObject | putObject | 
| restoreObject | restoreObject | 
| restoreObjectV2 | restoreObject | 
| selectObjectContent | selectObjectContent | 
| setBucketAccelerateConfiguration | putBucketAccelerateConfiguration | 
| setBucketAcl | putBucketAcl | 
| setBucketAnalyticsConfiguration | putBucketAnalyticsConfiguration | 
| setBucketCrossOriginConfiguration | putBucketCors | 
| setBucketEncryption | putBucketEncryption | 
| setBucketInventoryConfiguration | putBucketInventoryConfiguration | 
| setBucketLifecycleConfiguration | putBucketLifecycle-または-putBucketLifecycleConfiguration | 
| setBucketLoggingConfiguration | putBucketLogging | 
| setBucketMetricsConfiguration | putBucketMetricsConfiguration | 
| setBucketNotificationConfiguration | putBucketNotification-または-putBucketNotificationConfiguration | 
| setBucketPolicy | putBucketPolicy | 
| setBucketReplicationConfiguration | putBucketReplication | 
| setBucketTaggingConfiguration | putBucketTagging | 
| setBucketVersioningConfiguration | putBucketVersioning | 
| setBucketWebsiteConfiguration | putBucketWebsite | 
| setObjectAcl | putObjectAcl | 
| setObjectRedirectLocation | copyObject | 
| setObjectTagging | putObjectTagging | 
| uploadPart | uploadPart | 

## Amazon SNS の変更
<a name="sns-changes"></a>

SNS クライアントは、アクセスするように設定されたリージョン以外のリージョンの SNS トピックにアクセスできなくなりました。

## Amazon SQS の変更
<a name="sqs-changes"></a>

SQS クライアントは、アクセスするように設定されたリージョン以外のリージョンの SQS キューにアクセスできなくなりました。

## Amazon RDS の変更
<a name="rds-changes"></a>

SDK for Java 2.x は、1.x の クラス `RdsIamAuthTokenGenerator` の代わりに `RdsUtilities#generateAuthenticationToken` を使用します。

# Amazon S3 の使用における のバージョン 1 からバージョン 2 への変更 AWS SDK for Java
<a name="migration-s3"></a>

は、新しいパッケージ構造、更新されたクラス名、改訂されたメソッド署名など、S3 クライアントに大きな変更 AWS SDK for Java 2.x を導入します。[移行ツールを使用して](migration-tool.md)多くのメソッドを V1 から V2 に自動的に移行できますが、 `listNextBatchOfObjects` や `selectObjectContent` など、手動移行が必要なメソッドもあります。さらに、V2 は `AccessControlList` や `CannedAccessControlList` などの特定の V1 クラスを新しい実装に置き換えます。

**Topics**
+ [のバージョン 1 とバージョン 2 の S3 クライアントの違い AWS SDK for Java](migration-s3-client.md)
+ [Transfer Manager を のバージョン 1 からバージョン 2 に移行する AWS SDK for Java](migration-s3-transfer-manager.md)
+ [バージョン 1 からバージョン 2 での Amazon S3 URI の解析の変更](migration-s3-uri-parser.md)
+ [バージョン 1 からバージョン 2 での S3 イベント通知 API の変更](migration-s3-event-notification.md)

# のバージョン 1 とバージョン 2 の S3 クライアントの違い AWS SDK for Java
<a name="migration-s3-client"></a>

このトピックでは、SDK for Java のバージョン 1 とバージョン 2 の S3 クライアントの違いは、[移行ツール](migration-tool.md)が移行を自動化する方法によって整理されています。移行ツールはほとんどのメソッドの V1 から V2 への移行をサポートしていますが、一部のメソッドは手動移行が必要です。S3 クライアントメソッドに加えて、一部の S3 V1 クラスは直接相当するものが V2 にないため、手動で移行する必要があります。

**Contents**
+ [移行ツールでサポートされている V1 メソッドの例](#methods-tool-migration)
  + [`putObject`](#V1-V2-putobject)
  + [`getObject`](#V1-V2-getobject)
+ [手動移行が必要な V1 メソッド](#s3-methods-manual-migration)
  + [`S3ObjectId` を使用する `getObject`](#V1s-getObject-using-V1s-S3ObjectId)
  + [`ObjectMetadata` を使用する `getETag`](#V1s-ObjectMetadata-using-V1s-getETag)
  + [`listNextBatchOfObjects`](#V1-listNextBatchOfObjects)
  + [`listNextBatchOfVersions`](#V1-listNextBatchOfVersions)
  + [`selectObjectContent`](#V1-selectObjectContent)
  + [`setBucketAcl`](#V1-setBucketAcl)
  + [`setObjectAcl`](#V1-setObjectAcl)
  + [`initiateMultipartUpload`](#V1-initiateMultipartUpload)
    + [移行の例](#V1-initiateMultipartUpload-migration-ex)
    + [実装の相違点](#V1-initiateMultipartUpload-impl-diffs)
  + [`setRegion`](#V1-setRegion)
  + [`setS3ClientOptions(S3ClientOptions clientOptions)`](#V1-setS3ClientOptions)
  + [`setBucketLoggingConfiguration`](#V1-setBucketLoggingConfiguration)
  + [`setBucketLifecycleConfiguration`](#V1-setBucketLifecycleConfiguration)
  + [`setBucketTaggingConfiguration`](#V1-setBucketTaggingConfiguration)
+ [手動移行が必要な V1 クラス](#s3-classes-manual-migration)
  + [`AccessControlList`](#V1-AccessControlList)
  + [`CannedAccessControlList`](#V1-CannedAccessControlList)
  + [`BucketNotificationConfiguration`](#V1-BucketNotificationConfiguration)
  + [`MultiFactorAuthentication`](#V1-MultifactorAuthentication)

## 移行ツールでサポートされている V1 メソッドの例
<a name="methods-tool-migration"></a>

移行ツールは、ほとんどのメソッドを V1 から V2 に自動的に移行します。`putObject` メソッドと `getObject` メソッドはその例です。

### `putObject`
<a name="V1-V2-putobject"></a>

```
// SDK V1
s3Client.putObject("amzn-s3-demo-bucket", "my-key", "Hello World!");


// SDK V2
s3Client.putObject(req -> req 
    .bucket("amzn-s3-demo-bucket") 
    .key("my-key"), 
    RequestBody.fromString("Hello World!"));
```

### `getObject`
<a name="V1-V2-getobject"></a>

```
// SDK V1
S3Object object = s3Client.getObject("amzn-s3-demo-bucket", "my-key");
InputStream content = object.getObjectContent();


// SDK V2
ResponseInputStream<GetObjectResponse> response = s3Client.getObject(req -> req 
    .bucket("amzn-s3-demo-bucket") 
    .key("my-key"));
```

## 手動移行が必要な V1 メソッド
<a name="s3-methods-manual-migration"></a>

次の V1 S3 クライアントメソッドは手動で移行する必要があります。移行ツールを使用すると、このトピックに誘導するコメントが V2 の出力 Java ファイルに表示されます。

### V1 の `S3ObjectId` から V2 の `GetObjectRequest.builder()` を使用した V1 の `getObject`
<a name="V1s-getObject-using-V1s-S3ObjectId"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
        .withRegion(Regions.US_WEST_2)
        .build();

S3ObjectId s3ObjectId = new S3ObjectId(
    "amzn-s3-demo-bucket",
    "object-key",
    "abc123version" 
);

GetObjectRequest getRequest= new GetObjectRequest(s3ObjectId);
S3Object s3ObjectVersioned = s3Client.getObject(getRequest);


// SDK V2
// V2 does not include a 'S3ObjectId' class. V2 uses the request builder pattern 
// to supply the bucket, key, and version parameters.
S3Client s3Client = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

GetObjectRequest getRequest = GetObjectRequest.builder()
    .bucket("amzn-s3-demo-bucket")
    .key("object-key")
    .versionId("abc123version")
    .build();

ResponseInputStream<GetObjectResponse> response = s3Client.getObject(getRequest);
```

### V1 の `ObjectMetadata` から V2 の `GetObjectResponse.eTag()` を使用した V1 の `getETag()`
<a name="V1s-ObjectMetadata-using-V1s-getETag"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

S3Object object = s3ClientV1.getObject("amzn-s3-demo-bucket", "my-key");

// Double quotes are removed by the S3 client.
System.out.println(object.getObjectMetadata().getETag());

// SDK V2
S3Client s3ClientV2 = S3Client.builder()
        .region(Region.US_WEST_2)
        .build();

ResponseInputStream<GetObjectResponse> response = s3ClientV2.getObject(
        req -> req.bucket("amzn-s3-demo-bucket").key("my-key"));

// Double quotes are *NOT* removed. This is the unchanged ETag value as S3 sent it.
System.out.println(response.response().eTag());
```

### V1 の `listNextBatchOfObjects` から V2 の `listObjectsV2Paginator`
<a name="V1-listNextBatchOfObjects"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

ObjectListing objectListing = s3ClientV1.listObjects("bucket-name");
while (objectListing.isTruncated()) {
    objectListing = s3ClientV1.listNextBatchOfObjects(objectListing);
    for (S3ObjectSummary summary : objectListing.getObjectSummaries()) {
        System.out.println(summary.getKey());
    }
}


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

ListObjectsV2Request request = ListObjectsV2Request.builder()
    .bucket("bucket-name")
    .build();

// V2 returns a paginator.
ListObjectsV2Iterable responses = s3Client.listObjectsV2Paginator(request);

for (ListObjectsV2Response page : responses) {
    page.contents().forEach(content -> {
        System.out.println(content.key());
    });
}
```

### V1 の `listNextBatchOfVersions` から V2 の `listObjectVersionsPaginator`
<a name="V1-listNextBatchOfVersions"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

VersionListing versionListing = s3ClientV1.listVersions("bucket-name", "prefix");
while (versionListing.isTruncated()) {
    versionListing = s3ClientV1.listNextBatchOfVersions(versionListing);
    for (S3VersionSummary version : versionListing.getVersionSummaries()) {
        System.out.println(version.getKey() + " " + version.getVersionId());
    }
}


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

ListObjectVersionsRequest request = ListObjectVersionsRequest.builder()
    .bucket("bucket-name")
    .prefix("prefix")
    .build();

// V2 returns a paginator.
ListObjectVersionsIterable responses = s3ClientV2.listObjectVersionsPaginator(request);

for (ListObjectVersionsResponse page : responses) {
    page.versions().forEach(version -> {
        System.out.println(version.key() + " " + version.versionId());
    });
}
```

### `selectObjectContent`
<a name="V1-selectObjectContent"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

SelectObjectContentRequest request = new SelectObjectContentRequest()
    .withBucket("bucket-name")
    .withKey("object-key")
    .withExpression("select * from S3Object")
    .withExpressionType(ExpressionType.SQL)
 

SelectObjectContentResult result = s3ClientV1.selectObjectContent(request);
InputStream resultInputStream = result.getPayload().getRecordsInputStream();


// SDK V2
// In V2, 'selectObjectContent()' is available only on the S3AsyncClient. 
// V2 handles responses using an event-based 'SelectObjectContentEventStream'.
S3AsyncClient s3ClientV2 = S3AsyncClient.builder()
    .region(Region.US_WEST_2)
    .build();

SelectObjectContentRequest request = SelectObjectContentRequest.builder()
    .bucket("bucket-name")
    .key("object-key")
    .expression("select * from S3Object")
    .expressionType(ExpressionType.SQL)
    .build();
    
SelectObjectContentResponseHandler handler = new SelectObjectContentResponseHandler() {
    // Implement the required abstract methods such as 'onEventStream()'.
};

CompletableFuture<Void> future = s3ClientV2.selectObjectContent(request, handler);
// The 'SelectObjectContentResponseHandler' implementation processes the results.
```

### `PutBucketAclRequest.builder()` での V1 の `setBucketAcl` から V2 の `acl` メソッド
<a name="V1-setBucketAcl"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

AccessControlList acl = new AccessControlList();
acl.grantPermission(GroupGrantee.AllUsers, Permission.Read);
s3ClientV1.setBucketAcl("bucket-name", acl);


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

PutBucketAclRequest request = PutBucketAclRequest.builder()
    .bucket("bucket-name")
    .acl(BucketCannedACL.PRIVATE)
    .build();

s3ClientV2.putBucketAcl(request);
```

### `PutObjectAclRequest.builder()` での V1 の `setObjectAcl` から V2 の `acl` メソッド
<a name="V1-setObjectAcl"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

AccessControlList acl = new AccessControlList();
acl.grantPermission(GroupGrantee.AllUsers, Permission.Read);
s3ClientV1.setObjectAcl("bucket-name", "object-key", acl);


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

PutObjectAclRequest request = PutObjectAclRequest.builder()
    .bucket("bucket-name")
    .key("object-key")
    .acl(ObjectCannedACL.PRIVATE)
    .build();

s3ClientV2.putObjectAcl(request);
```

### V1 の `initiateMultipartUpload` から V2 の `createMultipartUpload`
<a name="V1-initiateMultipartUpload"></a>

#### 移行の例
<a name="V1-initiateMultipartUpload-migration-ex"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();
    
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/zip");
metadata.addUserMetadata("mykey", "myvalue");

InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(
    "bucket-name", 
    "object-key",
    metadata
);

InitiateMultipartUploadResult initResponse = s3ClientV1.initiateMultipartUpload(initRequest);
String uploadId = initResponse.getUploadId();


// SDK V2
// V1 uses ObjectMetadata methods, whereas V2 uses a simple Map.
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

CreateMultipartUploadRequest createMultipartRequest = CreateMultipartUploadRequest.builder() 
    .bucket("amzn-s3-demo-bucket") 
    .key("object-key") 
    .contentType("application/zip") 
    .metadata(Collections.singletonMap("mykey", "myvalue"))
    .build();

CreateMultipartUploadResponse response = s3ClientV2.createMultipartUpload(createMultipartRequest);
String uploadId = response.uploadId();
```

#### 実装の相違点
<a name="V1-initiateMultipartUpload-impl-diffs"></a>

以下の表に示すように、次のメソッドのデフォルトの `Content-Type` ヘッダー値が異なります。


****  

| SDK のバージョン | Method | デフォルトの `Content-Type` 値 | 
| --- | --- | --- | 
| バージョン 1 | [initiateMultipartUpload](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#initiateMultipartUpload-com.amazonaws.services.s3.model.InitiateMultipartUploadRequest-) | application/octet-stream | 
| バージョン 2 | [createMultipartUpload](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html#createMultipartUpload(software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest)) | binary/octet-stream | 

### クライアントビルダーでの V1 の `setRegion` から V2 の `region` メソッド
<a name="V1-setRegion"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard().build();
s3ClientV1.setRegion(Region.getRegion(Regions.US_WEST_2));


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();
```

### V1 の `setS3ClientOptions(S3ClientOptions clientOptions)`
<a name="V1-setS3ClientOptions"></a>

`setS3ClientOptions` メソッドで単一の `S3ClientOptions` オブジェクトを使用する代わりに、V2 はクライアントビルダーでオプションを設定するメソッドを提供します。

### V1 の `setBucketLoggingConfiguration` から V2 の `putBucketLogging`
<a name="V1-setBucketLoggingConfiguration"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

BucketLoggingConfiguration loggingConfig = new BucketLoggingConfiguration();
loggingConfig.setDestinationBucketName("log-bucket");

SetBucketLoggingConfigurationRequest request = new SetBucketLoggingConfigurationRequest(
    "amzn-s3-demo-source-bucket",
    loggingConfig
);

s3ClientV1.setBucketLoggingConfiguration(request);


// SDK V2
// In V2, V1's 'BucketLoggingConfiguration' is replaced by 'BucketLoggingStatus' 
// and 'LoggingEnabled'.
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

LoggingEnabled loggingEnabled = LoggingEnabled.builder()
    .targetBucket("log-bucket")
    .build();

BucketLoggingStatus loggingStatus = BucketLoggingStatus.builder()
    .loggingEnabled(loggingEnabled)
    .build();

PutBucketLoggingRequest request = PutBucketLoggingRequest.builder()
    .bucket("amzn-s3-demo-source-bucket")
    .bucketLoggingStatus(loggingStatus)
    .build();

s3ClientV2.putBucketLogging(request);
```

### V1 の `setBucketLifecycleConfiguration` から V2 の `putBucketLifecycleConfiguration`
<a name="V1-setBucketLifecycleConfiguration"></a>

```
// SDK V1
BucketLifecycleConfiguration.Rule rule = new BucketLifecycleConfiguration.Rule()
    .withId("Archive and Delete Rule")
    .withPrefix("documents/")
    .withStatus(BucketLifecycleConfiguration.ENABLED)
    .withTransitions(Arrays.asList(
        new Transition()
            .withDays(30)
            .withStorageClass(StorageClass.StandardInfrequentAccess.toString()),
        new Transition()
            .withDays(90)
            .withStorageClass(StorageClass.Glacier.toString())
    ))
    .withExpirationInDays(365);

BucketLifecycleConfiguration configuration = new BucketLifecycleConfiguration()
    .withRules(Arrays.asList(rule));

s3ClientV1.setBucketLifecycleConfiguration("amzn-s3-demo-bucket", configuration);


// SDK V2
LifecycleRule rule = LifecycleRule.builder()
    .id("Archive and Delete Rule")
    .filter(LifecycleRuleFilter.builder()
        .prefix("documents/")
        .build())
    .status(ExpirationStatus.ENABLED)
    .transitions(Arrays.asList(
        Transition.builder()
            .days(30)
            .storageClass(TransitionStorageClass.STANDARD_IA)
            .build(),
        Transition.builder()
            .days(90)
            .storageClass(TransitionStorageClass.GLACIER)
            .build()
    ))
    .expiration(LifecycleExpiration.builder()
        .days(365)
        .build())
    .build();

PutBucketLifecycleConfigurationRequest request = PutBucketLifecycleConfigurationRequest.builder()
    .bucket("amzn-s3-demo-bucket")
    .lifecycleConfiguration(BucketLifecycleConfiguration.builder()
        .rules(rule)
        .build())
    .build();

s3ClientV2.putBucketLifecycleConfiguration(request);
```

### V1 の `setBucketTaggingConfiguration` から V2 の `putBucketTagging`
<a name="V1-setBucketTaggingConfiguration"></a>

```
// SDK V1
List<TagSet> tagsets = new ArrayList<>();
TagSet tagSet = new TagSet();
tagSet.setTag("key1", "value1");
tagSet.setTag("key2", "value2");
tagsets.add(tagSet);

BucketTaggingConfiguration bucketTaggingConfiguration = new BucketTaggingConfiguration();
bucketTaggingConfiguration.setTagSets(tagsets);

SetBucketTaggingConfigurationRequest request = new SetBucketTaggingConfigurationRequest(
    "amzn-s3-demo-bucket",
    bucketTaggingConfiguration
);

s3ClientV1.setBucketTaggingConfiguration(request);


// SDK V2
Tagging tagging = Tagging.builder()
    .tagSet(Arrays.asList(
        Tag.builder()
            .key("key1")
            .value("value1")
            .build(),
        Tag.builder()
            .key("key2")
            .value("value2")
            .build()
    ))
    .build();

PutBucketTaggingRequest request = PutBucketTaggingRequest.builder()
    .bucket("amzn-s3-demo-bucket")
    .tagging(tagging)
    .build();

s3ClientV2.putBucketTagging(request);
```

## 手動移行が必要な V1 クラス
<a name="s3-classes-manual-migration"></a>

### V1 の `AccessControlList` から V2 の `AccessControlPolicy`
<a name="V1-AccessControlList"></a>

```
// SDK V1
AccessControlList aclV1 = new AccessControlList();
aclV1.setOwner(new Owner("owner-id", "owner-name"));
aclV1.grantPermission(GroupGrantee.AllUsers, Permission.Read);

// SDK V2
// To migrate from V1 to V2, replace direct 'AccessControlList' modifications with an
// 'AccessControlPolicy.builder()' that contains both owner information and grants. 
// Note that V2's approach requires building the complete permission set upfront rather than modifying permissions incrementally.
AccessControlPolicy acpV2 = AccessControlPolicy.builder()
    .owner(Owner.builder()
        .id("owner-id")
        .displayName("owner-name")
        .build())
    .grants(Arrays.asList(
         Grant.builder()
            .grantee(Grantee.builder()
                 .type(Type.GROUP)
                 .uri("http://acs.amazonaws.com/groups/global/AllUsers") 
                 .build())
             .permission(Permission.READ)
             .build()
     ))
     .build();
```

### V1 の `CannedAccessControlList` 列挙型から V2 の `BucketCannedACL` および `ObjectCannedACL` 列挙型
<a name="V1-CannedAccessControlList"></a>

```
// SDK V1
// In V1, 'CannedAccessControlList' is an enumeration of predefined ACLs.
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard().build();

// Creating a bucket.
s3ClientV1.setBucketAcl("bucket-name", CannedAccessControlList.PublicRead);

// Creating an object.
PutObjectRequest putObjectRequest = new PutObjectRequest("bucket-name", "object-key", file)
    .withCannedAcl(CannedAccessControlList.PublicRead);
s3ClientV1.putObject(putObjectRequest);


// SDK V2
// V2 replaces V1's 'CannedAccessControlList' with 'BucketCannedACL' for buckets and 'ObjectCannedACL' for objects.
S3Client s3ClientV2 = S3Client.builder().build();

// Creating a bucket.
PutBucketAclRequest bucketRequest = PutBucketAclRequest.builder()
    .bucket("bucket-name")
    .acl(BucketCannedACL.PRIVATE)
    .build();
s3ClientV2.putBucketAcl(bucketRequest);

// Creating an object.
PutObjectRequest objectRequest = PutObjectRequest.builder()
    .bucket("bucket-name")
    .key("object-key")
    .acl(ObjectCannedACL.PUBLIC_READ)
    .build();
s3ClientV2.putObject(objectRequest, RequestBody.fromFile(file));
```

### V1 の `BucketNotificationConfiguration` から V2 の `NotificationConfiguration`
<a name="V1-BucketNotificationConfiguration"></a>

```
//SDK V1
BucketNotificationConfiguration notificationConfig = new BucketNotificationConfiguration();

// Adding configurations by name
notificationConfig.addConfiguration("lambdaConfig", 
    new LambdaConfiguration("arn:aws:lambda:function", "s3:ObjectCreated:"));

notificationConfig.addConfiguration("topicConfig",
    new TopicConfiguration("arn:aws:sns:topic", "s3:ObjectRemoved:"));

notificationConfig.addConfiguration("queueConfig",
    new QueueConfiguration("arn:aws:sqs:queue", "s3:ObjectRestore:*"));

s3Client.setBucketNotificationConfiguration("bucket", notificationConfig);


// SDK V2
// In V2, V1's BucketNotificationConfiguration is renamed to NotificationConfiguration. 
// V2 contains no common abstract class for LambdaFunction/Topic/Queue configurations.
NotificationConfiguration notificationConfig = NotificationConfiguration.builder()
    .lambdaFunctionConfigurations(
        LambdaFunctionConfiguration.builder()
            .lambdaFunctionArn("arn:aws:lambda:function")
            .events(Event.valueOf("s3:ObjectCreated:"))
            .build())
    .topicConfigurations(
        TopicConfiguration.builder()
            .topicArn("arn:aws:sns:topic")
            .events(Event.valueOf("s3:ObjectRemoved:"))
            .build())
    .queueConfigurations(
        QueueConfiguration.builder()
            .queueArn("arn:aws:sqs:queue")
            .events(Event.valueOf("s3:ObjectRestore:*"))
            .build())
    .build();

s3Client.putBucketNotificationConfiguration(req -> req
    .bucket("bucket")
    .notificationConfiguration(notificationConfig));
```

### リクエストビルダーでの V1 の `MultiFactorAuthentication` から V2 の `mfa` メソッド
<a name="V1-MultifactorAuthentication"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

BucketVersioningConfiguration versioningConfig = new BucketVersioningConfiguration()
    .withStatus(BucketVersioningConfiguration.ENABLED);

// Create an MFA configuration object.
MultiFactorAuthentication mfa = new MultiFactorAuthentication(
    "arn:aws:iam::1234567890:mfa/user",
    "123456"
);

// Create the request object.
SetBucketVersioningConfigurationRequest request = new SetBucketVersioningConfigurationRequest(
    "bucket-name",
    versioningConfig,
    mfa
);

// Send the request.
s3ClientV1.setBucketVersioningConfiguration(request);


// SDK V2
// V2 replaces V1's MultiFactorAuthentication POJO with parameters you set on the request builder.
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

PutBucketVersioningRequest request = PutBucketVersioningRequest.builder()
    .bucket("bucket-name")
    .versioningConfiguration(VersioningConfiguration.builder()
        .status(BucketVersioningStatus.ENABLED)
        .build())
    .mfa("arn:aws:iam::1234567890:mfa/user 123456")  // Single method takes both MFA erial number and token.
    .build();

s3ClientV2.putBucketVersioning(request);
```

# Transfer Manager を のバージョン 1 からバージョン 2 に移行する AWS SDK for Java
<a name="migration-s3-transfer-manager"></a>

この移行ガイドでは、Transfer Manager v1 と S3 Transfer Manager v2 の主な違いについて説明します。これには、コンストラクタの変更、メソッドマッピング、一般的なオペレーションのコード例が含まれます。これらの違いを知ることで、既存の Transfer Manager コードを正常に移行して、v2 でのパフォーマンスの向上と非同期オペレーションを活用できます。

**AWS SDK 移行ツールについて**  
 AWS SDK for Java には、v1 Transfer Manager API の多くを v2 に移行できる自動[移行ツール](migration-tool.md)が用意されています。ただし、移行ツールは一部の v1 Transfer Manager 機能をサポートしていません。このような場合は、このトピックのガイダンスを使用して Transfer Manager コードを手動で移行する必要があります。  
このガイド全体で、**移行ステータス**は、移行ツールがコンストラクタ、メソッド、または機能を自動的に移行できるかどうかを示します。  
**サポート対象**: 移行ツールでこのコードを自動的に変換できます
**サポート対象外**: コードを手動で移行する必要があります
「サポート対象」とマークされた項目であっても、移行結果を確認して入念にテストしてください。Transfer Manager の移行には、同期オペレーションから非同期オペレーションへの大幅なアーキテクチャ変更が含まれます。

## 概要:
<a name="s3-tm-migration-overview"></a>

S3 Transfer Manager v2 では、Transfer Manager API に大幅な変更が加えられました。S3 Transfer Manager v2 は非同期オペレーション上に構築されており、特に AWS CRT ベースの Amazon S3 クライアントを使用する場合、パフォーマンスが向上します。

### 主な違い
<a name="s3-tm-migration-key-differences"></a>
+ **パッケージ**: `com.amazonaws.services.s3.transfer` → `software.amazon.awssdk.transfer.s3`
+ **クラス名**: `TransferManager` → `S3TransferManager`
+ **クライアントの依存関係**: 同期 Amazon S3 クライアント → 非同期 Amazon S3 クライアント (`S3AsyncClient`)
+ **アーキテクチャ**: 同期オペレーション → `CompletableFuture` を使用した非同期オペレーション
+ **パフォーマンス**: CRT AWS ベースのクライアントサポートで強化

## 高レベル変更
<a name="s3-tm-migration-high-level-changes"></a>


| 側面 | V1 | V2 | 
| --- | --- | --- | 
| Maven の依存関係 | aws-java-sdk-s3 | s3-transfer-manager | 
| パッケージ | com.amazonaws.services.s3.transfer | software.amazon.awssdk.transfer.s3 | 
| メインクラス | TransferManager | S3TransferManager | 
| Amazon S3 クライアント | AmazonS3 (同期) | S3AsyncClient (非同期) | 
| 戻り型 | ブロックオペレーション | CompletableFuture<T> | 

## Maven の依存関係
<a name="s3-tm-migration-dependencies"></a>


| V1 | V2 | 
| --- | --- | 
|  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>>1.12.7871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.31.682</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3-transfer-manager</artifactId><br />    </dependency><br />    <!-- Optional: For enhanced performance with AWS CRT --><br />    <dependency><br />        <groupId>software.amazon.awssdk.crt</groupId><br />        <artifactId>aws-crt</artifactId><br />        <version>0.38.53</version><br />    </dependency><br /></dependencies></pre>  | 

1 [最新バージョン](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)。2 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。3 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk.crt/aws-crt)。

## クライアントコンストラクタの移行
<a name="s3-tm-migration-client-constructor"></a>

### サポート対象コンストラクタ (自動移行)
<a name="s3-tm-migration-supported-constructors"></a>


| V1 コンストラクタ | V2 の同等コンストラクタ | 移行ステータス | 
| --- | --- | --- | 
| new TransferManager() | S3TransferManager.create() | サポート対象 | 
| TransferManagerBuilder. defaultTransferManager() | S3TransferManager.create() | サポート対象 | 
| TransferManagerBuilder. standard().build() | S3TransferManager.builder().build() | サポート対象 | 
| new TransferManager(AWSCredentials) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | サポート対象 | 
| new TransferManager( AWSCredentialsProvider) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | サポート | 

### サポート対象外コンストラクタ (手動移行が必要)
<a name="s3-tm-migration-unsupported-constructors"></a>


| V1 コンストラクタ | V2 の同等コンストラクタ | 移行に関するメモ | 
| --- | --- | --- | 
| new TransferManager(AmazonS3) | 手動移行が必要 | S3AsyncClient を個別に作成する | 
| new TransferManager(AmazonS3, ExecutorService) | 手動移行が必要 | S3AsyncClient を作成し、エグゼキュターを設定する | 
| new TransferManager(AmazonS3, ExecutorService, boolean) | 手動移行が必要 | shutDownThreadPools パラメータはサポートされていません | 

### 手動移行の例
<a name="s3-tm-migration-manual-examples"></a>

**V1 コード:**

```
AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
TransferManager transferManager = new TransferManager(s3Client);
```

**V2 コード:**

```
// Create an `S3AsyncClient` with similar configuration
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
    .credentialsProvider(DefaultCredentialsProvider.create())
    .build();

// Provide the configured `S3AsyncClient` to the S3 transfer manager builder.
S3TransferManager transferManager = S3TransferManager.builder()
    .s3Client(s3AsyncClient)
    .build();
```

## クライアントメソッドの移行
<a name="s3-tm-migration-client-methods"></a>

現在、移行ツールは基本的な `copy`、`download`、`upload`、`uploadDirectory`、`downloadDirectory`、`resumeDownload`、および `resumeUpload` メソッドをサポートしています。

### 主な転送メソッド
<a name="s3-tm-migration-core-transfer-methods"></a>


| V1 メソッド | V2 メソッド | 戻り型の変更 | 移行ステータス | 
| --- | --- | --- | --- | 
| upload(String, String, File) | uploadFile(UploadFileRequest) | Upload → FileUpload | サポート対象 | 
| upload(PutObjectRequest) | upload(UploadRequest) | Upload → Upload | サポート対象 | 
| download(String, String, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | サポート対象 | 
| download(GetObjectRequest, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | サポート対象 | 
| copy(String, String, String, String) | copy(CopyRequest) | Copy → Copy | サポート対象 | 
| copy(CopyObjectRequest) | copy(CopyRequest) | Copy → Copy | サポート対象 | 
| uploadDirectory(String, String, File, boolean) | uploadDirectory( UploadDirectoryRequest) | MultipleFileUpload → DirectoryUpload | サポート対象 | 
| downloadDirectory(String, String, File) | downloadDirectory( DownloadDirectoryRequest) | MultipleFileDownload → DirectoryDownload | サポート | 

### 再開可能な転送メソッド
<a name="s3-tm-migration-resumable-methods"></a>


| V1 メソッド | V2 メソッド | 移行ステータス | 
| --- | --- | --- | 
| resumeUpload(PersistableUpload) | resumeUploadFile(ResumableFileUpload) | サポート対象 | 
| resumeDownload(PersistableDownload) | resumeDownloadFile(ResumableFileDownload) | サポート | 

### ライフサイクルメソッド
<a name="s3-tm-migration-lifecycle-methods"></a>


| V1 メソッド | V2 メソッド | 移行ステータス | 
| --- | --- | --- | 
| shutdownNow() | close() | サポート | 
| shutdownNow(boolean) | close() メソッドを使用してコードを手動で調整する | サポート外 | 

### サポートされていない V1 クライアントメソッド
<a name="s3-tm-migration-unsupported-methods"></a>


| V1 メソッド | V2 代替メソッド | 注意事項 | 
| --- | --- | --- | 
| abortMultipartUploads(String, Date) | 低レベルの Amazon S3 クライアントを使用 | サポート外 | 
| getAmazonS3Client() | リファレンスを個別に保存 | サポート対象外、v2 にはゲッターなし | 
| getConfiguration() | リファレンスを個別に保存 | サポート対象外、v2 にはゲッターなし | 
| uploadFileList(...) | 複数の uploadFile() 呼び出しを行う | サポート外 | 
| TransferStateChangeListener パラメータを持つ copy メソッド | TransferListener を使用する | [手動移行の例を参照](#tm-unsupported-client-methods-copy) | 
| S3ProgressListener パラメータを持つ download メソッド | [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/transfer/s3/progress/TransferListener.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/transfer/s3/progress/TransferListener.html) を使用する | [手動移行の例を参照](#tm-unsupported-client-methods-download) | 
|  4 つ以上のパラメータを持つ `downloadDirectory` メソッド  |  | [手動移行の例を参照](#tm-unsupported-client-methods-download-dir) | 
| ObjectMetadataProvider パラメータを使用した upload メソッド | リクエストでメタデータを設定 | [手動移行の例を参照](#tm-unsupported-client-methods-upload) | 
| \$1Provider パラメータを持つ uploadDirectory メソッド | リクエストでタグを設定 | [手動移行の例を参照](#tm-unsupported-client-methods-uploadDirectory) | 

#### `TransferStateChangeListener` パラメータを持つ `copy` メソッド
<a name="tm-unsupported-client-methods-copy"></a>
+ `copy(CopyObjectRequest copyObjectRequest, AmazonS3 srcS3, TransferStateChangeListener stateChangeListener)`
+ `copy(CopyObjectRequest copyObjectRequest, TransferStateChangeListener stateChangeListener)`

```
// V1 ----------------------------------------------------------------------------------------------
// Initialize source S3 client
AmazonS3 s3client = AmazonS3ClientBuilder.standard()
                .withRegion("us-west-2")
                .build();
                
// Initialize Transfer Manager
TransferManager tm = TransferManagerBuilder.standard()
                .withS3Client(srcS3)
                .build();

CopyObjectRequest copyObjectRequest = new CopyObjectRequest(
                "amzn-s3-demo-source-bucket",
                "source-key",         
                "amzn-s3-demo-destination-bucket", 
                "destination-key"    
        );

TransferStateChangeListener stateChangeListener = new TransferStateChangeListener() {
            @Override
            public void transferStateChanged(Transfer transfer, TransferState state) {
              //Implementation of the TransferStateChangeListener
            }
        };

Copy copy = tm.copy(copyObjectRequest, srcS3, stateChangeListener);


// V2 ----------------------------------------------------------------------------------------------
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
                .region(Region.US_WEST_2)          
                .build();

S3TransferManager transferManager = S3TransferManager.builder()
                .s3Client(s3AsyncClient)
                .build();

// Create transfer listener (equivalent to TransferStateChangeListener in v1)                                
TransferListener transferListener = new TransferListener() {
            @Override
            public void transferInitiated(Context.TransferInitiated context) {
               //Implementation
               System.out.println("Transfer initiated");
            }

            @Override
            public void bytesTransferred(Context.BytesTransferred context) {
                //Implementation
                System.out.println("Bytes transferred");
            }

            @Override
            public void transferComplete(Context.TransferComplete context) {
                //Implementation
                System.out.println("Transfer completed!");
            }

            @Override
            public void transferFailed(Context.TransferFailed context) {
                //Implementation
                System.out.println("Transfer failed");
            }
        };

CopyRequest copyRequest = CopyRequest.builder()
                              .copyObjectRequest(req -> req
                                  .sourceBucket("amzn-s3-demo-source-bucket")
                                  .sourceKey("source-key")
                                  .destinationBucket("amzn-s3-demo-destination-bucket")
                                  .destinationKey("destination-key")
                               )
                                .addTransferListener(transferListener) // Configure the transferListener into the request
                                .build();
  
Copy copy = transferManager.copy(copyRequest);
```

#### `S3ProgressListener` パラメータを持つ `download` メソッド
<a name="tm-unsupported-client-methods-download"></a>
+ `download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener)`
+ `download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener, long timeoutMillis)`
+ `download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener, long timeoutMillis, boolean resumeOnRetry)`

```
// V1 ----------------------------------------------------------------------------------------------
S3ProgressListener progressListener = new S3ProgressListener() {
        @Override
        public void progressChanged(com.amazonaws.event.ProgressEvent progressEvent) {
            long bytes = progressEvent.getBytesTransferred();
            ProgressEventType eventType = progressEvent.getEventType();
            // Use bytes and eventType as needed
        }

        @Override
        public void onPersistableTransfer(PersistableTransfer persistableTransfer) {

        }
    };

Download download1 = tm.download(getObjectRequest, file, progressListener); 
Download download2 = tm.download(getObjectRequest, file, progressListener, timeoutMillis)
Download download3 = tm.download(getObjectRequest, file, progressListener, timeoutMillis, true)

// V2 ----------------------------------------------------------------------------------------------
TransferListener transferListener = new TransferListener() {
    @Override
    public void transferInitiated(Context.InitializedContext context) {
        // Equivalent to ProgressEventType.TRANSFER_STARTED_EVENT
        System.out.println("Transfer initiated");
    }

    @Override
    public void bytesTransferred(Context.BytesTransferred context) {
        // Equivalent to ProgressEventType.REQUEST_BYTE_TRANSFER_EVENT
        long bytes = context.bytesTransferred();
        System.out.println("Bytes transferred: " + bytes);
    }

    @Override
    public void transferComplete(Context.TransferComplete context) {
        // Equivalent to ProgressEventType.TRANSFER_COMPLETED_EVENT
        System.out.println("Transfer completed");
    }

    @Override
    public void transferFailed(Context.TransferFailed context) {
        // Equivalent to ProgressEventType.TRANSFER_FAILED_EVENT
        System.out.println("Transfer failed: " + context.exception().getMessage());
    }
};
DownloadFileRequest downloadFileRequest = 
                         DownloadFileRequest.builder()
                             .getObjectRequest(getObjectRequest)
                             .destination(file.toPath())
                             .addTransferListener(transferListener)
                             .build();

// For download1
FileDownload download = transferManager.downloadFile(downloadFileRequest);

// For download2
CompletedFileDownload completedFileDownload = download.completionFuture()
                                                  .get(timeoutMillis, TimeUnit.MILLISECONDS);

// For download3, the v2 SDK does not have a direct equiavalent to the `resumeOnRetry` method of v1.
// If a download is interrupted, you need to start a new download request.
```

#### 4 つ以上のパラメータを持つ `downloadDirectory` メソッド
<a name="tm-unsupported-client-methods-download-dir"></a>
+ `downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, boolean resumeOnRetry)`
+ `downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, boolean resumeOnRetry, KeyFilter filter)`
+ `downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, KeyFilter filter)`

```
// V1 ----------------------------------------------------------------------------------------------
KeyFilter filter = new KeyFilter() {
            @Override
            public boolean shouldInclude(S3ObjectSummary objectSummary) {
                //Filter implementation
            }
        };
MultipleFileDownload multipleFileDownload = tm.downloadDirectory(bucketName, keyPrefix, destinationDirectory, filter);

// V2 ----------------------------------------------------------------------------------------------
// The v2 SDK does not have a direct equiavalent to the `resumeOnRetry` method of v1.
// If a download is interrupted, you need to start a new download request.
DownloadFilter filter = new DownloadFilter() {
            @Override
            public boolean test(S3Object s3Object) {
                // Filter implementation.
            }
        };

DownloadDirectoryRequest downloadDirectoryRequest = 
                              DownloadDirectoryRequest.builder()
                                  .bucket(bucketName)
                                  .filter(filter)
                                  .listObjectsV2RequestTransformer(builder -> builder.prefix(keyPrefix))
                                  .destination(destinationDirectory.toPath())
                                  .build();
                                                                            
DirectoryDownload directoryDownload = transferManager.downloadDirectory(downloadDirectoryRequest);
```

#### `ObjectMetadata` パラメータを持つ `upload` メソッド
<a name="tm-unsupported-client-methods-upload"></a>
+ `upload(String bucketName, String key, InputStream input, ObjectMetadata objectMetadata)`

```
// V1 ----------------------------------------------------------------------------------------------ObjectMetadata metadata = new ObjectMetadata();
ObjectMetadata metadata = new ObjectMetadata();

metadata.setContentType("text/plain");        // System-defined metadata
metadata.setContentLength(22L);               // System-defined metadata
metadata.addUserMetadata("myKey", "myValue"); // User-defined metadata

PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, metadata);

Upload upload = transferManager.upload("amzn-s3-demo-bucket", "my-key", inputStream, metadata);

// V2 ----------------------------------------------------------------------------------------------
/* When you use an InputStream to upload in V2, you should specify the content length 
   and use `RequestBody.fromInputStream()`. 
   If you don't provide the content length, the entire stream will be buffered in memory. 
   If you can't determine the content length, we recommend using the CRT-based S3 client.
*/
Map<String, String> userMetadata = new HashMap<>();
userMetadata.put("x-amz-meta-myKey", "myValue");

PutObjectRequest putObjectRequest = 
                        PutObjectRequest.builder()
                            .bucket("amzn-s3-demo-bucket1")
                            .key("k")
                            .contentType("text/plain") //System-defined metadata usually has separate methods in the builder.
                            .contentLength(22L)
                            .metadata(userMetadata) //metadata() is only for user-defined metadata.
                            .build();

UploadRequest uploadRequest = 
                        UploadRequest.builder()
                            .putObjectRequest(putObjectRequest)
                            .requestBody(AsyncRequestBody.fromInputStream(stream, 22L, executor))
                            .build();
                                                   
transferManager.upload(uploadRequest).completionFuture().join();
```

#### `ObjectMetadataProvider` パラメータを持つ `uploadDirectory`
<a name="tm-unsupported-client-methods-uploadDirectory"></a>
+ `uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider)`
+ `uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider, ObjectTaggingProvider taggingProvider)`
+ `uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider, ObjectTaggingProvider taggingProvider, ObjectCannedAclProvider cannedAclProvider)`

```
// V1 ----------------------------------------------------------------------------------------------
tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider)
tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider, taggingProvider)
tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider, taggingProvider, cannedAclProvider)

// V2 ----------------------------------------------------------------------------------------------
UploadDirectoryRequest request = UploadDirectoryRequest.builder()
                                  .bucket(bucketName)
                                  .s3Prefix(virtualDirectoryKeyPrefix)
                                  .source(directory.toPath())
                                  .maxDepth(includeSubdirectories ? Integer.MAX_VALUE : 1)
                                  .uploadFileRequestTransformer(builder -> {
                                      // 1.Replace `ObjectMetadataProvider`, `ObjectTaggingProvider`, and `ObjectCannedAclProvider` with an
                                        // `UploadFileRequestTransformer` that can combine the functionality of all three *Provider implementations.
                                        // 2. Convert your v1 `ObjectMetadata` to v2 `PutObjectRequest` parameters.
                                        // 3. Convert your v1 `ObjectTagging` to v2 `Tagging`.
                                        // 4. Convert your v1 `CannedAccessControlList` to v2 `ObjectCannedACL`.
                                  })
                                  .build();
        
DirectoryUpload directoryUpload = transferManager.uploadDirectory(request);
```

## モデルオブジェクトの移行
<a name="s3-tm-migration-model-objects"></a>

では AWS SDK for Java 2.x、多くの`TransferManager`モデルオブジェクトが再設計されており、v1 のモデルオブジェクトで使用できるいくつかのゲッターメソッドとセッターメソッドはサポートされなくなりました。

v2 では、 `CompletableFuture<T>` クラスを使用して、転送が (正常に、または例外を伴って) 完了したときにアクションを実行できます。必要に応じて、`join()` メソッドを使用して完了を待つことができます。

### 主な転送オブジェクト
<a name="s3-tm-migration-core-transfer-objects"></a>


| V1 クラス | V2 クラス | 移行ステータス | 
| --- | --- | --- | 
| TransferManager | S3TransferManager | サポート対象 | 
| TransferManagerBuilder | S3TransferManager.Builder | サポート対象 | 
| Transfer | Transfer | サポート | 
| AbortableTransfer | Transfer | サポート対象 (個別のクラスなし) | 
| Copy | Copy | サポート対象 | 
| Download | FileDownload | サポート対象 | 
| Upload | Upload / FileUpload | サポート対象 | 
| MultipleFileDownload | DirectoryDownload | サポート対象 | 
| MultipleFileUpload | DirectoryUpload | サポート | 

### 永続性オブジェクト
<a name="s3-tm-migration-persistence-objects"></a>


| V1 クラス | V2 クラス | 移行ステータス | 
| --- | --- | --- | 
| PersistableDownload | ResumableFileDownload | サポート対象 | 
| PersistableUpload | ResumableFileUpload | サポート対象 | 
| PersistableTransfer | ResumableTransfer | サポート | 
| PauseResult<T> | 直接再開可能なオブジェクト | サポート外 | 

### 結果オブジェクト
<a name="s3-tm-migration-result-objects"></a>


| V1 クラス | V2 クラス | 移行ステータス | 
| --- | --- | --- | 
| CopyResult | CompletedCopy | サポート対象 | 
| UploadResult | CompletedUpload | サポート | 

### 構成オブジェクト
<a name="s3-tm-migration-configuration-objects"></a>


| V1 クラス | V2 クラス | 移行ステータス | 
| --- | --- | --- | 
| TransferManagerConfiguration | MultipartConfiguration (Amazon S3 クライアント上) | サポート対象 | 
| TransferProgress | TransferProgress \$1 TransferProgressSnapshot | サポート対象 | 
| KeyFilter | DownloadFilter | サポート | 

### サポートされていないオブジェクト
<a name="s3-tm-migration-unsupported-objects"></a>


| V1 クラス | V2 代替メソッド | 移行ステータス | 
| --- | --- | --- | 
| PauseStatus | サポートされません | サポート外 | 
| UploadContext | サポートされません | サポート外 | 
| ObjectCannedAclProvider | PutObjectRequest.builder().acl() | サポート外 | 
| ObjectMetadataProvider | PutObjectRequest.builder().metadata() | サポート外 | 
| ObjectTaggingProvider | PutObjectRequest.builder().tagging() | サポート外 | 
| PresignedUrlDownload | サポートされません | サポート外 | 

## TransferManagerBuilder の設定移行
<a name="s3-tm-migration-builder-configuration"></a>

### 設定変更
<a name="migration-transfer-manager-config-changes"></a>

v2 Transfer Manager に設定する必要がある設定変更は、使用する S3 クライアントによって異なります。CRT AWS ベースの S3 クライアントまたは標準の Java ベースの S3 非同期クライアントを選択できます。違いの詳細については、[の S3 クライアント AWS SDK for Java 2.x](examples-s3.md#s3-clients) トピックを参照してください。

------
#### [ Use the AWS CRT-based S3 client ]


****  

| 設定 | v1 | v2 - CRT AWS ベースの S3 クライアントを使用した Transfer Manager | 
| --- | --- | --- | 
|    (ビルダーを入手する)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    S3 クライアント  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    エグゼキュター  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    スレッドプールをシャットダウンする  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | サポート外。S3TransferManager が閉じられても、提供されたエグゼキューターはシャットダウンされません。 | 
|    最小アップロードパートサイズ  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    マルチパートアップロードのしきい値  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    最小コピーパーツサイズ  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    マルチパートコピーのしきい値  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    並列ダウンロードを無効にする  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | マルチパートを無効にした (デフォルト)、標準 Java ベースの S3 クライアントを転送マネージャに渡して、並列ダウンロードを無効にします。<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    常にマルチパート md5 を計算する  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | サポート外。 | 

------
#### [ Use Java-based S3 async client ]


****  

| 設定 | v1 | v2 - Java ベースの S3 非同期クライアントを使用する Transfer Manager | 
| --- | --- | --- | 
|    (ビルダーを入手する)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    S3 クライアント  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    エグゼキュター  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    スレッドプールをシャットダウンする  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | サポート外。S3TransferManager が閉じられても、提供されたエグゼキューターはシャットダウンされません。 | 
|    最小アップロードパートサイズ  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.minimumPartSizeInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    マルチパートアップロードのしきい値  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.thresholdInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    最小コピーパーツサイズ  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.minimumPartSizeInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    マルチパートコピーのしきい値  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.thresholdInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    並列ダウンロードを無効にする  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | マルチパートを無効にした (デフォルト)、標準 Java ベースの S3 クライアントを転送マネージャに渡して、並列ダウンロードを無効にします。<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    常にマルチパート md5 を計算する  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | サポート外。 | 

------

## 動作の変更
<a name="s3-tm-migration-behavior-changes"></a>

### 非同期オペレーション
<a name="s3-tm-migration-async-operations"></a>

**V1 (ブロック)**

```
Upload upload = transferManager.upload("amzn-s3-demo-bucket", "key", file);
upload.waitForCompletion(); // Blocks until complete
```

**V2 (非同期):**

```
FileUpload upload = transferManager.uploadFile(UploadFileRequest.builder()
    .putObjectRequest(PutObjectRequest.builder()
        .bucket("amzn-s3-demo-bucket")
        .key("key")
        .build())
    .source(file)
    .build());

CompletedFileUpload result = upload.completionFuture().join(); // Blocks until complete
// Or handle asynchronously:
upload.completionFuture().thenAccept(result -> {
    System.out.println("Upload completed: " + result.response().eTag());
});
```

### エラー処理
<a name="s3-tm-migration-error-handling"></a>

**V1:** サブリクエストが失敗した場合、ディレクトリ転送は完全に失敗します。

**V2:** 一部のサブリクエストが失敗した場合でも、ディレクトリ転送は正常に完了します。エラーを明示的に確認します。

```
DirectoryUpload directoryUpload = transferManager.uploadDirectory(request);
CompletedDirectoryUpload result = directoryUpload.completionFuture().join();

// Check for failed transfers
if (!result.failedTransfers().isEmpty()) {
    System.out.println("Some uploads failed:");
    result.failedTransfers().forEach(failed -> 
        System.out.println("Failed: " + failed.exception().getMessage()));
}
```

### バイト範囲フェッチによる並列ダウンロード
<a name="migration-transfer-manager-behavior-fetches"></a>

v2 SDK で自動並列転送機能が有効になっている場合、S3 Transfer Manager は[バイト範囲フェッチ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range)を使用してオブジェクトの特定の部分を並列して取得します (マルチパートダウンロード)。v2 でのオブジェクトのダウンロード方法は、オブジェクトが最初にアップロードされた方法には依存しません。すべてのダウンロードで、高いスループットと同時実行性のメリットが得られます。

これとは対照的に、v1 の Transfer Manager では、オブジェクトが最初にどのようにアップロードされたかが問題になります。v1 の Transfer Manager は、パーツがアップロードされたのと同じ方法でオブジェクトの一部を取得します。オブジェクトが元々単一のオブジェクトとしてアップロードされた場合、v1 の Transfer Manager はサブリクエストを使用してダウンロードプロセスを高速化することはできません。

# バージョン 1 からバージョン 2 での Amazon S3 URI の解析の変更
<a name="migration-s3-uri-parser"></a>

このトピックでは、バージョン 1 (v1) からバージョン 2 (v2) での Amazon S3 URI の解析に関する変更点について詳しく説明します。

## 高レベル変更
<a name="migration-3-uri-parser-api-changes"></a>

v1 で S3 URI の解析を開始するには、コンストラクタを使用して `AmazonS3URI` をインスタンス化します。v2 では、`S3Utilities` のインスタンスで `parseUri()` を呼び出して `S3URI` を返します。


****  

| 変更 | v1 |  v2 | 
| --- | --- | --- | 
|    Maven の依存関係  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency>  <br />        <groupId>com.amazonaws</groupId><br />        <artifactId>s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| パッケージ名 | com.amazonaws.services.s3 | software.amazon.awssdk.services.s3 | 
| クラス名 | [AmazonS3URI](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3URI.html) | [S3URI](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Uri.html) | 

1 [最新バージョン](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)。 2 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

## API の変更
<a name="migration-3-uri-parser-api-changes"></a>


| 行動 | v1 |  v2 | 
| --- | --- | --- | 
| S3 URI を解析します。 |  <pre>URI uri = URI.create( "https://s3.amazonaws.com");<br /><br />AmazonS3Uri s3Uri = <br />    new AmazonS3URI(uri, false);</pre>  |  <pre>S3Client s3Client = S3Client.create();<br />S3Utilities s3Utilities =<br />    s3Client.utilities();<br /><br />S3Uri s3Uri =<br />    s3Utilities.parseUri(uri);</pre>  | 
| S3 URI からバケット名を取得します。 |  <pre>String bucket = s3Uri.getBucket();</pre>  |  <pre>Optional<String> bucket = s3Uri.bucket();</pre>  | 
| キーを取得します。 |  <pre>String key = s3Uri.getKey();</pre>  |  <pre>Optional<String> key = s3Uri.key();</pre>  | 
| リージョンを取得します。 |  <pre>String region = s3Uri.getRegion();</pre>  |  <pre>Optional<Region> region = s3Uri.region();<br /><br />String region;<br />if (s3Uri.region().isPresent()) {<br />    region = s3Uri.region().get().id();<br />}</pre>  | 
|  S3 URI がパススタイルであるかどうかを取得します。  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  | 
| バージョン ID を取得します。 |  <pre>String versionId = s3Uri.getVersionId();</pre>  |  <pre>Optional<String> versionId = <br />    s3Uri.firstMatchingRawQueryParameter("versionId");</pre>  | 
| クエリパラメータを取得します。 | 該当なし |  <pre>Map<String, List<String>> queryParams =<br />    s3Uri.rawQueryParameters();</pre>  | 

### 動作の変更
<a name="migration-s3-uri-parser-behavior-changes"></a>

#### URL エンコーディング
<a name="migration-s3-uri-parser-behavior-changes-URLencoding"></a>

v1 には、URI を URL エンコーディングするかどうかを指定するフラグを渡すオプションがあります。デフォルト値は `true` です。

v2 では、URL エンコーディングはサポートされていません。予約文字または安全でない文字を持つオブジェクトキーまたはクエリパラメータを使用する場合は、それらを URL エンコーディングする必要があります。たとえば、空白 `%20` を `" "` に置き換える必要があります。

# バージョン 1 からバージョン 2 での S3 イベント通知 API の変更
<a name="migration-s3-event-notification"></a>

このトピックでは、 AWS SDK for Javaのバージョン 1.x (v1) からバージョン 2 .x (v2) での S3 イベント通知 API の変更について詳しく説明します。

## 高レベル変更
<a name="migration-s3-event-notification-hl"></a>

### 構造の変更
<a name="migration-s3-event-notification-hl-struct"></a>

V1 は `EventNotificationRecord` 型とその属性に静的内部クラスを使用しますが、v2 は `EventNotificationRecord` 型に個別のパブリッククラスを使用します。

### 命名規則の変更
<a name="migration-s3-event-notification-hl-naming"></a>

v1 では、属性クラス名にはサフィックス「Entity」**が含まれますが、v2 では、より単純な命名のためにこのサフィックスを省略します。例えば、「eventDataEntity」**ではなく「eventData」**となります。

## 依存関係、パッケージ、クラス名の変更
<a name="migration-s3-event-notification-deps"></a>

v1 では、S3 イベント通知 API クラスは、S3 モジュール (artifactId `aws-java-sdk-s3`) とともに推移的にインポートされます。ただし、v2 では、`s3-event-notifications` アーティファクトに依存関係を追加する必要があります。


****  

| 変更 | v1 |  v2 | 
| --- | --- | --- | 
|    Maven の依存関係  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.X.X</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.X.X1</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3-event-notifications</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| パッケージ名 | com.amazonaws.services.s3.event | software.amazon.awssdk.eventnotifications.s3.model | 
| クラス名 |  [S3EventNotification](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.html) [S3EventNotification.S3EventNotificationRecord](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3EventNotificationRecord.html) [ S3EventNotification.GlacierEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.GlacierEventDataEntity.html) [S3EventNotification.IntelligentTieringEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.IntelligentTieringEventDataEntity.html) [S3EventNotification.LifecycleEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.LifecycleEventDataEntity.html) [S3EventNotification.ReplicationEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.ReplicationEventDataEntity.html) [S3EventNotification.RequestParametersEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.RequestParametersEntity.html) [S3EventNotification.ResponseElementsEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.ResponseElementsEntity.html) [S3EventNotification.RestoreEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.RestoreEventDataEntity.html) [S3EventNotification.S3BucketEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3BucketEntity.html) [ S3EventNotification.S3Entity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3Entity.html) [S3EventNotification.S3ObjectEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3ObjectEntity.html) [S3EventNotification.TransitionEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.TransitionEventDataEntity.html) [S3EventNotification.UserIdentityEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.UserIdentityEntity.html)  |   [S3EventNotification](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotification.html) [S3EventNotificationRecord](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotificationRecord.html) [GlacierEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/GlacierEventData.html) [IntelligentTieringEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/IntelligentTieringEventData.html) [LifecycleEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/LifecycleEventData.html) [ReplicationEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/ReplicationEventData.html) [RequestParameters](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/RequestParameters.html) [ResponseElements](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/ResponseElements.html) [RestoreEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/RestoreEventData.html) [S3 バケット](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3Bucket.html) [S3](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3.html) [S3Object](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3Object.html) [TransitionEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/TransitionEventData.html) [UserIdentity](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/UserIdentity.html)  | 

1 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

## API の変更
<a name="migration-s3-event-notification-API-changes"></a>

### JSON から `S3EventNotification` および逆方向
<a name="migration-s3-event-notification-API-changes-conv"></a>


| ユースケース | v1 |  v2 | 
| --- | --- | --- | 
| JSON 文字列から S3EventNotification を作成する |  <pre>S3EventNotification notification = <br />        S3EventNotification.parseJson(message.body());</pre>  |  <pre>S3EventNotification notification = <br />        S3EventNotification.fromJson(message.body());</pre>  | 
| S3EventNotification をJSON 文字列に変換する |  <pre>String json = notification.toJson();</pre>  |  <pre>String json = notification.toJson();</pre>  | 

### `S3EventNotification` のアクセス属性
<a name="migration-s3-event-notification-API-changes-attr"></a>


| ユースケース | v1 |  v2 | 
| --- | --- | --- | 
| 通知からレコードを取得する |  <pre>List<S3EventNotification.S3EventNotificationRecord> records = <br />        notifcation.getRecords();</pre>  |  <pre>List<S3EventNotificationRecord> records = <br />        notification.getRecords();</pre>  | 
| レコードのリストからレコードを取得する |  <pre>S3EventNotification.S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  |  <pre>S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  | 
| Glacier イベントデータを取得する |  <pre>S3EventNotification.GlacierEventDataEntity glacierEventData =<br />        record.getGlacierEventData();</pre>  |  <pre>GlacierEventData glacierEventData = <br />        record.getGlacierEventData();</pre>  | 
| Glacier イベントから復元イベントデータを取得する |  <pre>S3EventNotification.RestoreEventDataEntity restoreEventData = <br />        glacierEventData.getRestoreEventDataEntity();</pre>  |  <pre>RestoreEventData restoreEventData = <br />        glacierEventData.getRestoreEventData();</pre>  | 
| リクエストパラメータを取得する |  <pre>S3EventNotification.RequestParametersEntity requestParameters = <br />        record.getRequestParameters();</pre>  |  <pre>RequestParameters requestParameters = <br />        record.getRequestParameters();</pre>  | 
| Intelligent Tiering イベントデータを取得する |  <pre>S3EventNotification.IntelligentTieringEventDataEntity tieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  |  <pre>IntelligentTieringEventData intelligentTieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  | 
| ライフサイクルイベントデータを取得する |  <pre>S3EventNotification.LifecycleEventDataEntity lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  |  <pre>LifecycleEventData lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  | 
| イベント名を列挙型として取得する |  <pre>S3Event eventNameAsEnum = record.getEventNameAsEnum();</pre>  |  <pre>//getEventNameAsEnum does not exist; use 'getEventName()'<br />String eventName = record.getEventName();</pre>  | 
| レプリケーションイベントデータを取得する |  <pre>S3EventNotification.ReplicationEventDataEntity replicationEntity = <br />        record.getReplicationEventDataEntity();</pre>  |  <pre>ReplicationEventData replicationEventData = <br />        record.getReplicationEventData();</pre>  | 
| S3 バケットとオブジェクト情報を取得する |  <pre>S3EventNotification.S3Entity s3 = record.getS3();</pre>  |  <pre>S3 s3 = record.getS3();</pre>  | 
| ユーザー ID 情報を取得する |  <pre>S3EventNotification.UserIdentityEntity userIdentity = <br />        record.getUserIdentity();</pre>  |  <pre>UserIdentity userIdentity = <br />        record.getUserIdentity();</pre>  | 
| レスポンス要素を取得する |  <pre>S3EventNotification.ResponseElementsEntity responseElements = <br />        record.getResponseElements();</pre>  |  <pre>ResponseElements responseElements = <br />        record.getResponseElements();</pre>  | 

## `aws-lambda-java-events` ライブラリバージョンを移行する
<a name="migration-s3-events-notification-lambda-lib"></a>

[aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events) を使用して Lambda 関数内の S3 通知イベントを操作する場合は、最新の 3.x.x バージョンにアップグレードすることをお勧めします。最近のバージョンでは、S3 イベント通知 API から AWS SDK for Java 1.x 上のすべての依存関係が削除されます。

`aws-lambda-java-events` ライブラリと SDK for Java 2.x での S3 イベント通知の処理の違いについては、「[Java ライブラリを使用して Lambda で S3 イベントを処理する: AWS SDK for Java 2.x および `aws-lambda-java-events`](examples-s3-event-notifications.md#s3-event-notif-processing-options)」を参照してください。

# プロファイルファイルの変更
<a name="migration-profile-file"></a>

AWS SDK for Java 2.x は `~/.aws/config` および `~/.aws/credentials` のプロファイル定義を解析し、AWS CLI がファイルを解析する方法をより厳密にエミュレートします。

SDK for Java 2.x:
+ `$HOME`、`$USERPROFILE` (Windows のみ）、`$HOMEDRIVE`、 `$HOMEPATH` (Windows のみ）、`user.home` システムプロパティの順にチェックして、パスの開始時にファイルシステムのデフォルトパス区切り文字の前の `~/` または `~` を解決します。
+ `AWS_CREDENTIAL_PROFILES_FILE` ではなく `AWS_SHARED_CREDENTIALS_FILE` 環境変数を探します。
+ プロファイル名の先頭に `profile` という単語を付けずに、設定ファイル内のプロファイル定義を警告なくドロップします。
+ 英数字、アンダースコア、ダッシュ文字で構成されていないプロファイル定義を警告なく削除します (設定ファイルで先頭の `profile` 単語が削除された後）。
+ 同じファイル内で重複したプロファイル定義の設定をマージします。
+ 設定ファイルと認証情報ファイルの両方で重複したプロファイル定義の設定をマージします。
+ `[profile foo]` と `[foo]` の両方が同じファイルで見つかった場合、設定をマージしません。
+ 設定ファイルで `[profile foo]` と `[foo]` の両方が見つかった場合、`[profile foo]` の設定を使用します。
+ 同じファイルとプロファイルで最後に重複した設定の値を使用します。
+ コメントを定義するために `;` と `#` の両方を認識します。
+ 文字が閉じ括弧に隣接する場合でも、プロファイル定義で `;` と `#` を認識してコメントを定義します。
+ 空白が前にある場合にのみ `;` および `#` を認識し、値の設定でコメントのみを定義します。
+ 空白が前にない場合、`;` および `#` と以下の値の設定内のすべてのコンテンツを認識します。
+ ロールベースの認証情報を最も優先度の高い認証情報と見なします。ユーザーが `role_arn` プロパティを指定した場合、2.x SDK は常にロールベースの認証情報を使用します。
+ セッションベースの認証情報を 2 番目に優先度の高い認証情報と見なします。ロールベースの認証情報が使用されておらず、ユーザーが `aws_access_key_id` および `aws_session_token` プロパティを指定している場合、2.x SDK は常にセッションベースの認証情報を使用します。
+ ロールベースおよびセッションベースの認証情報が使用されておらず、ユーザーが `aws_access_key_id` プロパティを指定した場合、基本的な認証情報を使用します。

# 環境変数とシステムプロパティの変更
<a name="migration-env-and-system-props"></a>


| 1.x の環境変数 | 1.x のシステムプロパティ | 2.x の環境変数 | 2.x のシステムプロパティ | 
| --- | --- | --- | --- | 
| AWS\$1ACCESS\$1KEY\$1IDAWS\$1ACCESS\$1KEY | aws.accessKeyId | AWS\$1ACCESS\$1KEY\$1ID | aws.accessKeyId | 
| AWS\$1SECRET\$1KEYAWS\$1SECRET\$1ACCESS\$1KEY | aws.secretKey | AWS\$1SECRET\$1ACCESS\$1KEY | aws.secretAccessKey | 
| AWS\$1SESSION\$1TOKEN | aws.sessionToken | AWS\$1SESSION\$1TOKEN | aws.sessionToken | 
| AWS\$1REGION | aws.region | AWS\$1REGION | aws.region | 
| AWS\$1CONFIG\$1FILE |   | AWS\$1CONFIG\$1FILE | aws.configFile | 
| AWS\$1CREDENTIAL\$1PROFILES\$1FILE |   | AWS\$1SHARED\$1CREDENTIALS\$1FILE | aws.sharedCredentialsFile | 
| AWS\$1PROFILE | aws.profile | AWS\$1PROFILE | aws.profile | 
| AWS\$1EC2\$1METADATA\$1DISABLED | com.amazonaws.sdk.disableEc2Metadata | AWS\$1EC2\$1METADATA\$1DISABLED | aws.disableEc2Metadata | 
|   | com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | AWS\$1EC2\$1METADATA\$1SERVICE\$1ENDPOINT | aws.ec2MetadataServiceEndpoint | 
| AWS\$1CONTAINER\$1CREDENTIALS\$1RELATIVE\$1URI |   | AWS\$1CONTAINER\$1CREDENTIALS\$1RELATIVE\$1URI | aws.containerCredentialsPath | 
| AWS\$1CONTAINER\$1CREDENTIALS\$1FULL\$1URI |   | AWS\$1CONTAINER\$1CREDENTIALS\$1FULL\$1URI | aws.containerCredentialsFullUri | 
| AWS\$1CONTAINER\$1AUTHORIZATION\$1TOKEN |   | AWS\$1CONTAINER\$1AUTHORIZATION\$1TOKEN | aws.containerAuthorizationToken | 
| AWS\$1CBOR\$1DISABLED | com.amazonaws.sdk.disableCbor | CBOR\$1ENABLED | aws.cborEnabled | 
| AWS\$1ION\$1BINARY\$1DISABLE | com.amazonaws.sdk.disableIonBinary | BINARY\$1ION\$1ENABLED | aws.binaryIonEnabled | 
| AWS\$1EXECUTION\$1ENV |   | AWS\$1EXECUTION\$1ENV | aws.executionEnvironment | 
|   | com.amazonaws.sdk.disableCertChecking | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableDefaultMetrics | サポートされません | サポートされません | 
|   | com.amazonaws.sdk.enableThrottledRetry | サポートされません | サポートされません | 
|   | com.amazonaws.regions.RegionUtils.fileOverride | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.regions.RegionUtils.disableRemote | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.services.s3.disableImplicitGlobalClients | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableInRegionOptimizedMode | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | サポートされていません ([リクエスト機能](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 

# バージョン 1 からバージョン 2 でのウエイターの変更
<a name="migration-waiters"></a>

このトピックでは、バージョン 1 (v1) からバージョン 2 (v2) でのウェイター機能の変更について詳しく説明します。

次の表は、DynamoDB のウェイターの違いを具体的に示しています。他のサービスのウェイターも同じパターンに従います。

## 高レベル変更
<a name="migration-waiters-api-changes"></a>

ウェイタークラスは、 サービスと同じ Maven アーティファクトにあります。


| 変更 | v1 | v2 | 
| --- | --- | --- | 
|    Maven の依存関係  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.6801</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>dynamodb</artifactId><br />    </dependency><br /></dependencies><br /></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.102</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>dynamodb</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| パッケージ名 | com.amazonaws.services.dynamodbv2.waiters | software.amazon.awssdk.services.dynamodb.waiters | 
| クラス名 |  `[AmazonDynamoDBWaiters](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/waiters/AmazonDynamoDBWaiters.html)`  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/migration-waiters.html)  | 

1 [最新バージョン](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)。 2 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

## API の変更
<a name="migration-cf-presign-behavior-changes"></a>


| 変更 | v1 | v2 | 
| --- | --- | --- | 
| ウェイターを作成する |  <pre>AmazonDynamoDB client = AmazonDynamoDBClientBuilder <br />                            .standard().build();<br />AmazonDynamoDBWaiters waiter = client.waiters();</pre>  | 同期<pre>DynamoDbClient client = DynamoDbClient.create();<br />DynamoDbWaiter waiter = client.waiter();</pre>非同期<pre>DynamoDbAsyncClient asyncClient = <br />        DynamoDbAsyncClient.create();<br />DynamoDbAsyncWaiter waiter = asyncClient.waiter();</pre> | 
| テーブルが作成されるまで待機する | 同期<pre>waiter.tableExists()<br />    .run(new WaiterParameters<>(<br />        new DescribeTableRequest(tableName)));</pre>非同期<pre>waiter.tableExists()<br />    .runAsync(new WaiterParameters()<br />      .withRequest(new DescribeTableRequest(tableName)),<br />          new WaiterHandler() {<br />              @Override<br />              public void onWaitSuccess(<br />                  AmazonWebServiceRequest amazonWebServiceRequest) {<br />                    System.out.println("Table creation succeeded");<br />              }<br /><br />              @Override<br />              public void onWaitFailure(Exception e) {<br />                  e.printStackTrace();<br />              }<br />          }).get();</pre> |  同期 <pre>WaiterResponse<DescribeTableResponse> waiterResponse =<br />    waiter.waitUntilTableExists(<br />        r -> r.tableName("myTable"));<br />waiterResponse.matched().response()<br />       .ifPresent(System.out::println);</pre> 非同期 <pre>waiter.waitUntilTableExists(r -> r.tableName(tableName))<br />           .whenComplete((r, t) -> {<br />               if (t != null) {<br />                   t.printStackTrace();<br />               } else {<br />                   System.out.println(<br />                        "Table creation succeeded");<br />               }<br />           }).join();</pre>  | 

## 設定変更
<a name="migration-waiters-config"></a>


| 変更 | v1 | v2 | 
| --- | --- | --- | 
| ポーリング戦略 (最大試行回数と固定遅延) |  <pre>MaxAttemptsRetryStrategy maxAttemptsRetryStrategy = <br />        new MaxAttemptsRetryStrategy(10);<br /><br />FixedDelayStrategy fixedDelayStrategy = <br />        new FixedDelayStrategy(3);<br /><br />PollingStrategy pollingStrategy = <br />        new PollingStrategy(maxAttemptsRetryStrategy, <br />                fixedDelayStrategy);<br /><br />waiter.tableExists().run(<br />        new WaiterParameters<>(<br />            new DescribeTableRequest(tableName)), <br />                pollingStrategy);</pre>  |  <pre><br />FixedDelayBackoffStrategy fixedDelayBackoffStrategy = <br />        FixedDelayBackoffStrategy<br />            .create(Duration.ofSeconds(3));<br /><br />waiter.waitUntilTableExists(r -> r.tableName(tableName),<br />        c -> c.maxAttempts(10)<br />                .backoffStrategy(fixedDelayBackoffStrategy));</pre>  | 

# EC2 メタデータユーティリティのバージョン 1 からバージョン 2 への変更
<a name="migration-imds"></a>

このトピックでは、SDK for Java Amazon Elastic Compute Cloud (EC2) メタデータユーティリティのバージョン 1 (v1) からバージョン 2 (v2) への変更について詳しく説明します。

## 高レベル変更
<a name="migration-imds-high-level-changes"></a>


****  

| 変更 | v1 |  v2 | 
| --- | --- | --- | 
|    Maven の依存関係  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-core</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>imds</artifactId><br />    </dependency><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>apache-client3</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| パッケージ名 |  com.amazonaws.util  |  software.amazon.awssdk.imds  | 
| インスタンス化のアプローチ |  静的ユーティリティメソッドを使用し、インスタンス化を行わない。 <pre>String localHostName = <br />           EC2MetadataUtils.getLocalHostName();</pre>  |  静的ファクトリメソッドを使用する。 <pre>Ec2MetadataClient client = Ec2MetadataClient.create();</pre> または、ビルダーのアプローチを使用する。 <pre>Ec2MetadataClient client = Ec2MetadataClient.builder()<br />    .endpointMode(EndpointMode.IPV6)<br />    .build();</pre>  | 
| クライアントのタイプ | 同期専用ユーティリティメソッド: EC2MetadataUtils |  同期: `Ec2MetadataClient` 非同期: `Ec2MetadataAsyncClient`  | 

1 [最新バージョン](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)。 2 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

3 v2 `apache-client` モジュールの宣言に注目してください。EC2 メタデータユーティリティの V2 では、同期メタデータクライアント用の `SdkHttpClient` インターフェイスまたは非同期メタデータクライアント用の `SdkAsyncHttpClient` インターフェイスの実装が必要です。[で HTTP クライアントを設定する AWS SDK for Java 2.x](http-configuration.md) セクションには、使用できる HTTP クライアントのリストが表示されています。

### メタデータのリクエスト
<a name="migration-imds-fetching-changes"></a>

v1 では、パラメータを受け付けない静的メソッドを使用して EC2 リソースのメタデータをリクエストします。これとは対照的に、v2 では EC2 リソースへのパスをパラメータとして指定する必要があります。次の表は、それぞれのアプローチの違いをまとめたものです。


****  

| v1 |  v2 | 
| --- | --- | 
|  <pre>String userMetaData = EC2MetadataUtils.getUserData();</pre>  |  <pre>Ec2MetadataClient client = Ec2MetadataClient.create();<br />Ec2MetadataResponse response = <br />                client.get("/latest/user-data");<br />String userMetaData = <br />                response.asString();</pre>  | 

[インスタンスメタデータのカテゴリ](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instancedata-data-categories.html)を参照して、メタデータをリクエストするために指定する必要のあるパスを見つけてください。

**注記**  
v2 でインスタンスメタデータクライアントを使用するときは、メタデータを取得するすべてのリクエストに同じクライアントを使用することを心がける必要があります。

 

## 動作の変更
<a name="migration-imds-behavior-changes"></a>

### JSON データ
<a name="migration-imds-behavior-json"></a>

EC2 では、ローカルで実行されているインスタンスメタデータサービス (IMDS) が一部のメタデータを JSON 形式の文字列として返します。その一例が、[インスタンス ID ドキュメント](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instance-identity-documents.html)の動的メタデータです。

v1 API にはインスタンス ID メタデータごとに個別のメソッドが含まれていますが、v2 API は JSON 文字列を直接返します。JSON 文字列を処理するには、[ドキュメント API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/document/package-summary.html) を使用して応答を解析し、JSON 構造に移動します。

次の表は、v1 と v2 でインスタンス ID ドキュメントのメタデータを取得する方法を比較したものです。


****  

| ユースケース | v1 |  v2 | 
| --- | --- | --- | 
| リージョンを取得する |  <pre>InstanceInfo instanceInfo = <br />        EC2MetadataUtils.getInstanceInfo();<br />String region = instanceInfo.getRegion();</pre>  |  <pre>Ec2MetadataResponse response = <br />    client.get("/latest/dynamic/instance-identity/document");<br />Document instanceInfo = response.asDocument();<br />String region = instanceInfo.asMap().get("region").asString();</pre>  | 
| インスタンス ID を取得する |  <pre>InstanceInfo instanceInfo = <br />        EC2MetadataUtils.getInstanceInfo();<br />String instanceId = instanceInfo.instanceId;</pre>  |  <pre>Ec2MetadataResponse response = <br />    client.get("/latest/dynamic/instance-identity/document");<br />Document instanceInfo = response.asDocument();<br />String instanceId = instanceInfo.asMap().get("instanceId").asString();</pre>  | 
| インスタンスタイプを取得する |  <pre>InstanceInfo instanceInfo = <br />        EC2MetadataUtils.getInstanceInfo();<br />String instanceType = instanceInfo.instanceType();</pre>  |  <pre>Ec2MetadataResponse response = <br />    client.get("/latest/dynamic/instance-identity/document");<br />Document instanceInfo = response.asDocument();<br />String instanceType = instanceInfo.asMap().get("instanceType").asString();</pre>  | 

### エンドポイント解決の違い
<a name="migration-imds-behavior-endpoint-res"></a>

次の表は、エンドポイントを IMDS に対して解決するために SDK がチェックする場所を示しています。場所は優先度の高い順にリストされています。


****  

| v1 |  v2 | 
| --- | --- | 
| システムプロパティ: com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | クライアントビルダーの設定方法: endpoint(...) | 
| 環境変数: AWS\$1EC2\$1METADATA\$1SERVICE\$1ENDPOINT | システムプロパティ: aws.ec2MetadataServiceEndpoint | 
| デフォルト値: http://169.254.169.254 | Config ファイル: \$1.aws/config、ec2\$1metadata\$1service\$1endpoint 設定 | 
|  | 解決済み endpoint-mode に関連する値  | 
|  | デフォルト値: http://169.254.169.254 | 

### v2 のエンドポイント解決
<a name="migration-imds-behavior-endpoint-res2"></a>

ビルダーを使用してエンドポイントを明示的に設定すると、そのエンドポイント値が他のすべての設定よりも優先されます。次のコードを実行すると、`aws.ec2MetadataServiceEndpoint` システムプロパティと設定ファイル `ec2_metadata_service_endpoint` の設定が存在しても無視されます。

```
Ec2MetadataClient client = Ec2MetadataClient
  .builder()
  .endpoint(URI.create("endpoint.to.use"))
  .build();
```

#### エンドポイントモード
<a name="migration-imds-behavior-endpoint-mode"></a>

v2 では、エンドポイントモードを指定して、メタデータクライアントが IPv4 または IPv6 のデフォルトのエンドポイント値を使用するように設定できます。v1 ではエンドポイントモードを使用できません。IPv4 で使用されるデフォルト値は `http://169.254.169.254` で、IPv6 では `http://[fd00:ec2::254]` です。

次の表に、エンドポイントモードを設定するさまざまな方法を優先順位の高い順に示します。


****  

|  |  | 使用できる値 | 
| --- | --- | --- | 
| クライアントビルダーの設定方法: endpointMode(...) |  <pre>Ec2MetadataClient client = Ec2MetadataClient<br />  .builder()<br />  .endpointMode(EndpointMode.IPV4)<br />  .build();</pre>  | EndpointMode.IPV4, EndpointMode.IPV6 | 
| システムプロパティ | aws.ec2MetadataServiceEndpointMode | IPv4、IPv6 (大文字と小文字は区別されません) | 
| 設定ファイル: \$1.aws/config  | ec2\$1metadata\$1service\$1endpoint の設定 | IPv4、IPv6 (大文字と小文字は区別されません) | 
| 以前の方法では未指定 | IPv4 が使用される |  | 

#### v2 での SDK による `endpoint` または `endpoint-mode` の解決方法
<a name="migration-imds-behavior-endpoint-res2-which"></a>

1. SDK は、クライアントビルダーのコードで設定した値を使用し、外部設定は無視します。`endpoint` および `endpointMode` が両方ともクライアントビルダーで呼び出されると SDK は例外をスローするため、SDK はユーザーが使用するメソッドのエンドポイント値を使用します。

1. コードで値を設定しない場合、SDK は外部設定を調べます。最初にシステムプロパティを検索し、次に設定ファイル内の設定を検索します。

   1. SDK は最初にエンドポイント値をチェックします。値が見つかると、その値が使用されます。

   1. 値が見つからない場合は、SDK はエンドポイントモード設定を探します。

1. 最後に、SDK が外部設定を見つけられず、コードでメタデータクライアントを設定していない場合は、SDK は IPv4 の値の `http://169.254.169.254` を使用します。

### IMDSv2
<a name="migration-imds-behavior-imdsv2"></a>

Amazon EC2 では、インスタンスメタデータにアクセスするための 2 つのアプローチを定義しています。
+ インスタンスメタデータサービスバージョン 1 (IMDSv1) – リクエスト/レスポンスアプローチ
+ インスタンスメタデータサービスバージョン 2 (IMDSv2) – セッション指向アプローチ

次の表は、Java SDK が IMDS をどのように使用するかを比較したものです。


****  

| v1 |  v2 | 
| --- | --- | 
| IMDSv2 がデフォルトで使用される | IMDSv2 を常に使用する | 
| リクエストごとにセッショントークンの取得を試み、セッショントークンの取得に失敗した場合は IMDSv1 にフォールバックする | セッショントークンを内部キャッシュに保持し、複数のリクエストで再利用する | 

SDK for Java 2.x は IMDSv2 のみをサポートしており、IMDSv1 にはフォールバックしません。

## 設定の違い
<a name="migration-imds-config-diffs"></a>

以下の表にさまざまな設定オプション一覧表示します。


****  

| 設定 | v1 |  v2 | 
| --- | --- | --- | 
| 再試行 | 設定不可 | ビルダーメソッド retryPolicy(...) で設定可能  | 
| HTTP | 接続タイムアウトは AWS\$1METADATA\$1SERVICE\$1TIMEOUT 環境変数で設定可能。デフォルト値は 1 秒です。 | HTTP クライアントを httpClient(...) ビルダーメソッドに渡すことで設定可能。HTTP クライアントのデフォルトの接続タイムアウトは 2 秒です。 | 

### v2 の HTTP 設定の例
<a name="migration-imds-http-conf-v2-ex"></a>

以下の例に、メタデータクライアントの設定方法を示します。この例では、接続タイムアウトを設定し、Apache HTTP クライアントを使用します。

```
SdkHttpClient httpClient = ApacheHttpClient.builder()
    .connectionTimeout(Duration.ofSeconds(1))
    .build();

Ec2MetadataClient imdsClient = Ec2MetadataClient.builder()
    .httpClient(httpClient)
    .build();
```

# Amazon CloudFront バージョン 1 からバージョン 2 での事前署名の変更
<a name="migration-cloudfront-presigning"></a>

このトピックでは、Amazon CloudFront のバージョン 1 (v1) からバージョン 2 (v2) での変更点について詳しく説明します。

## 高レベル変更
<a name="migration-cloudfront-presigning-api-changes"></a>


****  

| 変更 | v1 |  v2 | 
| --- | --- | --- | 
|    Maven の依存関係  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency>  <br />        <groupId>com.amazonaws</groupId><br />        <artifactId>cloudfront</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>cloudfront</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| パッケージ名 | com.amazonaws.services.cloudfront | software.amazon.awssdk.services.cloudfront | 
| クラス名 |  [CloudFrontUrlSigner](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudfront/CloudFrontUrlSigner.html) [CloudFrontCookieSigner](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudfront/CloudFrontCookieSigner.html)  |  [CloudFrontUtilities](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cloudfront/CloudFrontUtilities.html) [SignedUrl](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cloudfront/url/SignedUrl.html) [CannedSignerRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cloudfront/model/CannedSignerRequest.html) [CustomSignerRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cloudfront/model/CustomSignerRequest.html)  | 

1 [最新バージョン](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)。 2 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

## API の変更
<a name="migration-cf-presign-behavior-changes"></a>


| 行動 | v1 |  v2 | 
| --- | --- | --- | 
| 既定リクエストの構築 | 引数は API に直接渡されます。 |  <pre>CannedSignerRequest cannedRequest =<br />      CannedSignerRequest.builder()<br />                         .resourceUrl(resourceUrl)<br />                         .privateKey(privateKey)<br />                         .keyPairId(keyPairId)<br />                         .expirationDate(expirationDate)<br />                         .build();</pre>  | 
| カスタムリクエストの構築 | 引数は API に直接渡されます。 |  <pre>CustomSignerRequest customRequest =<br />      CustomSignerRequest.builder()<br />                         .resourceUrl(resourceUrl)<br />                         .resourceUrlPattern(resourceUrlPattern)<br />                         .privateKey(keyFile)<br />                         .keyPairId(keyPairId)<br />                         .expirationDate(expirationDate)<br />                         .activeDate(activeDate)<br />                         .ipRange(ipRange)<br />                         .build();</pre>  | 
| 署名付き URL (既定) の生成 |  <pre>String signedUrl =<br />  CloudFrontUrlSigner.getSignedURLWithCannedPolicy(<br />    resourceUrl, keyPairId, privateKey, expirationDate);</pre>  |  <pre>CloudFrontUtilities cloudFrontUtilities =<br />    CloudFrontUtilities.create();<br /><br />SignedUrl signedUrl =        <br />    cloudFrontUtilities.getSignedUrlWithCannedPolicy(cannedRequest);<br /><br />String url = signedUrl.url();<br /></pre>  | 
| 署名付き Cookie (カスタム) の生成 |  <pre>CookiesForCustomPolicy cookies =<br />    CloudFrontCookieSigner.getCookiesForCustomPolicy(<br />        resourceUrl, privateKey, keyPairId, expirationDate, <br />        activeDate, ipRange);<br /></pre>  |  <pre>CloudFrontUtilities cloudFrontUtilities =<br />    CloudFrontUtilities.create();<br /><br />CookiesForCustomPolicy cookies =<br />     cloudFrontUtilities.getCookiesForCustomPolicy(customRequest);<br /></pre>  | 

### v2 のリファクタリング済み Cookie ヘッダー
<a name="migration-cf-presign-behavior-headers"></a>

Java v1 では、Java SDK は Cookie ヘッダーを `Map.Entry<String, String>` として配信します。

```
Map.Entry<String, String> signatureMap = cookies.getSignature();
String signatureKey = signatureMap.getKey(); // "CloudFront-Signature"
String signatureValue = signatureMap.getValue(); // "[SIGNATURE_VALUE]"
```

Java v2 SDK は、ヘッダー全体を単一の `String` として配信します。

```
String signatureHeaderValue = cookies.signatureHeaderValue(); // "CloudFront-Signature=[SIGNATURE_VALUE]"
```

# IAM Policy Builder API のバージョン 1 からバージョン 2 での変更
<a name="migration-iam-policy-builder"></a>

このトピックでは、バージョン 1 (v1) からバージョン 2 (v2) での IAM Policy Builder API の変更点について詳しく説明します。

## 高レベル変更
<a name="migration-iam-policy-builder-high-level"></a>


****  

| 変更 | v1 |  v2 | 
| --- | --- | --- | 
|    Maven の依存関係  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-core</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>iam-policy-builder</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| パッケージ名 | com.amazonaws.auth.policy | software.amazon.awssdk.policybuilder.iam | 
| クラス名 |  [Policy](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Policy.html) [Statement](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Statement.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/migration-iam-policy-builder.html)  |  [IamPolicy](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPolicy.html) [IamStatement](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamStatement.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/migration-iam-policy-builder.html)  | 

1 [最新バージョン](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)。 2 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

## API の変更
<a name="migration-iam-policy-builder-api"></a>


****  

| 設定 | v1 |  v2 | 
| --- | --- | --- | 
|  ポリシーのインスタンス化 |  <pre>Policy policy = new Policy();</pre>  |  <pre>IamPolicy.Builder policyBuilder = IamPolicy.builder();<br />...<br />IamPolicy policy = policyBuilder.build();</pre>  | 
|    ID の設定  |  <pre>policy.withtId(...);<br />policy.setId(...);</pre>  |  <pre>policyBuilder.id(...);</pre>  | 
|    バージョンの設定  | 該当なし - 2012-10-17 のデフォルトバージョンを使用します |  <pre>policyBuilder.version(...);</pre>  | 
|    ステートメントの作成  |  <pre>Statement statement = <br />    new Statement(Effect.Allow)<br />            .withActions(...)<br />            .withConditions(...)<br />            .withId(...)<br />            .withPrincipals(...)<br />            .withResources(...);</pre>  |  <pre>IamStatement statement = <br />    IamStatement.builder()<br />            .effect(IamEffect.ALLOW)<br />            .actions(...)<br />            .notActions(...)<br />            .conditions(...)<br />            .sid(...)<br />            .principals(...)<br />            .notPrincipals(...)<br />            .resources(...)<br />            .notResources(...)<br />            .build()</pre>  | 
|    ステートメントの設定  |  <pre>policy.withStatements(statement);<br />policy.setStatements(statement);</pre>  |  <pre>policyBuilder.addStatement(statement);</pre>  | 

## ステートメントの構築における違い
<a name="migration-iam-policy-builder-statement"></a>

### アクション
<a name="migration-iam-policy-builder-statement-actions"></a>

#### v1
<a name="migration-iam-policy-builder-statement-actions.v1"></a>

v1 SDK には、ポリシーステートメントの `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html)` 要素を表すサービスアクションの[`enum` 型](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Action.html)があります。次に、`enum` 型の例をいくつか示します。
+ `[IdentityManagementActions](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/actions/IdentityManagementActions.html)`
+ `[DynamoDBv2Actions](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/actions/DynamoDBv2Actions.html)`
+ `[SQSActions](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/actions/SQSActions.html)`

次の例では、`SQSActions` の `SendMessage` 定数の例を示します。

```
Action action = SQSActions.SendMessage;
```

v1 のステートメントに `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notaction.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notaction.html)` 要素を指定することはできません。

#### v2
<a name="migration-iam-policy-builder-statement-actions.v2"></a>

v2 では、[IamAction](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamAction.html) インターフェイスがすべてのアクションを表します。[サービス固有のアクション](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html)要素を指定するには、次のコードに示すように、`create` メソッドに文字列を渡します。

```
IamAction action = IamAction.create("sqs:SendMessage");
```

次のコードに示すように、v2 を使用してステートメントに `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notaction.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notaction.html)` を指定できます。

```
IamAction action = IamAction.create("sqs:SendMessage");
IamStatement.builder().addNotAction(action);
```

### 条件
<a name="migration-iam-policy-builder-statement-conditions"></a>

#### v1
<a name="migration-iam-policy-builder-statement-conditions-v1"></a>

ステートメント条件を表すために、v1 SDK は [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Condition.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Condition.html) のサブクラスを使用します。
+  [ArnCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/ArnCondition.html) 
+  [BooleanCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/BooleanCondition.html)
+  [DateCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/DateCondition.html)
+ [IpAddressCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/IpAddressCondition.html)
+ [NumericCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/NumericCondition.html)
+ [ StringCondition ](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/StringCondition.html)

各 `Condition` サブクラスは、条件の定義に役立つ比較 `enum` タイプを定義します。たとえば、次の例は条件に対する*Not Like* [文字列比較](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String)を示しています。

```
Condition condition = new StringCondition(StringComparisonType.StringNotLike, "key", "value");
```

#### v2
<a name="migration-iam-policy-builder-statement-conditions-v2"></a>

v2 では、`[IamCondition](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamCondition.html)` を使用してポリシーステートメントの条件を構築し、すべてのタイプに `enums` を含む `[IamConditionOperator](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamConditionOperator.html)` を指定します。

```
IamCondition condition = IamCondition.create(IamConditionOperator.STRING_NOT_LIKE, "key", "value");
```

### リソース
<a name="migration-iam-policy-builder-statement-resources"></a>

#### v1
<a name="migration-iam-policy-builder-statement-resources-v1"></a>

ポリシーステートメントの `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html)` 要素は、SDK の `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` クラスによって表されます。ARN をコンストラクタの文字列として指定します。次のサブクラスは便利なコンストラクタを提供します。
+ [S3BucketResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/S3BucketResource.html)
+ [S3ObjectResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/S3ObjectResource.html)
+ [SQSQueueResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/SQSQueueResource.html)

v1 では、次のステートメントに示すように、`withIsNotType` メソッドを呼び出すことで、`[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` の `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html)` 要素を指定できます。

```
Resource resource = new Resource("arn:aws:s3:::amzn-s3-demo-bucket").withIsNotType(true);
```

#### v2
<a name="migration-iam-policy-builder-statement-resources-v2"></a>

v2 では、ARN を `IamResource.create` メソッドに渡すことで `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html)` 要素を作成します。

```
IamResource resource = IamResource.create("arn:aws:s3:::amzn-s3-demo-bucket");
```

次のスニペットに示すように、`[IamResource](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamResource.html)` を *[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html)* 要素として設定できます。

```
IamResource resource = IamResource.create("arn:aws:s3:::amzn-s3-demo-bucket");
IamStatement.builder().addNotResource(resource);
```

`IamResource.ALL` はすべてのリソースを表します。

### プリンシパル
<a name="migration-iam-policy-builder-statement-principal"></a>

#### v1
<a name="migration-iam-policy-builder-statement-principal-v1"></a>

v1 SDK は、すべてのメンバーを含むプリンシパルのタイプを表す次の `[Principal](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Principal.html)` クラスを提供します。
+ `AllUsers`
+ `AllServices`
+ `AllWebProviders`
+ `All`

ステートメントに `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html)` 要素を追加することはできません。

#### v2
<a name="migration-iam-policy-builder-statement-principal-v2"></a>

v2 では、`IamPrincipal.ALL` はすべてのプリンシパルを表します。

他のタイプのプリンシパルのすべてのメンバーを表すには、`IamPrincipal` を作成するときに `[IamPrincipalType](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPrincipalType.html)` クラスを使用します。
+ すべてのユーザーの `IamPrincipal.create(IamPrincipalType.AWS,"*")`。
+ すべてのサービスの `IamPrincipal.create(IamPrincipalType.SERVICE,"*")`。
+ すべてのウェブプロバイダーの `IamPrincipal.create(IamPrincipalType.FEDERATED,"*")`。
+ すべての正規ユーザーの `IamPrincipal.create(IamPrincipalType.CANONICAL_USER,"*")`。

次のステートメントに示すように、ポリシーステートメントを作成するときに `addNotPrincipal` メソッドを使用して `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html)` 要素を表すことができます。

```
IamPrincipal principal = IamPrincipal.create(IamPrincipalType.AWS, "arn:aws:iam::444455556666:root");
IamStatement.builder().addNotPrincipal(principal);
```

# DynamoDB の使用における のバージョン 1 からバージョン 2 への変更 AWS SDK for Java
<a name="migration-ddb-mapper"></a>



**Topics**
+ [のバージョン 1 とバージョン 2 の DynamoDB マッピング API の違い AWS SDK for Java](ddb-mapping.md)
+ [のバージョン 1 とバージョン 2 の API の違いを文書化する AWS SDK for Java](dynamodb-mapping-document-api.md)
+ [暗号化ライブラリの移行](ddb-encryption-lib-migrate.md)

# のバージョン 1 とバージョン 2 の DynamoDB マッピング API の違い AWS SDK for Java
<a name="ddb-mapping"></a>

 AWS SDK for Javaのバージョン 1 とバージョン 2 で、DynamoDB マッピング API が大幅に変更されました。バージョン 1 では、 `DynamoDBMapper` を使用して Java POJO を操作します。バージョン 2 では、更新されたメソッド名、拡張されたスキーマ定義オプション、より安全な型を利用できる `DynamoDbEnhancedClient` を使用します。

主な変更点は次のとおりです。
+ 新しいメソッド名 (`getItem` の代わりに `load` など)
+ 明示的なテーブルスキーマの作成
+ 同期オペレーションと非同期オペレーション両方の組み込みサポート
+ 空の文字列と設定の処理方法の変更

このセクションでは、マッピング API の変更、注釈の違い、設定の更新について説明し、v1 `DynamoDBMapper` から v2 `DynamoDbEnhancedClient` への移行に役立つ移行ガイダンスを提供します。

**Contents**
+ [SDK for Java のバージョン 1 からバージョン 2 での、マッピングライブラリ高レベル変更](dynamodb-mapping-high-level.md)
  + [依存関係の差異をインポートする](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [SDK for Java のバージョン 1 とバージョン 2 での DynamoDB マッピング API の変更](dynamodb-mapping-api-changes.md)
  + [クライアントの作成](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [DynamoDB テーブル/インデックスへのマッピングを確立する](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [Table operations](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [クラスとプロパティをマッピングする](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [Bean 注釈](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [V2 の追加注釈](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [設定](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [オペレーションごとの設定](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [条件式](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [型変換](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [デフォルトコンバータ](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [属性のカスタムコンバータを設定する](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [タイプコンバータファクトリまたはプロバイダーを追加する](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [SDK for Java のバージョン 1 とバージョン 2 の文字列処理の違い](dynamodb-migration-string-handling.md)
+ [SDK for Java のバージョン 1 とバージョン 2 の楽観的ロックの違い](dynamodb-migrate-optimstic-locking.md)
+ [SDK for Java のバージョン 1 とバージョン 2 の Fluent セッターの違い](dynamodb-migrate-fluent-setters.md)

# SDK for Java のバージョン 1 からバージョン 2 での、マッピングライブラリ高レベル変更
<a name="dynamodb-mapping-high-level"></a>

各ライブラリのマッピングクライアントの名前は、V1 と V2 で異なります。
+ V1 - DynamoDBMapper
+ V2 - DynamoDB Enhanced Client

2 つのライブラリの使用方法はほぼ同じです。マッパー/クライアントをインスタンス化し、これらの項目を DynamoDB テーブルに対して読み書きする API に Java POJO を渡します。どちらのライブラリも POJO のクラスに注釈を提供し、クライアントが POJO をどのように処理するかを指示します。

V2 に移行する場合の顕著な違いは次のとおりです。
+ V2 と V1 は、低レベルの DynamoDB オペレーションに異なるメソッド名を使用します。例えば、次のようになります。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ V2 には、テーブルスキーマを定義し、POJO をテーブルにマッピングする複数の方法があります。注釈を使用することも、ビルダーを使用してコードから生成されたスキーマを使用することもできます。V2 は、変更可能なバージョンと変更不可能なバージョンのスキーマも提供します。
+ V2 では、最初のステップの 1 つとしてテーブルスキーマを具体的に作成しますが、V1 では、テーブルスキーマは必要に応じて注釈付きクラスから推測されます。
+ V2 には拡張クライアント API に[ドキュメント API クライアント](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html)が含まれていますが、V1 は[別の API](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html) を使用します。
+ V2 では、すべての API が同期バージョンと非同期バージョンで使用できます。

V2 拡張クライアントの詳細については、本ガイドの [「DynamoDB マッピング」セクション](dynamodb-enhanced-client.md)を参照してください。

## 依存関係の差異をインポートする
<a name="dynamodb-mapping-deps"></a>


| V1 | V2 | 
| --- | --- | 
|  <pre><dependencyManagement><br />  <dependencies><br />    <dependency><br />      <groupId>com.amazonaws</groupId><br />      <artifactId>aws-java-sdk-bom</artifactId><br />      <version>1.X.X</version><br />      <type>pom</type><br />      <scope>import</scope><br />    </dependency><br />  </dependencies><br /></dependencyManagement> <br /><br /><dependencies><br />  <dependency><br />    <groupId>com.amazonaws</groupId><br />    <artifactId>aws-java-sdk-dynamodb</artifactId><br />  </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />  <dependencies><br />    <dependency><br />      <groupId>software.amazon.awssdk</groupId><br />      <artifactId>bom</artifactId><br />      <version>2.X.X*</version><br />      <type>pom</type><br />      <scope>import</scope><br />    </dependency><br />  </dependencies><br /></dependencyManagement> <br /><br /><dependencies><br />  <dependency><br />    <groupId>software.amazon.awssdk</groupId><br />    <artifactId>dynamodb-enhanced</artifactId><br />  </dependency><br /></dependencies></pre>  | 

\$1 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)

V1 では、1 つの依存関係に低レベルの DynamoDB API とマッピング/ドキュメント API の両方が含まれますが、V2 では、`dynamodb-enhanced` アーティファクト依存関係を使用してマッピング/ドキュメント API にアクセスします。`dynamodb-enhanced` モジュールには、低レベル `dynamodb` モジュールへの推移的な依存関係が含まれています。

# SDK for Java のバージョン 1 とバージョン 2 での DynamoDB マッピング API の変更
<a name="dynamodb-mapping-api-changes"></a>

## クライアントの作成
<a name="dynamodb-mapping-api-changes-client"></a>


****  

| ユースケース | V1 | V2 | 
| --- | --- | --- | 
|   通常のインスタンス化  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard()<br />    .withCredentials(credentialsProvider)<br />    .withRegion(Regions.US_EAST_1)<br />    .build();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbClient standardClient = DynamoDbClient.builder()<br />    .credentialsProvider(ProfileCredentialsProvider.create())<br />    .region(Region.US_EAST_1)<br />    .build();<br />DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()<br />    .dynamoDbClient(standardClient)<br />    .build();</pre>  | 
|   最小限のインスタンス化  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   属性トランスフォーマーを使用\$1  |  <pre>DynamoDBMapper mapper = new DynamoDBMapper(standardClient, <br />                        attributeTransformerInstance);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()<br />    .dynamoDbClient(standardClient)<br />    .extensions(extensionAInstance, extensionBInstance)<br />    .build();</pre>  | 

\$1V2 の拡張機能は、V1 の属性トランスフォーマーにほぼ対応しています。[拡張機能を使用して DynamoDB 拡張クライアントオペレーションをカスタマイズする](ddb-en-client-extensions.md) セクションには、V2 の拡張機能に関する詳細情報が記載されています。

## DynamoDB テーブル/インデックスへのマッピングを確立する
<a name="dynamodb-mapping-api-changes-mapping"></a>

V1 では、Bean 注釈を使用して DynamoDB テーブル名を指定します。V2 では、ファクトリメソッドである `table()` がリモート DynamoDB テーブルを表す `DynamoDbTable` のインスタンスを生成します。`table()` メソッドの最初のパラメータは、DynamoDB テーブル名です。


****  

| ユースケース | V1 | V2 | 
| --- | --- | --- | 
|   Java POJO クラスを DynamoDB テーブルにマッピングする  |  <pre>@DynamoDBTable(tableName ="Customer")<br />public class Customer {<br />  ...<br />}</pre>  |  <pre>DynamoDbTable<Customer> customerTable = enhancedClient.table("Customer",<br />    TableSchema.fromBean(Customer.class));</pre>  | 
|   DynamoDB セカンダリインデックスへのマッピング  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) [V1 の `query` メソッド](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query)について説明する DynamoDB デベロッパーガイドのセクションでは、完全な例を示しています。  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) 詳細については、このガイドの「[セカンダリインデックスを使用する](ddb-en-client-use-secindex.md)」セクションを参照してください。  | 

## Table operations
<a name="dynamodb-mapping-api-changes-tobleops"></a>

このセクションでは、ほとんどの標準的なユースケースにおいて V1 と V2 で異なるオペレーション API について説明します。

V2 では、単一のテーブルを含むすべてのオペレーションが、拡張クライアントではなく `DynamoDbTable` インスタンスで呼び出されます。拡張クライアントには、複数のテーブルをターゲットにできるメソッドが含まれています。

以下の「*テーブルオペレーション*」という表では、POJO インスタンスは `item` または `customer1` などの特定のタイプとして記載されています。V2 の例の場合、`table` という名前のインスタンスは、`DynamoDbTable` インスタンスへの参照を返す `enhancedClient.table()` を以前に呼び出した結果です。

ほとんどの V2 オペレーションは、表示されていない場合で fluent コンシューマーパターンで呼び出すことができます。例えば、

```
Customer customer = table.getItem(r → r.key(key));
  or
Customer customer = table.getItem(r → r.key(k -> k.partitionValue("id").sortValue("email")))
```

V1 オペレーションの場合、テーブルオペレーション** (以下) には一般的に使用される形式の一部のみが含まれており、すべてのオーバーロードされた形式が含まれているわけではありません。たとえば、 `load()` メソッドには次のオーバーロードがあります。

```
mapper.load(Customer.class, hashKey)
mapper.load(Customer.class, hashKey, rangeKey)
mapper.load(Customer.class, hashKey, config)
mapper.load(Customer.class, hashKey, rangeKey, config)
mapper.load(item)
mapper.load(item, config)
```

テーブルオペレーション* *(以下) は、一般的に使用される形式を示しています。

```
mapper.load(item)
mapper.load(item, config)
```


**Table operations**  

| ユースケース | V1 | V2 | 
| --- | --- | --- | 
|  Java POJO を DynamoDB テーブルに書き込む **DynamoDB オペレーション:**、`PutItem`、`UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> V1 では、`DynamoDBMapperConfig.SaveBehavior` および注釈によって、呼び出される低レベルの DynamoDB メソッドが決まります。一般的に、`SaveBehavior.CLOBBER` と `SaveBehavior.PUT` を使用する場合を除いて `UpdateItem` が呼び出されます。自動生成されたキーは特殊なユースケースであり、`PutItem` と `UpdateItem` の両方が使用されることもあります。  |  <pre>table.putItem(putItemRequest)<br />table.putItem(item)<br />table.putItemWithResponse(item) //Returns metadata.<br /><br />updateItem(updateItemRequest)<br />table.updateItem(item)<br />table.updateItemWithResponse(item) //Returns metadata.</pre>  | 
|  DynamoDB テーブルから Java POJO に項目を読み込む **DynamoDB オペレーション:** `GetItem`  |  <pre>mapper.load(item)<br />mapper.load(item, config)</pre>  |  <pre>table.getItem(getItemRequest)<br />table.getItem(item)<br />table.getItem(key)<br />table.getItemWithResponse(key) //Returns POJO with metadata.</pre>  | 
|  DynamoDB テーブルから項目を削除します。 **DynamoDB オペレーション:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  DynamoDB テーブルまたはセカンダリインデックスをクエリし、ページ分割されたリストを返します。 **DynamoDB オペレーション:** `Query`  |  <pre>mapper.query(Customer.class, queryExpression)<br />mapper.query(Customer.class, queryExpression, <br />                             mapperConfig)</pre>  |  <pre>table.query(queryRequest)<br />table.query(queryConditional)</pre> 同期レスポンスには返された `PageIterable.stream()` (遅延読み込み) を、非同期レスポンスには `PagePublisher.subscribe()` を使用します。  | 
|  DynamoDB テーブルまたはセカンダリインデックスをクエリしてリストを返します。 **DynamoDB オペレーション:** `Query`  |  <pre>mapper.queryPage(Customer.class, queryExpression)<br />mapper.queryPage(Customer.class, queryExpression, <br />                                 mapperConfig)</pre>  |  <pre>table.query(queryRequest)<br />table.query(queryConditional)</pre> 同期レスポンスには返された `PageIterable.items()` (遅延読み込み) を、非同期レスポンスには `PagePublisher.items.subscribe()` を使用します。  | 
|  DynamoDB テーブルまたはセカンダリインデックスをスキャンしてページ分割されたリストを返します。 **DynamoDB オペレーション:** `Scan`  |  <pre>mapper.scan(Customer.class, scanExpression)<br />mapper.scan(Customer.class, scanExpression, <br />                            mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> 同期レスポンスには返された `PageIterable.stream()` (遅延読み込み) を、非同期レスポンスには `PagePublisher.subscribe()` を使用します。  | 
|  DynamoDB テーブルまたはセカンダリインデックスをスキャンしてリストを返します。 **DynamoDB オペレーション:** `Scan`  |  <pre>mapper.scanPage(Customer.class, scanExpression)<br />mapper.scanPage(Customer.class, scanExpression, <br />                                mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> 同期レスポンスには返された `PageIterable.items()` (遅延読み込み) を、非同期レスポンスには `PagePublisher.items.subscribe()` を使用します。  | 
|  複数のテーブルから複数の項目をバッチで読み取ります。 **DynamoDB オペレーション:** `BatchGetItem`  |  <pre>mapper.batchLoad(Arrays.asList(customer1, <br />                               customer2, <br />                               book1))<br />mapper.batchLoad(itemsToGet) <br />           // itemsToGet: Map<Class<?>, List<KeyPair>></pre>  |  <pre>enhancedClient.batchGetItem(batchGetItemRequest)<br /><br />enhancedClient.batchGetItem(r -> r.readBatches(<br />    ReadBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addGetItem(i -> i.key(k -> k.partitionValue(0)))<br />             .build(),<br />    ReadBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addGetItem(i -> i.key(k -> k.partitionValue(0)))<br />             .build()))<br /><br />// Iterate over pages with lazy loading or over all items <br />   from the same table.</pre>  | 
|  複数のテーブルに複数の項目をバッチで書き込みます。 **DynamoDB オペレーション:** `BatchWriteItem`  |  <pre>mapper.batchSave(Arrays.asList(customer1, <br />                               customer2, <br />                               book1)) </pre>  |  <pre>enhancedClient.batchWriteItem(batchWriteItemRequest)<br /><br />enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addPutItem(item1)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addPutItem(item2)<br />             .build()))</pre>  | 
|  複数のテーブルから複数の項目をバッチで削除します。 **DynamoDB オペレーション:** `BatchWriteItem`  |  <pre>mapper.batchDelete(Arrays.asList(customer1, <br />                                 customer2, <br />                                 book1)) </pre>  |  <pre>enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addDeleteItem(item1key)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addDeleteItem(item2key)<br />             .build()))</pre>  | 
|  複数の項目をバッチで書き込み/削除します。 **DynamoDB オペレーション:** `BatchWriteItem`  |  <pre>mapper.batchWrite(Arrays.asList(customer1, book1), <br />                  Arrays.asList(customer2)) </pre>  |  <pre>enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addPutItem(item1)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addDeleteItem(item2key)<br />             .build()))</pre>  | 
|  トランザクション書き込みを実行します。 **DynamoDB オペレーション:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  トランザクション読み取りを実行します。 **DynamoDB オペレーション:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  クエリの一致する項目の数を取得します。 **DynamoDB オペレーション:** `Select.COUNT` による`Query`  |  <pre>mapper.count(Customer.class, queryExpression)</pre>  |  <pre>// Get the count from query results.<br />PageIterable<Customer> pageIterable =<br />    customerTable.query(QueryEnhancedRequest.builder()<br />        .queryConditional(queryConditional)<br />        .select(Select.COUNT)<br />        .build());<br />Iterator<Page<Customer>> iterator = pageIterable.iterator();<br />Page<Customer> page = iterator.next();<br />int count = page.count();<br /><br />// For a more concise approach, you can chain the method calls:<br />int count = customerTable.query(QueryEnhancedRequest.builder()<br />                .queryConditional(queryConditional)<br />                .select(Select.COUNT)<br />                .build())<br />            .iterator().next().count();</pre>  | 
|  スキャンの一致する項目の数を取得します。 **DynamoDB オペレーション:** `Select.COUNT` による `Scan`  |  <pre>mapper.count(Customer.class, scanExpression)</pre>  |  <pre>// Get the count from scan results.<br />PageIterable<Customer> pageIterable =<br />    customerTable.scan(ScanEnhancedRequest.builder()<br />        .filterExpression(filterExpression)<br />        .select(Select.COUNT)<br />        .build());<br />Iterator<Page<Customer>> iterator = pageIterable.iterator();<br />Page<Customer> page = iterator.next();<br />int count = page.count();<br /><br />// For a more concise approach, you can chain the method calls:<br />int count = customerTable.scan(ScanEnhancedRequest.builder()<br />                .filterExpression(filterExpression)<br />                .select(Select.COUNT)<br />                .build())<br />            .iterator().next().count();</pre>  | 
|  POJO クラスに対応するテーブルを DynamoDB に作成します。 **DynamoDB オペレーション:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> 前のステートメントは、低レベルのテーブル作成リクエストを生成します。ユーザーは DynamoDB クライアントで `createTable` を呼び出す必要があります。  |  <pre>table.createTable(createTableRequest)<br /><br />table.createTable(r -> r.provisionedThroughput(defaultThroughput())<br />    .globalSecondaryIndices(<br />        EnhancedGlobalSecondaryIndex.builder()<br />            .indexName("gsi_1")<br />            .projection(p -> p.projectionType(ProjectionType.ALL))<br />            .provisionedThroughput(defaultThroughput())<br />            .build()));</pre>  | 
|  DynamoDB で並列スキャンを実行します。 **DynamoDB オペレーション:** `Segment` と `TotalSegments` パラメータを使用した `Scan`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  ユーザーはワーカースレッドを処理し、セグメントごとに `scan` を呼び出す必要があります。 <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Amazon S3 と DynamoDB を統合してインテリジェントな S3 リンクを保存します。  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  Amazon S3 と DynamoDB が結合されるため、サポートされていません。  | 

## クラスとプロパティをマッピングする
<a name="dynamodb-mapping-schemas"></a>

V1 と V2 の両方で、Bean 形式の注釈を使用してクラスをテーブルにマッピングします。V2 には、変更不可能なクラスの使用など、特定のユースケースの[スキーマを定義する他の方法](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview)もあります。

### Bean 注釈
<a name="dynamodb-mapping-schemas-annos"></a>

次の表は、V1 および V2 で使用される、特定のユースケースにおける同等の Bean 注釈を示しています。`Customer` クラスシナリオは、パラメータを説明するために使用されます。

V2 の注釈、クラス、列挙はキャメルケース規則に従い、「DynamoDB」ではなく「DynamoDb」を使用します。


| ユースケース | V1 | V2 | 
| --- | --- | --- | 
| クラスをテーブルにマップする |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>テーブル名は、DynamoDbEnhancedClient\$1table() メソッドを呼び出すときに定義されます。 | 
| クラスメンバーをテーブル属性として指定する  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| クラスメンバーをハッシュ/パーティションキーとして指定する |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| クラスメンバーを範囲/ソートキーとして指定する |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| クラスメンバーをセカンダリインデックスのハッシュ/パーティションキーとして指定する |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| クラスメンバーをセカンダリインデックスの範囲/ソートキーとして指定する |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| テーブルにマッピングするときにこのクラスメンバーを無視する |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| クラスメンバーを自動生成された UUID キー属性として指定する |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> これを提供する拡張機能はデフォルトではロードされません。拡張機能をクライアントビルダーに追加する必要があります。  | 
| クラスメンバーを自動生成されたタイムスタンプ属性として指定する |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> これを提供する拡張機能はデフォルトではロードされません。拡張機能をクライアントビルダーに追加する必要があります。  | 
| クラスメンバーを自動で増分されるバージョン属性として指定する |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> これを提供する拡張機能は自動的にロードされます。  | 
| クラスメンバーをカスタム変換を必要とするものとして指定する |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| クラスメンバーを別の属性タイプとして保存するように指定する |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  `AttributeConverter` 実装を使用します。V2 には、一般的な Java タイプ用の多くの組み込みコンバーターが用意されています。独自のカスタム `AttributeConverter` または `AttributeConverterProvider` を実装することもできます。本ガイドの「[属性変換を制御する](ddb-en-client-adv-features-conversion.md)」を参照してください。  | 
| DynamoDB ドキュメント (JSON 形式のドキュメント) またはサブドキュメントにシリアル化できるクラスを指定する  |  <pre>@DynamoDBDocument</pre>  | 拡張ドキュメント API を使用します。以下のリソースを参照してください。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### V2 の追加注釈
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| ユースケース | V1 | V2 | 
| --- | --- | --- | 
| Java 値が null の場合、クラスメンバーを NULL 属性として保存しないように指定する | 該当なし |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| すべての属性が null の場合、クラスメンバーを空のオブジェクトとなるように指定する | 該当なし |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| クラスメンバーの特別な更新アクションを指定する | 該当なし |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| 変更不可能なクラスを指定する | 該当なし |  <pre>@DynamoDbImmutable</pre>  | 
| クラスメンバーを自動で増分されるカウンター属性として指定する | 該当なし |  <pre>@DynamoDbAtomicCounter</pre> この機能を提供する拡張機能は自動的にロードされます。  | 

## 設定
<a name="dynamodb-mapping-configuration"></a>

V1 では、通常、`DynamoDBMapperConfig` のインスタンスを使用して特定の動作を制御します。設定オブジェクトは、マッパーの作成時またはリクエスト時に指定できます。V2 では、設定は オペレーションのリクエストオブジェクトに固有です。


| ユースケース | V1 | V1 のデフォルト | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| バッチロード/書き込みの再試行戦略 |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | 失敗した項目を再試行する | 基盤となる DynamoDBClient で再試行戦略を設定します。本ガイドの「[で再試行動作を設定する AWS SDK for Java 2.x](retry-strategy.md)」を参照してください。 | 
| 整合性のある読み込み |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | デフォルトでは、読み取りオペレーションの整合性のある読み取りは false です。リクエストオブジェクトで、.consistentRead(true) で上書きします。 | 
| マーシャラー/アンマーシャラーのセットによる変換スキーマ |  <pre>  .withConversionSchema(conversionSchema)</pre> 静的実装は、古いバージョンとの下位互換性を提供します。  | V2\$1COMPATIBLE | 該当なし。これは、初期の DynamoDB（V1）がデータ型を保存していた方法を指すレガシー機能であり、この動作は拡張クライアントでは保持されません。DynamoDB V1 の動作の一例は、ブール値ではなく数値としてブール値を格納することです。 | 
| テーブル名 |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> 静的実装は、古いバージョンとの下位互換性を提供します。  | 注釈を使用する、またはクラスから推測する |  テーブル名は、`DynamoDbEnhancedClient#table()` メソッドを呼び出すときに定義されます。  | 
| ページ分割ロード戦略 |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  オプション: LAZY\$1`LOADING`、`EAGER_LOADING`、または `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| リクエストメトリクスの収集 |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | 標準 DynamoDB クライアントを構築するときは、metricPublisher() で ClientOverrideConfiguration を使用します。 | 
| 保存動作 |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> オプションは `UPDATE`、`CLOBBER`、`PUT`、`APPEND_SET`、または `UPDATE_SKIP_NULL_ATTRIBUTES` です。  | UPDATE |  V2 では、`putItem()` または `updateItem()` を明示的に呼び出します。 `CLOBBER or PUT`: V2 の対応するアクションが `putItem()` を呼び出します。特定の `CLOBBER` 設定はありません。 `UPDATE`: に対応 `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: に対応します`updateItem()`。リクエスト設定 `ignoreNulls` と注釈/タグ `DynamoDbUpdateBehavior` を使用して更新動作を制御します。 `APPEND_SET`: サポートされていません  | 
| 型コンバータファクトリ |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | 標準型コンバータ |  次を使用して Bean に設定する <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### オペレーションごとの設定
<a name="dynamodb-mapping-configuration-per-op"></a>

V1 では、`query()` などの一部のオペレーションは、オペレーションに送信された「式」オブジェクトを使用して高度に設定できます。例えば、次のようになります。

```
DynamoDBQueryExpression<Customer> emailBwQueryExpr = new DynamoDBQueryExpression<Customer>()
    .withRangeKeyCondition("Email",
        new Condition()
            .withComparisonOperator(ComparisonOperator.BEGINS_WITH)
            .withAttributeValueList(
                new AttributeValue().withS("my")));

mapper.query(Customer.class, emailBwQueryExpr);
```

V2 では、設定オブジェクトを使用する代わりに、ビルダーを使用してリクエストオブジェクトにパラメータを設定します。例えば、次のようになります。

```
QueryEnhancedRequest emailBw = QueryEnhancedRequest.builder()
    .queryConditional(QueryConditional
        .sortBeginsWith(kb -> kb
            .sortValue("my"))).build();

customerTable.query(emailBw);
```

## 条件式
<a name="dynamodb-mapping-conditionals"></a>

V2 では、条件式とフィルタリング式は、条件と名前およびフィルターのマッピングをカプセル化する `Expression` オブジェクトを使用して表現されます。


| ユースケース | オペレーション | V1 | V2 | 
| --- | --- | --- | --- | 
| 予想される属性条件 | save()、delete()、Query()、Scan() |  <pre>new DynamoDBSaveExpression()<br />  .withExpected(Collections.singletonMap(<br />      "otherAttribute", new ExpectedAttributeValue(false)))<br />  .withConditionalOperator(ConditionalOperator.AND);</pre>  | 非推奨。代わりに ConditionExpression を使用してください。 | 
| 条件式 | delete() |  <pre>deleteExpression.setConditionExpression("zipcode = :zipcode")<br />deleteExpression.setExpressionAttributeValues(...)<br /></pre>  |  <pre>Expression conditionExpression =<br />    Expression.builder()<br />        .expression("#key = :value OR #key1 = :value1")<br />        .putExpressionName("#key", "attribute")<br />        .putExpressionName("#key1", "attribute3")<br />        .putExpressionValue(":value", AttributeValues.stringValue("wrong"))<br />        .putExpressionValue(":value1", AttributeValues.stringValue("three"))<br />        .build();<br /><br />DeleteItemEnhancedRequest request = DeleteItemEnhancedRequest.builder()<br />         .conditionExpression(conditionExpression).build();</pre>  | 
| フィルター式 | query()、scan() |  <pre>scanExpression<br />  .withFilterExpression("#statename = :state")<br />  .withExpressionAttributeValues(attributeValueMapBuilder.build())<br />  .withExpressionAttributeNames(attributeNameMapBuilder.build())<br /></pre>  |  <pre>Map<String, AttributeValue> values = singletonMap(":key", stringValue("value"));<br />Expression filterExpression =<br />    Expression.builder()<br />        .expression("name = :key")<br />        .expressionValues(values)<br />        .build();<br />QueryEnhancedRequest request = QueryEnhancedRequest.builder()<br />    .filterExpression(filterExpression).build();<br /></pre>  | 
| クエリの条件式 | query() |  <pre>queryExpression.withKeyConditionExpression()</pre>  |  <pre>QueryConditional keyEqual = QueryConditional.keyEqualTo(b -> b<br />                .partitionValue("movie01"));<br /><br />QueryEnhancedRequest tableQuery = QueryEnhancedRequest.builder()<br />                .queryConditional(keyEqual)<br />                .build();</pre>  | 

## 型変換
<a name="dynamodb-mapping-type-conv"></a>

### デフォルトコンバータ
<a name="dynamodb-mapping-type-conv-defaults"></a>

V2 では、SDK はすべての一般的なタイプに向けてデフォルトコンバータのセットを提供します。タイプコンバータは、全体的なプロバイダーレベルと、単一の属性に対しての両方で変更できます。使用可能なコンバータのリストは、[AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html) API リファレンスで確認できます。

### 属性のカスタムコンバータを設定する
<a name="dynamodb-mapping-type-conv-anno"></a>

V1 では、`@DynamoDBTypeConverted` を使用してゲッターメソッドに注釈を付けて、Java 属性型と DynamoDB 属性型を変換するクラスを指定できます。たとえば、Java `Currency` 型と DynamoDB 文字列を変換する `CurrencyFormatConverter` は、次のスニペットに示すように適用できます。

```
@DynamoDBTypeConverted(converter = CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
```

での前のスニペットに相当する V2 でのスニペットを以下に示します。

```
@DynamoDbConvertedBy(CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
```

**注記**  
V1 では、属性自体、タイプ、またはユーザー定義の注釈に注釈を適用できます。V2 では、ゲッターにのみ注釈を適用できます。

### タイプコンバータファクトリまたはプロバイダーを追加する
<a name="dynamodb-mapping-type-conv-factory"></a>

V1 では、独自のタイプコンバータのセットを提供するか、設定にタイプコンバータファクトリを追加することで、任意のタイプを上書きできます。タイプコンバータファクトリは `DynamoDBTypeConverterFactory` を拡張し、デフォルトセットへの参照を取得してそれを拡張することによって上書きが行われます。以下のスニペットは、その方法を示しています。

```
DynamoDBTypeConverterFactory typeConverterFactory =
    DynamoDBTypeConverterFactory.standard().override()
        .with(String.class, CustomBoolean.class, new DynamoDBTypeConverter<String, CustomBoolean>() {
            @Override
            public String convert(CustomBoolean bool) {
                return String.valueOf(bool.getValue());
            }
            @Override
            public CustomBoolean unconvert(String string) {
                return new CustomBoolean(Boolean.valueOf(string));
            }}).build();
DynamoDBMapperConfig config =
    DynamoDBMapperConfig.builder()
        .withTypeConverterFactory(typeConverterFactory)
        .build();
DynamoDBMapper mapperWithTypeConverterFactory = new DynamoDBMapper(dynamo, config);
```

V2 は、`@DynamoDbBean` 注釈を通じて同様の機能を提供します。単一の `AttributeConverterProvider` または順序付けられた `AttributeConverterProvider` のチェーンを提供することができます。独自の属性コンバータープロバイダーチェーンを指定すると、デフォルトのコンバータープロバイダーが上書きされ、その属性コンバータを使用するにはチェーンに含める必要があることに注意してください。

```
@DynamoDbBean(converterProviders = {
   ConverterProvider1.class, 
   ConverterProvider2.class,
   DefaultAttributeConverterProvider.class})
public class Customer {
  ...
}
```

本ガイドの[属性変換](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example)に関するセクションには、V2 の完全な例が含まれています。

# SDK for Java のバージョン 1 とバージョン 2 の文字列処理の違い
<a name="dynamodb-migration-string-handling"></a>

V1 と V2 では、DynamoDB にデータを送信するときの空の文字列の処理方法が異なります。
+ **V1**: DynamoDB に送信する前に空の文字列を null 値に変換します (属性なしになります)。
+ **V2**: 空の文字列を実際の空の文字列値として DynamoDB に送信します。

**重要**  
V2 に移行した後、空の文字列を DynamoDB に保存したくない場合は、カスタムコンバータを実装する必要があります。カスタムコンバータがない場合、V2 は空の文字列を実際の空の文字列属性として DynamoDB 項目に保存します。これは、これらの属性を完全に省略する V1 の動作とは異なります。

**Example 空の文字列属性を null に変換する V2 のカスタムコンバータ**  

```
/**
 * Custom converter that maintains V1 behavior by converting empty strings to null values
 * when writing to DynamoDB, ensuring compatibility with existing data. No attribute will be saved to DynamoDB.
 */
public class NullifyEmptyStringConverter implements AttributeConverter<String> {
    @Override
    public AttributeValue transformFrom(String value) {
        if (value == null || value.isEmpty()) {
            return AttributeValue.builder().nul(true).build();
        }
        return AttributeValue.builder().s(value).build();
    }

    @Override
    public String transformTo(AttributeValue attributeValue) {
        if (attributeValue.nul()) {
            return null;
        }
        return attributeValue.s();
    }

    @Override
    public EnhancedType<String> type() {
        return EnhancedType.of(String.class);
    }

    @Override
    public AttributeValueType attributeValueType() {
        return AttributeValueType.S;
    }
}

// V2 usage:
@DynamoDbBean
public class Customer {
    private String name;

    @DynamoDbConvertedBy(NullifyEmptyStringConverter.class)
    public String getName() {
        return name;
    }
}
```



# SDK for Java のバージョン 1 とバージョン 2 の楽観的ロックの違い
<a name="dynamodb-migrate-optimstic-locking"></a>

V1 と V2 の両方で、Bean クラス内の 1 つのプロパティにバージョン番号を保存するための属性アノテーションを付与することで、楽観的ロックが実装されています。


**楽観的ロック動作の違い**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Bean クラスの注釈 | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute (V2 は小文字の「b」を使用することに注意してください) | 
| 初期保存 | 1 に設定されたバージョン番号属性。 |  `@DynamoDbVersionAttribute(startAt = X)` で設定されたバージョン属性の開始値。デフォルト値は 0 です。  | 
| 更新 | 更新されるオブジェクトのバージョン番号がデータベース内の番号と一致することが条件チェックで検証されると、バージョン番号属性が 1 ずつ増加します。 |  更新されるオブジェクトのバージョン番号がデータベース内の番号と一致することが条件チェックで検証されると、バージョン番号属性が増加します。 `@DynamoDbVersionAttribute(incrementBy = X)` で設定された `incrementBy` オプションによって増加するバージョン番号属性。デフォルト値は 1 です。  | 
| Delete | DynamoDBMapper は、削除されるオブジェクトのバージョン番号がデータベースのバージョン番号と一致するという条件付きチェックを追加します。 |  V2 は、削除オペレーションの条件を自動的に追加しません。削除動作を制御する場合は、条件式を手動で追加する必要があります。 次の例では、`recordVersion` は Bean のバージョン属性です。 <pre>// 1. Read the item and get its current version.<br />Customer item = customerTable.getItem(Key.builder().partitionValue("someId").build());<br />AttributeValue currentVersion = item.getRecordVersion();<br /><br />// 2. Create conditional delete with the `currentVersion` value.<br />DeleteItemEnhancedRequest deleteItemRequest =<br />    DeleteItemEnhancedRequest.builder()<br />       .key(KEY)<br />       .conditionExpression(Expression.builder()<br />           .expression("recordVersion = :current_version_value")<br />           .putExpressionValue(":current_version_value", currentVersion)<br />           .build()).build();<br /><br />customerTable.deleteItem(deleteItemRequest);</pre>  | 
| 条件チェックによるトランザクション書き込み | addConditionCheck メソッドで @DynamoDBVersionAttribute によって注釈が付けられた Bean クラスを使用することはできません。 | transactWriteItems リクエストの addConditionCheck ビルダーメソッドでは @DynamoDbVersionAttribute 注釈が付いた Bean クラスを使用できます。 | 
| 無効化 | 楽観的ロックを無効にするには、 DynamoDBMapperConfig.SaveBehavior 列挙値を UPDATE から CLOBBER に変更します。 |  `@DynamoDbVersionAttribute` 注釈を使用しないでください。  | 

# SDK for Java のバージョン 1 とバージョン 2 の Fluent セッターの違い
<a name="dynamodb-migrate-fluent-setters"></a>

V1 の DynamoDB マッピング API では Fluent セッターを持つ POJO を使用でき、V2 でもバージョン 2.30.29 以降で使用できます。

たとえば、次の POJO は `setName` メソッドから `Customer` インスタンスを返します。

```
// V1

@DynamoDBTable(tableName ="Customer")
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){
     this.name = name;
     return this;
  }
}
```

ただし、2.30.29 より前のバージョンの V2 を使用する場合、`setName` は `null` の `name` 値を持つ `Customer` インスタンスを返します。

```
// V2 prior to version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Bug: returns this instance with a `name` value of `null`.
  }
}
```

```
// Available in V2 since version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Returns this instance for method chaining with the `name` value set.
  }
}
```

# のバージョン 1 とバージョン 2 の API の違いを文書化する AWS SDK for Java
<a name="dynamodb-mapping-document-api"></a>

ドキュメント API は、DynamoDB テーブルでの単一項目としての JSON 形式ドキュメントの使用をサポートしています。V1 の ドキュメント API に対応する API が V2 にありますが、V1 のようにドキュメント API に別のクライアントを使用するのではなく、V2 には DynamoDB 拡張クライアントにドキュメント API 機能が組み込まれています。

V1 では、 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Item.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Item.html) クラスは DynamoDB テーブルからの非構造化レコードを表します。V2 では、非構造化レコードは [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) クラスのインスタンスによって表されます。プライマリキーは V2 ではテーブルスキーマで定義され、V1 では項目自体で定義されます。

次の表は、V1 と V2 のドキュメント API の違いを比較したものです。


| ユースケース | V1 | V2 | 
| --- |--- |--- |
| Create a document client |  <pre>AmazonDynamoDB client = ... //Create a client.<br />DynamoDB documentClient = new DynamoDB(client);</pre>  |  <pre>// The V2 Document API uses the same DynamoDbEnhancedClient<br />// that is used for mapping POJOs.<br />DynamoDbClient standardClient = ... //Create a standard client.<br />DynamoDbEnhancedClient enhancedClient = ... // Create an enhanced client.<br /></pre>  | 
| Reference a table |  <pre>Table documentTable = docClient.documentClient("Person");</pre>  |  <pre>DynamoDbTable<EnhancedDocument> documentTable = enhancedClient.table("Person",  <br />        TableSchema.documentSchemaBuilder()<br />              .addIndexPartitionKey(TableMetadata.primaryIndexName(),"id", AttributeValueType.S)<br />              .attributeConverterProviders(AttributeConverterProvider.defaultProvider())<br />              .build());</pre>  | 
| **Work with semi-structured data** | 
| --- |
| Put item |  <pre>Item item = new Item()<br />      .withPrimaryKey("id", 50)<br />      .withString("firstName", "Shirley");<br />PutItemOutcome outcome = documentTable.putItem(item);</pre>  |  <pre>EnhancedDocument personDocument = EnhancedDocument.builder()<br />        .putNumber("id", 50)<br />        .putString("firstName", "Shirley")<br />        .build();<br />documentTable.putItem(personDocument);</pre>  | 
| Get item |  <pre>GetItemOutcome outcome = documentTable.getItemOutcome( "id", 50);<br />Item personDocFromDb = outcome.getItem();<br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  |  <pre>EnhancedDocument personDocFromDb = documentTable<br />        .getItem(Key.builder()<br />            .partitionValue(50)<br />            .build()); <br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  | 
| **Work with JSON items** | 
| --- |
| Convert a JSON structure to use it with the Document API |  <pre>// The 'jsonPerson' identifier is a JSON string. <br />Item item = new Item().fromJSON(jsonPerson);</pre>  |  <pre>// The 'jsonPerson' identifier is a JSON string.<br />EnhancedDocument document = EnhancedDocument.builder()<br />        .json(jsonPerson).build());</pre>  | 
| Put JSON |  <pre>documentTable.putItem(item)</pre>  |  <pre>documentTable.putItem(document);</pre>  | 
| Read JSON |  <pre>GetItemOutcome outcome = //Get item.<br />String jsonPerson = outcome.getItem().toJSON();</pre>  |  <pre>String jsonPerson = documentTable.getItem(Key.builder()<br />        .partitionValue(50).build())<br />        .fromJson();</pre>  | 

## ドキュメント API の API リファレンスとガイド
<a name="dynamodb-mapping-document-api-ref"></a>


|  | V1 | V2 | 
| --- | --- | --- | 
| API リファレンス | [API リファレンス](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/package-summary.html) | [API リファレンス](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/package-summary.html) | 
| ドキュメントガイド | [Amazon DynamoDB デベロッパーガイド](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html) | [拡張ドキュメント API](ddb-en-client-doc-api.md) (本ガイド) | 

# V1 の式仕様 API から V2 の式 API
<a name="ddb-v1-xspec-migrate"></a>

ドキュメント指向データを操作するための式の作成に役立つ、V1 で利用可能な式仕様 (Xspec) API は、V2 では使用できません。V2 は 式 API を使用します。この API は、ドキュメント指向データと、オブジェクトから項目にマッピングされたデータの両方で動作します。


****  

|  | V1 | V2 | 
| --- | --- | --- | 
| API 名 | 式仕様 (Xspec) API | 式 API | 
| 動作可能 | [updateItem](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#updateItem-java.lang.String-java.lang.Object-com.amazonaws.services.dynamodbv2.xspec.UpdateItemExpressionSpec-) や [scan](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#scan-com.amazonaws.services.dynamodbv2.xspec.ScanExpressionSpec-) などのドキュメント API [テーブル](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html)クラスのメソッド |  DynamoDB 拡張クライアントの両方の API [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) どちらのタイプの API でも、[https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/DynamoDbTable.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/DynamoDbTable.html) インスタンスを次から取得した場合 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) リクエストオブジェクトを作成するときに、`DynamoDbTable` メソッドで式を使用します。たとえば、[https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryEnhancedRequest.Builder.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryEnhancedRequest.Builder.html) の `filterExpression` メソッドで使用します。  | 
| リソース |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html)  | この Java デベロッパーガイドの[式の情報](ddb-en-client-expressions.md) | 

# 暗号化ライブラリの移行
<a name="ddb-encryption-lib-migrate"></a>

Java SDK の V2 で動作するように DynamoDB の暗号化ライブラリを移行する方法については、「[Amazon DynamoDB 暗号化クライアントデベロッパーガイド](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html)」を参照してください。

# バージョン 1 からバージョン 2 での Amazon SQS リクエストの自動バッチ処理の変更
<a name="migration-sqs-auto-batching"></a>

このトピックでは、 AWS SDK for Javaのバージョン 1 とバージョン 2 での Amazon SQS の自動リクエストバッチ処理の変更について詳しく説明します。

## 高レベル変更
<a name="migration-sqs-auto-batching-high-level-changes"></a>

 AWS SDK for Java 1.x は、リクエストバッチ処理に明示的な初期化を必要とする別の`[AmazonSQSBufferedAsyncClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/buffered/AmazonSQSBufferedAsyncClient.html)`クラスを使用してクライアント側のバッファリングを実行します。

は、 を使用してバッファリング機能 AWS SDK for Java 2.x を簡素化および強化します`[SqsAsyncBatchManager](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/batchmanager/SqsAsyncBatchManager.html)`。このインターフェイスの実装により、標準の `[SqsAsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/SqsAsyncClient.html)` と直接統合された自動リクエストバッチ処理機能が提供されます。v2 の `SqsAsyncBatchManager` の詳細については、このガイドの [で Amazon SQS の自動リクエストバッチ処理を使用する AWS SDK for Java 2.x](sqs-auto-batch.md) トピックを参照してください。


| 変更 | v1 |  v2 | 
| --- | --- | --- | 
|    Maven の依存関係  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.7821</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-sqs</artifactId><br />    </dependency><br /></dependencies><br /></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.31.152</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>sqs</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| パッケージ名 | com.amazonaws.services.sqs.buffered | software.amazon.awssdk.services.sqs.batchmanager | 
| クラス名 |  `[AmazonSQSBufferedAsyncClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/buffered/AmazonSQSBufferedAsyncClient.html)`  | [SqsAsyncBatchManager](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/batchmanager/SqsAsyncBatchManager.html) | 

1 [最新バージョン](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)。 2 [最新バージョン](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

## 自動 SQS リクエストバッチ処理の使用
<a name="migration-sqs-auto-batching-using"></a>


| 変更 | v1 |  v2 | 
| --- | --- | --- | 
| バッチマネージャーを作成する |  <pre>AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();<br />AmazonSQSAsync bufferedSqs = new <br />            AmazonSQSBufferedAsyncClient(sqsAsync);</pre>  |  <pre>SqsAsyncClient asyncClient = SqsAsyncClient.create();<br />SqsAsyncBatchManager sqsAsyncBatchManager = <br />            asyncClient.batchManager();</pre>  | 
| カスタム設定でバッチマネージャーを作成する |  <pre>AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();<br /><br />QueueBufferConfig queueBufferConfig = new QueueBufferConfig()<br />        .withMaxBatchOpenMs(200)<br />        .withMaxBatchSize(10)<br />        .withMinReceiveWaitTimeMs(1000)<br />        .withVisibilityTimeoutSeconds(20)<br />        .withReceiveMessageAttributeNames(messageAttributeValues);<br /><br />AmazonSQSAsync bufferedSqs = <br />        new AmazonSQSBufferedAsyncClient(sqsAsync, queueBufferConfig);</pre>  |  <pre>BatchOverrideConfiguration batchOverrideConfiguration = <br />    BatchOverrideConfiguration.builder()<br />        .sendRequestFrequency(Duration.ofMillis(200))<br />        .maxBatchSize(10)<br />        .receiveMessageMinWaitDuration(Duration.ofMillis(1000))<br />        .receiveMessageVisibilityTimeout(Duration.ofSeconds(20))<br />        .receiveMessageSystemAttributeNames(messageSystemAttributeNames)<br />        .receiveMessageAttributeNames(messageAttributeValues)<br />        .build();<br /><br />SqsAsyncBatchManager sqsAsyncBatchManager = SqsAsyncBatchManager.builder()<br />        .overrideConfiguration(batchOverrideConfiguration)<br />        .client(SqsAsyncClient.create())<br />        .scheduledExecutor(Executors.newScheduledThreadPool(8))<br />        .build();</pre>  | 
| メッセージを送信する |  <pre>Future<SendMessageResult> sendResultFuture = <br />        bufferedSqs.sendMessageAsync(new SendMessageRequest()<br />                .withQueueUrl(queueUrl)<br />                .withMessageBody(body));</pre>  |  <pre>CompletableFuture<SendMessageResponse> sendCompletableFuture = <br />        sqsAsyncBatchManager.sendMessage(<br />                SendMessageRequest.builder()<br />                        .queueUrl(queueUrl)<br />                        .messageBody(body)<br />                        .build());</pre>  | 
| メッセージの削除 |  <pre>Future<DeleteMessageResult> deletResultFuture =<br />        bufferedSqs.deleteMessageAsync(new DeleteMessageRequest()<br />                .withQueueUrl(queueUrl));</pre>  |  <pre>CompletableFuture<DeleteMessageResponse> deleteResultCompletableFuture<br />        = sqsAsyncBatchManager.deleteMessage(<br />                DeleteMessageRequest.builder()<br />                        .queueUrl(queueUrl)<br />                        .build());</pre>  | 
| メッセージの可視性を変更する |  <pre>Future<ChangeMessageVisibilityResult> changeVisibilityResultFuture =<br />        bufferedSqs.changeMessageVisibilityAsync<br />                (new ChangeMessageVisibilityRequest()<br />                        .withQueueUrl(queueUrl)<br />                        .withVisibilityTimeout(20));</pre>  |  <pre>CompletableFuture<ChangeMessageVisibilityResponse> changeResponseCompletableFuture<br />        = sqsAsyncBatchManager.changeMessageVisibility(<br />                ChangeMessageVisibilityRequest.builder()<br />                        .queueUrl(queueUrl)<br />                        .visibilityTimeout(20)<br />                        .build());</pre>  | 
| メッセージを受信する |  <pre>ReceiveMessageResult receiveResult =<br />        bufferedSqs.receiveMessage(<br />                new ReceiveMessageRequest()<br />                        .withQueueUrl(queueUrl));</pre>  |  <pre>CompletableFuture<ReceiveMessageResponse> <br />        responseCompletableFuture = sqsAsyncBatchManager.receiveMessage(<br />                ReceiveMessageRequest.builder()<br />                        .queueUrl(queueUrl)<br />                        .build());</pre>  | 

## 非同期戻り値の型の違い
<a name="migration-sqs-auto-batching-asyc-return-type"></a>


| 変更 | v1 |  v2 | 
| --- | --- | --- | 
| 戻り型 | Future<ResultType> | CompletableFuture<ResponseType> | 
| コールバックメカニズム | 個別の onSuccess メソッドと onError メソッドを持つ AsyncHandler が必要です | whenComplete()、thenCompose()、thenApply() など、JDK が提供する CompletableFuture API を使用します。 | 
| 例外処理 | AsyncHandler\$1onError() メソッドを使用する | exceptionally()、handle()、whenComplete() など、JDK が提供する CompletableFuture API を使用します。 | 
| Cancellation | Future.cancel() による基本的なサポート | 親の CompletableFuture をキャンセルすると、チェーン内のすべての依存する Future が自動的にキャンセルされます。 | 

## 非同期完了処理の違い
<a name="migration-sqs-auto-batching-asyc-completion-handling"></a>


| 変更 | v1 |  v2 | 
| --- | --- | --- | 
| レスポンスハンドラーの実装 |  <pre>Future<ReceiveMessageResult> future = bufferedSqs.receiveMessageAsync(<br />        receiveRequest,<br />        new AsyncHandler<ReceiveMessageRequest, ReceiveMessageResult>() {<br />            @Override<br />            public void onSuccess(ReceiveMessageRequest request, <br />                              ReceiveMessageResult result) {<br />                List<Message> messages = result.getMessages();<br />                System.out.println("Received " + messages.size() + " messages");<br />                for (Message message : messages) {<br />                    System.out.println("Message ID: " + message.getMessageId());<br />                    System.out.println("Body: " + message.getBody());<br />                }<br />            }<br /><br />            @Override<br />            public void onError(Exception e) {<br />                System.err.println("Error receiving messages: " + e.getMessage());<br />                e.printStackTrace();<br />            }<br />        }<br />);</pre>  |  <pre>CompletableFuture<ReceiveMessageResponse> completableFuture = sqsAsyncBatchManager<br />               .receiveMessage(ReceiveMessageRequest.builder()<br />               .queueUrl(queueUrl).build())<br />        .whenComplete((receiveMessageResponse, throwable) -> {<br />            if (throwable != null) {<br />                System.err.println("Error receiving messages: " + throwable.getMessage());<br />                throwable.printStackTrace();<br />            } else {<br />                List<Message> messages = receiveMessageResponse.messages();<br />                System.out.println("Received " + messages.size() + " messages");<br />                for (Message message : messages) {<br />                    System.out.println("Message ID: " + message.messageId());<br />                    System.out.println("Body: " + message.body());<br />                }<br />            }<br />        });</pre>  | 

## 主な設定パラメータ
<a name="migration-sqs-auto-batching-params"></a>


****  

| パラメータ | v1 |  v2 | 
| --- | --- | --- | 
| 最大バッチサイズ | maxBatchSize (デフォルトはバッチあたり 10 リクエスト) | maxBatchSize (デフォルトはバッチあたり 10 リクエスト) | 
| バッチ待機時間 | maxBatchOpenMs (デフォルトは 200 ミリ秒) | sendRequestFrequency (デフォルトは 200 ミリ秒) | 
| 可視性タイムアウト | visibilityTimeoutSeconds (キューのデフォルトは -1) | receiveMessageVisibilityTimeout (キューのデフォルト) | 
| 最小待機時間 | longPollWaitTimeoutSeconds (longPoll が true の場合は 20 秒) | receiveMessageMinWaitDuration (デフォルトは 50 ミリ秒) | 
| メッセージ属性 | ReceiveMessageRequest を使用して設定する | receiveMessageAttributeNames (デフォルトではなし) | 
| システム属性 | ReceiveMessageRequest を使用して設定する | receiveMessageSystemAttributeNames (デフォルトではなし) | 
| ロングポーリング | longPoll (デフォルトは true) | サーバーがメッセージを送信するまでオープン接続が待機しないように、サポートされていません | 
| ロングポーリングの最大待機時間 | longPollWaitTimeoutSeconds (デフォルトは 20 秒) | サーバーがメッセージを送信するまでオープン接続が待機しないように、サポートされていません | 
| クライアント側に保存する、プリフェッチされる受信バッチの最大数。 | maxDoneReceiveBatches (10 バッチ) | 内部で処理されるため、サポートされていません | 
| 同時に処理されるアクティブな送信バッチの最大数 | maxInflightOutboundBatches (デフォルトは 5 バッチ) | 内部で処理されるため、サポートされていません | 
| 同時に処理されるアクティブな受信バッチの最大数 | maxInflightReceiveBatches (デフォルトは 10 バッチ) | 内部で処理されるため、サポートされていません | 

# SDK for Java 1.x と 2.x を並行して使用する
<a name="migration-side-by-side"></a>

プロジェクトで AWS SDK for Java の両方のバージョンを使用できます。

バージョン 1.x から Amazon S3 を使用し、バージョン 2.27.21 から DynamoDB を使用するプロジェクト用の `pom.xml` ファイルの例を以下に示します。

**Example POM の例**  
この例では、SDK の 1.x と 2.x バージョンの両方を使用するプロジェクトの `pom.xml` ファイルエントリを示しています。  

```
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-bom</artifactId>
            <version>1.12.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
          <groupId>software.amazon.awssdk</groupId>
          <artifactId>bom</artifactId>
          <version>2.27.21</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-s3</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>dynamodb</artifactId>
    </dependency>
</dependencies>
```