Amazon Web Services ブログ
AWS App2Container を利用して Java および .NET アプリケーションをリモートでモダナイズする
この記事は、Modernize Java and .NET applications remotely using AWS App2Container を翻訳したものです。
本投稿は、Senior Technical Account Manager の Suresh Pathakamuri と Vijay K Sikha により寄稿されました。
AWS App2Container の公開以来、お客様からは Windows や Linux ホスト上で動作する Java や .NET アプリケーションの移行をリモートで管理できる機能を求める声が寄せられてきました。App2Container (A2C) のバージョン 1.2 からは、アプリケーションサーバーに A2C ソフトウェアをインストールすることなく、ワークロードのコンテナ化を実現できるようになりました。また、リモート実行機能により、オンプレミスのデータセンターで稼働するアプリケーションのコンテナ化が可能になります。ユーザーは、アプリケーションサーバーに対して中央管理された Windows または Linux ホスト上で App2Container を実行してコンテナ化し、Amazon Elastic Container Service (Amazon ECS) または Amazon Elastic Kubernetes Service (Amazon EKS) にデプロイできるようになりました。
このブログでは、Cloud9 環境にインストールされた App2Container を使って EC2 インスタンス上で動作する Java Spring Boot アプリケーションをコンテナ化し、コンテナ化されたアプリケーションを Amazon EKS クラスタにデプロイします。まず AWS Cloud9 環境に A2C をインストールし、Java Spring Boot アプリケーションを実行している EC2 インスタンスを設定します。EC2 インスタンスは、A2C のリモートサーバー (Cloud9 環境) からネットワーク接続された、オンプレミスのデータセンターで稼働するアプリケーションサーバーと想定できます。A2C は、アプリケーションサーバーを解析し、アプリケーションのモダナイゼーションに必要な成果物を生成します。その後、コンテナ化された Spring Boot アプリケーションのバージョンが、新しい Amazon EKS クラスタにデプロイされます。
App2Container をリモートで実行するための設定
開始するには、Amazon Linux 2 オペレーティングシステムで Cloud9 環境を作成します。AdministratorAccess ポリシーを持つ新しい IAM ロールを作成し、それを Cloud9 インスタンスにアタッチして、この環境の AWS マネージドな認証情報を無効にします。ここにリストされている最初のステップは、Cloud9 環境の作成と IAM ロールの設定に使用できます。このブログの残りの部分では、App2Container のリモートサーバーとして機能する Cloud9 環境で実行するコマンドがあります。Cloud9 を使用しない場合は、独自の EC2 またはオンプレミス Linux 環境を使用できます。
App2Container を使用する際の細かい権限のオプションについては、「Identity and access management in App2Container」を参照してください。
Cloud9 ホストにログインし、App2Container を Cloud9 環境にインストールして初期化します。Docker サービスをインストールし、アーティファクトを保存するための S3 バケットを作成します。今回のデモでは us-east-1 リージョンを使用していますが、AWS_DEFAULT_REGION の値をお好みのリージョンに変更してください。
以下を実行して、App2Container のインストールを検証します。なお、App2Container のコマンドは、root 権限を持つユーザーで実行する必要があります。
コンテナ化したいアプリケーションが格納されているサーバー上で App2Container ツールを使用するには、同サーバーに Docker Engine がインストールされている必要があります。以下のコマンドに従って Docker Engine をインストールし、サービスを開始・有効化してください。
注: Cloud9 を使用している場合は、以下の手順をスキップできます。Cloud9 環境では Docker Engine がデフォルトでインストールされています。
App2Container で生成したアーティファクトや AWS CloudFormation テンプレートを保存するためには、S3 バケットが必要です。以下のように S3 バケットを作成します。Amazon S3 バケット名はグローバルに一意である必要があります。もし「Bucket name already exists」または「BucketAlreadyExists」というエラーが出た場合は、別のバケット名を使ってバケットを作成する必要がありますので、次に示すようにバケット名に日付を追加して、一意の名前にします。
Cloud9 インスタンスにアタッチされている EBS ボリュームのサイズを 20 GB に変更します。これは、後のステップで生成されるアーティファクトのための十分なストレージを確保するためです。aws configure コマンドを実行してデフォルトのリージョン名を設定し、このステップではリージョンのみを指定し、他の入力は省略します。
App2Container CLI の初期化を一度だけ実行するために init コマンドを実行します。前のステップで作成した S3 バケット名が入力されていることを確認してください。これは、次のステップでのアプリケーションアーティファクトはそのバケットに保存されるためです。
Java Spring Boot アプリケーションを実行するアプリケーションサーバーの設定
次のセクションでは、AWS CLI を使用して EC2 インスタンス上で Java Spring Boot アプリケーションを設定および実行します。
以下のコマンドを実行して SSH キーを作成し、AWS アカウントの Secrets Manager にインポートしてください。このキーは、A2C ツールがリモートサーバーからアプリケーションサーバーへの認証に使用します。詳細は、A2C ドキュメントの「Manage secrets for AWS App2Container」を参照してください。
以下のコマンドは、Spring Boot アプリケーションをインストールするためのユーザーデータのシェルスクリプト、アプリケーションホストにアクセスするためのセキュリティグループ、およびユーザーデータのシェルスクリプトを使用してサンプルの Java アプリケーションを実行する EC2 インスタンスを作成します。この例のセキュリティグループでは、ポート 22 と 8080 が全世界に公開されていますが、アプリケーション環境では特定の IP に制限することをお勧めします。
Spring Boot アプリケーションを検証するには、AWS CLI または AWS マネジメントコンソールからアプリケーションサーバーの IP アドレスを取得します。以下のコマンドを実行して、ホストの IP アドレスを取得し、アプリケーションサーバーをテストします。curl コマンドを実行すると、「Hello」というレスポンスが返ってくるはずです。curl コマンドに応答するまで、インスタンスが実行状態になるのに数分かかる場合があります。
App2Container リモート機能を使用してアプリケーションをコンテナ化する
以下のコマンドを実行して、Cloud9 からのアプリケーションサーバー接続を設定します。アプリケーションサーバーの IP または FQDN と、SSH キーを保存するためのシークレットの ARN が必要になります。Secrets Manager から SSH キーの ARN を取得するコマンドを以下に示します。2 つ目のコマンドは、Java アプリケーションが実行されている EC2 インスタンスを取得します。
remote inventory
コマンドを実行すると、ホスト上で動作している Java アプリケーションを確認することができます。各アプリケーションは、一意のアプリケーション ID で識別されます。インベントリファイルに記載されているアプリケーション ID を書き留め、アプリケーション ID が使用される以降の手順にて置き換えます。
remote analyze
コマンドは、ホスト上で実行されているアプリケーションのレポートを生成します。analysis.json を確認し、アプリケーションの要件に応じて編集することができます。コンテナのパラメータや解析情報は必要に応じて更新することができます。このデモでは、analyze コマンドで作成されたデフォルトの設定を使用します。
remote extract
コマンドは、A2C のリモートサーバーである Cloud9 環境上の指定されたアプリケーションサーバーのアプリケーションアーカイブを生成します。このステップは完了するまでに数分かかります。
次に containerize
コマンドを使って、実行中のアプリケーションの Docker イメージを生成します。
docker images
コマンドで Docker イメージが正常に作成されたことを確認します。
App2Container は、Docker イメージの作成だけでなく Amazon ECS や Amazon EKS でアプリケーションをモダナイズするために必要なアーティファクトも作成します。このデモでは、Amazon EKS を使用します。Amazon EKS の設定のために、以下のように (エディタなどを使用して) ファイルを更新します。デプロイファイルで、EKS のための createEksArtifacts を True に、ECS のための createEcsArtifacts を False に変更してください。
App2Container リモート機能を使用してアプリケーションをデプロイする
次に、--deploy
フラグを付けた generate app-deployment コマンドを使用します。このコマンドは Docker イメージを格納する Amazon ECR リポジトリを作成し、CloudFormation テンプレートを S3 にアップロードして、テンプレートをデプロイします。CloudFormation スタックは、EC2 をワーカーノードとする EKS クラスターを作成し、EKS クラスターに pod/service をデプロイします。AWS マネジメントコンソールにログインして、このステップで使用した --deploy
の CloudFormation サービスのステータスを追跡することができます。deploy フラグをスキップして CloudFormation テンプレートを編集することで、このアプリケーションをアカウント内の既存の EKS クラスターにデプロイすることができます。コンテナのデプロイ設定に関するこのドキュメントには、デプロイ前に必要に応じて変更できるパラメータの詳細が記載されています。
最後に、EKS に Java アプリケーションをデプロイします。ロードバランサーエンドポイントはアプリケーションサービス用にデプロイされており、エンドポイント名は AWS マネジメントコンソールの EC2 ページで見つけるか、以下のように kubectl get services
コマンドを実行することで確認できます。
以下のように、curl ユーティリティーまたは Web ブラウザからテストすることができます。DNS 名とリージョンはセキュリティ上の理由でマスクされています。前のセクションの出力にある正しい値に置き換えてください。
App2Container のリモート実行機能を使用して、スタンドアロンホスト上で実行されている Java Spring Boot アプリケーションを Amazon EKS に正常に移植しました。同様の作業を Windows サーバー上で動作する .NET アプリケーションに対して行う場合、ログイン認証情報は Secrets Manager に保存し、残りのプロセスは同じままにします。ここでは、Linux ワーカーホストとして機能するワーカーマシンとして Cloud9 環境を使用しましたが、Windows Server 2016 または 2019 からでも同様の作業を行うことができます。
AWS App2Container は無料で提供されています。EC2、ECS、EKS、S3 などの AWS サービスの実際の使用量に対してのみお支払いいただきます。詳細については、App2Container の FAQs、App2Container のドキュメント、およびその他の AWS ブログを参照してください。App2Container ツールに関する技術的な質問や機能のリクエストがある場合は、app2container-support@amazon.com までメールでお問い合わせください。
翻訳はソリューションアーキテクト 杉本 晋吾 が担当しました。原文はこちらです。