移行 step-by-step 手順と例 - AWS SDK for Java 2.x

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

移行 step-by-step 手順と例

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

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

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

手順の概要

1. SDK for Java 2.x BOM を追加して開始する

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

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

最新バージョンは Maven Central Repository にあります。

2. v1 クラスインポートステートメントの検索ファイル

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

3. v1 インポートステートメントから v2 Maven の依存関係を確認する

すべての一意の v1 SERVICE_IDsが見つかったら、 を参照して v2 依存関係に対応する Maven アーティファクトを決定できますパッケージ名から Maven artifactId へのマッピング

4. POM ファイルに v2 依存関係要素を追加する

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

5. Java ファイルでは、v1 クラスから v2 クラスに段階的に変更します。

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

6. POM から v1 Maven の依存関係を削除し、ファイルから v1 のインポートを削除する

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

7. v2 API の機能強化を使用するようにコードをリファクタリングする

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

移行例

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

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 の追加

SDK for Java 2.x の Maven BOM を POM に追加し、dependencyManagementセクション内の他の依存関係も追加します。POM ファイルに SDK の v1 用の BOM がある場合は、今のところ残してください。これは後のステップで削除されます。

<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.24.3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

2. v1 クラスインポートステートメントの検索ファイル

アプリケーションのコードで の一意の出現を検索しますimport com.amazonaws.services。これにより、プロジェクトで使用される v1 の依存関係を特定できます。アプリケーションに v1 の依存関係がリストされた Maven POM ファイルがある場合は、代わりにこの情報を使用できます。

この例では、 ripgrep (rg) コマンドを使用してコードベースを検索します。

コードベースのルートから、次のripgrepコマンドを実行します。がインポートステートメントripgrepを検索すると、、cutsort、および uniq コマンドにパイプされ、SERVICE_IDs。

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

このアプリケーションでは、次の SERVICE_IDsがコンソールに記録されます。

autoscaling cloudformation ec2 identitymanagement

これは、 importステートメントで次の各パッケージ名が少なくとも 1 回使用されたことを示します。目的は、個々のクラス名は重要ではありません。使用する SERVICE_IDs。

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

3. v1 インポートステートメントから v2 Maven の依存関係を確認する

ステップ 2 から分離した v1 の SERVICE_IDs。例えばcloudformationautoscalingと は、ほとんどの場合、同じ v2 SERVICE_ID にマッピングできます。ほとんどの場合、v2 Maven artifactId は SERVICE_ID と一致するため、POM ファイルに依存関係ブロックを追加するために必要な情報があります。

次の表は、v2 の依存関係を確認する方法を示しています。

v1 SERVICE_ID は にマッピングされます。

パッケージ名

v2 SERVICE_ID は にマッピングされます。

パッケージ名

v2 Maven の依存関係

ec2

com.amazonaws.services.ec2.*

ec2

software.amazon.awssdk.services.ec2.*

<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ec2</artifactId> </dependency>

自動スケーリング

com.amazonaws.services.autoscaling.*

自動スケーリング

software.amazon.awssdk.services.autoscaling.*

<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>autoscaling</artifactId> </dependency>
cloudformation

com.amazonaws.services.cloudformation.*

cloudformation

software.amazon.awssdk.cloudformation.*

<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>cloudformation</artifactId> </dependency>
ID 管理*

com.amazonaws.services.identitymanagement.*

iam*

software.amazon.awssdk.iam.*

<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>iam</artifactId> </dependency>

* から identitymanagementへのiamマッピングは、SERVICE_ID がバージョン間で異なる例外です。Maven または Gradle が v2 の依存関係を解決できない場合の例外パッケージ名から Maven artifactId へのマッピングについては、「」を参照してください。

4. POM ファイルに v2 依存関係要素を追加する

ステップ 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 クラスに段階的に変更します。

移行するメソッドには、

  • からの EC2 サービスクライアントcom.amazonaws.services.ec2.AmazonEC2Client

  • いくつかの EC2 モデルクラスが使用されています。例えば、 DescribeInstancesRequestと ですDescribeInstancesResult

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

すべての v1 インポートを v2 インポートに置き換えることが目標です。一度に 1 つのクラスに進みます。

a。インポートステートメントまたはクラス名を置き換える

describeRunningInstances メソッドの最初のパラメータは v1 AmazonEC2Clientインスタンスであることがわかります。次のいずれかを行います。

  • のインポートを com.amazonaws.services.ec2.AmazonEC2Clientに置き換えsoftware.amazon.awssdk.services.ec2.Ec2ClientAmazonEC2Clientを に変更しますEc2Client

  • パラメータタイプを に変更Ec2Clientし、IDE に正しいインポートを求めるようにします。IDE では、クライアント名が異なるため、v2 クラスをインポートするように求められます。 AmazonEC2Clientと ですEc2Client。クラス名が両方のバージョンで同じ場合、このアプローチは機能しません。

b。v1 モデルクラスを同等の v2 に置き換える

v2 への変更後Ec2Client、IDE を使用すると、次のステートメントにコンパイルエラーが表示されます。

result = ec2.describeInstances(request);

コンパイルエラーは、v1 の のインスタンスを v2 Ec2ClientdescribeInstancesメソッドのパラメータDescribeInstancesRequestとして使用した結果です。修正するには、次の置換ステートメントまたはインポートステートメントを実行します。

replace with
import com.amazonaws.services.ec2.model.DescribeInstancesRequest
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest

c。v1 コンストラクタを v2 ビルダーに変更します。

v2 クラスにはコンストラクタがないため、コンパイルエラーが表示されます。修正するには、次の変更を行います。

変更 から
final DescribeInstancesRequest request = new DescribeInstancesRequest() .withInstanceIds(instanceIdsCopy);
final DescribeInstancesRequest request = DescribeInstancesRequest.builder() .instanceIds(instanceIdsCopy) .build();

d。v1 *Resultレスポンスオブジェクトを*Response同等の v2 に置き換える

v1 と v2 の一貫した違いは、v2 のすべてのレスポンスオブジェクトが *Responseではなく で終わる*Resultことです。v2 DescribeInstancesResultインポート への v1 インポートを置き換えますDescribeInstancesResponse

d。API の変更

次のステートメントにはいくつかの変更が必要です。

request.setNextToken(result.getNextToken());

v2 では、セッターメソッドは で setまたは を使用しませんprefix。プレフィックス が付いた Getter メソッドgetは SDK for Java 2.x にも記載されています。

request インスタンスなどのモデルクラスは v2 ではイミュータブルであるため、ビルダーDescribeInstancesRequestを使用して新しい を作成する必要があります。

v2 では、ステートメントは次のようになります。

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

d。v2 クラスでメソッドがコンパイルされるまで繰り返します。

コードの残りの部分に進みます。v1 imports を v2 imports に置き換え、コンパイルエラーを修正します。必要に応じて、 v2 API リファレンス「別のリファレンス」を参照してください。

この単一のメソッドを移行した後、次の 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 のインポートを削除する

ファイル内のすべての 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 の機能強化を使用するようにコードをリファクタリングする

移行中のスニペットについては、オプションで 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); } }));