AWSのマネジメントコンソール…
AWSでは、実際に手を動かして学ぶワークショップのコンテンツも多数公開されています。
本記事は、それらのうち「アプリケーション移行ワークショップ」を実施した記録です。
このワークショップを通じて、AWSクラウドに移行する方法のうち、以下のものを学ぶことができます。
前回はAWS Application Migration Service(AWS MGN)を用いて移行元(ソース)のウェブサーバを移行先(ターゲット)の EC2インスタンスへリホストしました。
今回は全5回のうちの第4回として、Amazon EC2上で動作するアプリケーション(WordPress)をAmazon Elastic Container Service(Amazon ECS)で稼働するコンテナへ移行し、まとめを述べます。
マニュアル:https://application-migration-with-aws.workshop.aws/en/container-migration.html
この章ではAmazon Elastic Container Service(ECS)を使用してウェブサーバをリプラットフォームします。
登場するものは次のとおりです。
| 要素名 | 設定する名前 | 説明 | 
|---|---|---|
| ECSクラスター | unicorn-cluster | 「タスク」または「サービス」の論理的なグループ | 
| ECSタスク定義 | unicorn-task-def | 「タスク」を構成するコンテナ群を定義。 コンテナが使用するイメージ、CPU・メモリの量、IAMロールやネットワークモードなど | 
| ECSサービス | unicorn-svc | 「タスク定義」に基づいて、指定した個数の「タスク」を起動し、個数を維持 | 
| ECSタスク | – | 「タスク定義」に基づいて起動されるコンテナ群 | 
それでは作成していきます。
アプリケーションロードバランサーで使用するセキュリティグループを作成します。
下の図の赤い部分です。
 
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。
| パラメータ | 値 | 備考 | 
|---|---|---|
| セキュリティグループ名 | LB-SG | |
| 説明 | Load balancer security group | |
| VPC | TargetVPC | 「環境の準備」で作成したもの | 
インバウンドルールにHTTPとHTTPSのルールを追加します。
| パラメータ | 値 | 
|---|---|
| タイプ | HTTP | 
| ソース | Anywhere-IPv4 | 
| パラメータ | 値 | 
|---|---|
| タイプ | HTTP | 
| ソース | Anywhere-IPv6 | 
| パラメータ | 値 | 
|---|---|
| タイプ | HTTPS | 
| ソース | Anywhere-IPv4 | 
| パラメータ | 値 | 
|---|---|
| タイプ | HTTPS | 
| ソース | Anywhere-IPv6 | 
Amazon Elastic Container ServiceのTaskで使用するセキュリティグループを作成します。
下の図の赤い部分です。
 
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。
| パラメータ | 値 | 備考 | 
|---|---|---|
| セキュリティグループ名 | ECS-Tasks-SG | |
| 説明 | Allow communication between the LB and the ECS Tasks | |
| VPC | TargetVPC | 「環境の準備」で作成したもの | 
インバウンドルールに以下のルールを追加します。
| パラメータ | 値 | 備考 | 
|---|---|---|
| タイプ | すべてのTCP | |
| ソース | LB-SG | 「ロードバランサー用セキュリティグループ作成」で作成したもの | 
Amazon Elastic File Systemで使用するセキュリティグループを作成します。
下の図の赤い部分です。
 
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。
| パラメータ | 値 | 備考 | 
|---|---|---|
| セキュリティグループ名 | EFS-SG | |
| 説明 | Allow communication between ECS Tasks and EFS | |
| VPC | TargetVPC | 「環境の準備」で作成したもの | 
インバウンドルールに以下のルールを追加します。
| パラメータ | 値 | 備考 | 
|---|---|---|
| タイプ | NFS | |
| ソース | ECS-Tasks-SG | 「Elastic Container Service Task用セキュリティグループ作成」で作成したもの | 
| パラメータ | 値 | 備考 | 
|---|---|---|
| タイプ | NFS | |
| ソース | WEB-SG | 「ターゲットウェブサーバ用セキュリティグループ作成」で作成したもの | 
Amazon Elastic Container ServiceのTaskがターゲットデータベースを参照できるようにセキュリティグループを変更します。
下の図の赤い部分です。
 
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。
| パラメータ | 値 | 備考 | 
|---|---|---|
| タイプ | MYSQL/Aurora | |
| ソース | ECS-Tasks-SG | 「Elastic Container Service Task用セキュリティグループ作成」で作成したもの | 
Amazon EFSファイルシステムを作成します。
このEFSファイルシステムは、ソースサーバからコンテンツをコピーし、リプラットフォーム後のコンテナ環境で永続ストレージとして用います。
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。
| パラメータ | 値 | 備考 | 
|---|---|---|
| 名前 | webserver-filesystem | |
| Virtual Private Cloud(VPC) | TargetVPC | 「環境の準備」で作成したもの | 
| 可用性と耐久性 | リージョン | 
作成後、webserver-filesystemの詳細画面で「ネットワーク」タブに移動し、「マウントターゲットを作成」から以下の設定値でマウントターゲットを作成します。
| パラメータ | 値 | 備考 | 
|---|---|---|
| アベイラビリティゾーン | us-west-2a | |
| サブネットID | TargetVPC-private-a-web | 「環境の準備」で作成したもの | 
| セキュリティグループ | EFS-SG | 「Elastic File System用セキュリティグループ作成」で作成したもの | 
| パラメータ | 値 | 備考 | 
|---|---|---|
| アベイラビリティゾーン | us-west-2b | |
| サブネットID | TargetVPC-private-b-web | 「環境の準備」で作成したもの | 
| セキュリティグループ | EFS-SG | 「Elastic File System用セキュリティグループ作成」で作成したもの | 
Webserverからコンテンツをコピーするため、EFSファイルシステムをマウントします。
SSH接続に用いるユーザやpemファイルは移行元(ソース)のウェブサーバと同じもの、つまり「AWS CloudFormationの出力確認」で確認した「WebServerUsername」「SSHKeyURL」の値を用います。
AWSマネジメントコンソールの「EC2 > インスタンス」へ移動し、Webserverの「パブリックIPv4 DNS」の値を確認します。
クライアントPCでSSHKeyをダウンロードし、Webserverに接続するコマンドは以下のようなイメージです。
接続コマンドのイメージ
> Invoke-WebRequest -OutFile migration_workshop.pem {{SSHKeyURLの値}}
 
> ssh -i migration_workshop.pem -l {{WebServerUsernameの値}} {{Webserver「パブリックIPv4 DNS」の値}}
ウェブサーバで、手順の通りNFSクライアントのインストールし、マウントポイントとなるディレクトリを作成します。
$ sudo apt-get update $ sudo apt-get install nfs-common $ sudo mkdir efs
WebブラウザでAWSマネジメントコンソールにアクセスします。
ウェブサーバで、手順の通りEFSをマウントします。
$ sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport {{webserver-filesystemの「ファイルシステムID」}}.efs.us-west-2.amazonaws.com:/ efs
ウェブサーバで、手順の通りコンテンツをEFSへコピーします。
$ sudo cp -r /var/www/html/wp-content/* efs/
Amazon Elastic Container ServiceのTaskへデータベースの接続情報を渡すため、AWS Systems Managerパラメータストアを設定します。
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。パラメータを4つ作成します。
| パラメータ | 値 | 
|---|---|
| 名前 | DB_HOST | 
| 利用枠 | 標準 | 
| タイプ | 文字列 | 
| データ型 | text | 
| 値 | (database-1のエンドポイント) | 
| パラメータ | 値 | 
|---|---|
| 名前 | DB_NAME | 
| 利用枠 | 標準 | 
| タイプ | 文字列 | 
| データ型 | text | 
| 値 | wordpress-db | 
| パラメータ | 値 | 
|---|---|
| 名前 | DB_USERNAME | 
| 利用枠 | 標準 | 
| タイプ | 文字列 | 
| データ型 | text | 
| 値 | admin | 
| パラメータ | 値 | 備考 | 
|---|---|---|
| 名前 | DB_PASSWORD | |
| 利用枠 | 標準 | |
| タイプ | 安全な文字列 | |
| 値 | ******** | 「ターゲットデータベース作成」で設定したマスターパスワード | 
コンテナがインターネット側で使用するアプリケーションロードバランサーを作成します。
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。
| パラメータ | 値 | 備考 | 
|---|---|---|
| ロードバランサータイプ | Application Load Balancer | 「作成」ボタンをクリック | 
| ロードバランサー名 | unicorn-lb | |
| スキーム | インターネット向け | |
| VPC | TargetVPC | 「環境の準備」で作成したもの | 
| マッピング | us-west-2a | サブネットは「TargetVPC-public-a」を選択 | 
| us-west-2b | サブネットは「TargetVPC-public-b」を選択 | |
| セキュリティグループ | LB-SG | 「ロードバランサー用セキュリティグループ作成」で作成したもの | 
更に、「リスナーとルーティング」セクションで「ターゲットグループの作成」を行います。
| パラメータ | 値 | 
|---|---|
| ターゲットタイプの選択 | IPアドレス | 
| ターゲットグループ名 | unicorn-tg | 
Amazon Elastic Container Service(ECS)のクラスターを作成します。
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。
| パラメータ | 値 | 
|---|---|
| クラスターテンプレートの選択 | ネットワーキングのみ | 
| クラスター名 | unicorn-cluster | 
| CloudWatch Container Insights | Container Insightsを有効にする | 
Amazon Elastic Container Service(ECS)のタスク定義を作成します。
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。
| パラメータ | 値 | 備考 | 
|---|---|---|
| 起動タイプの互換性の選択 | Fargate | |
| タスク定義名 | unicorn-task-def | |
| タスクロール | ecsTaskExecutionRole | 「環境の準備」で作成したもの | 
| タスク実行ロール | ||
| タスクメモリ(GB) | 1GB | |
| タスクCPU(vCPU) | 0.5vCPU | 
「ボリュームの追加」ボタンをクリックし、ボリュームを追加します。
| パラメータ | 値 | 備考 | 
|---|---|---|
| 名前 | wp-content | |
| ボリュームタイプ | EFS | |
| ファイルシステムID | webserver-filesystem | |
| 転送時の暗号化 | 転送暗号化を有効化 | チェックを入れる | 
「コンテナの追加」ボタンをクリックし、コンテナを追加します。
| パラメータ | 値 | 備考 | 
|---|---|---|
| コンテナ名 | unicorn-web-container | |
| イメージ | wordpress:latest | WordPressのDocker Official Imageです | 
| メモリ制限 | ソフト制限 | |
| 400 | ||
| ポートマッピング | 80 | |
| ソースボリューム | wp-content | 先ほど「ボリュームの追加」をしたもの | 
| コンテナパス | /var/www/html/wp-content | 
「コンテナの追加」の中で環境変数を4つ定義します。
| パラメータ | 値 | 備考 | 
|---|---|---|
| Key | WORDPRESS_DB_HOST | |
| (種類) | ValueFrom | |
| (Value) | DB_HOST | 「パラメータストアの設定」で設定したもの | 
| パラメータ | 値 | 備考 | 
|---|---|---|
| Key | WORDPRESS_DB_NAME | |
| (種類) | ValueFrom | |
| (Value) | DB_NAME | 「パラメータストアの設定」で設定したもの | 
| パラメータ | 値 | 備考 | 
|---|---|---|
| Key | WORDPRESS_DB_PASSWORD | |
| (種類) | ValueFrom | |
| (Value) | DB_PASSWORD | 「パラメータストアの設定」で設定したもの | 
| パラメータ | 値 | 備考 | 
|---|---|---|
| Key | WORDPRESS_DB_USER | |
| (種類) | ValueFrom | |
| (Value) | DB_USERNAME | 「パラメータストアの設定」で設定したもの | 
ECSクラスターにサービスを作成します。
WebブラウザでAWSマネジメントコンソールにアクセスします。
設定値は以下のとおりです。
| パラメータ | 値 | 備考 | 
|---|---|---|
| 起動タイプ | FARGATE | |
| タスク定義 | unicorn-task-def | 「Amazon Elastic Container Service(ECS)タスク定義を作成」で作成したもの | 
| プラットフォームのバージョン | 1.4.0 | |
| クラスター | unicorn-cluster | 「Amazon Elastic Container Service(ECS)クラスターを作成」で作成したもの | 
| サービス名 | unicorn-svc | |
| タスクの数 | 2 | |
| クラスターVPC | TargetVPC | 「環境の準備」で作成したもの | 
| サブネット | TargetVPC-private-a-web TargetVPC-private-b-web | |
| セキュリティグループ | ECS-Tasks-SG | 「Elastic Container Service Task用セキュリティグループ作成」で作成したもの。 「既存のセキュリティグループの選択」から選択 | 
| パブリックIPの自動割り当て | DISABLED | |
| ロードバランサーの種類 | Application Load Balancer | |
| ロードバランサー名 | unicorn-lb | 「ロードバランサーの作成」で作成したもの | 
| コンテナ名:ポート | unicorn-web-container:80:80 | 「Amazon Elastic Container Service(ECS)タスク定義を作成」で作成したもの。 選択し、「ロードバランサーに追加」ボタンをクリックする | 
| ターゲットグループ名 | unicorn-tg | 「ロードバランサーの作成」で作成したもの | 
| サービスの検出の統合の有効化 | (チェックを外す) | |
| Service Auto Scaling | Service Auto Scalingの設定を変更することで、サービスの必要数を調整する | |
| タスクの最小数 | 2 | |
| タスクの必要数 | 2 | |
| タスクの最大数 | 20 | |
| Service Auto Scaling用のIAMロール | ecsAutoscaleRole | 「環境の準備」で作成したもの | 
| ポリシー名 | Requests-policy | |
| ECSサービスメトリクス | ALBRequestCountPerTarget | |
| ターゲット値 | 300 | 
「ロードバランサーの作成」で作成した「unicorn-lb」の 「DNS名」 を確認します。
WebブラウザでAWSマネジメントコンソールにアクセスします。
確認した「DNS名」 にWebブラウザでアクセスすると、ロードバランサー配下のコンテナでECサイトが動作していることを確認することができます。
 
  AWSでは、実際に手を動かして学ぶワークショップのコンテンツが多数公開されています。
今回は、それらワークショップのコンテンツのうち、「アプリケーション移行ワークショップ」を実施しました。
手順を通じて、AWSへの移行を助けるサービスであるAWS MGN、AWS DMSや、コンテナオーケストレーションサービスであるAmazon ECSの基本的な使い方を学ぶことができました。
今回は触れませんでしたが、ワークショップには「Optimization」という章があり、ターゲット環境をAWS Well-Architectedの考え方に沿って最適化していくためのヒントが書かれています。
一通りの環境を作ってあとに読んでみると、AWS Well-Architectedの理解が深まると思います。
実際のシステム移行では、AWSの移行用サービスの操作や移行後の最適化もそうですが、AWSアカウントやランディングゾーン、移行元とAWS環境との閉域接続など、準備すべきものが数多くあります。
AWSへの移行をご検討の際には、ぜひお声かけください。
以上、「アプリケーション移行ワークショップやってみた」でした。
ここまでお読みいただきありがとうございます。
次回は、最後に片付けとしてワークショップで作成した環境の削除を行います。