アプリケーション移行ワークショップやってみた(4) – コンテナ化とまとめ

AWSでは、実際に手を動かして学ぶワークショップのコンテンツも多数公開されています。
本記事は、それらのうち「アプリケーション移行ワークショップ」を実施した記録です。

このワークショップを通じて、AWSクラウドに移行する方法のうち、以下のものを学ぶことができます。

  • AWS Database Migration Service(AWS DMS)を使ったデータベースのリプラットフォーム
  • AWS Application Migration Service(AWS MGN)を使ったウェブサーバのリホスト
  • Amazon Elastic Container Service(Amazon ECS)で稼働するコンテナへの移行による、ウェブサーバのモダナイゼーション

前回はAWS Application Migration Service(AWS MGN)を用いて移行元(ソース)のウェブサーバを移行先(ターゲット)の EC2インスタンスへリホストしました。
今回は全5回のうちの第4回として、Amazon EC2上で動作するアプリケーション(WordPress)をAmazon Elastic Container Service(Amazon ECS)で稼働するコンテナへ移行し、まとめを述べます。

目次
  1. Amazon Elastic Container Service(ECS)を使用したウェブサーバのリプラットフォーム
    1. ロードバランサー用セキュリティグループ作成
    2. Elastic Container Service Task用セキュリティグループ作成
    3. Elastic File System用セキュリティグループ作成
    4. ターゲットデータベース用セキュリティグループにインバウンドルール追加
    5. Amazon EFSファイルシステムの作成
    6. ウェブサーバへのファイルシステムのマウント
    7. パラメータストアの設定
    8. ロードバランサーの作成
    9. ECSクラスターを作成
    10. ECSタスク定義を作成
    11. ECSサービスを作成
    12. Webブラウザでのアクセス確認
  2. まとめ
  3. おわりに

Amazon Elastic Container Service(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マネジメントコンソールにアクセスします。

  • 「EC2 > セキュリティグループ」へ移動します
  • 「セキュリティグループを作成」ボタンをクリックします
  • 設定値のとおりセキュリティグループを作成します

設定値は以下のとおりです。

パラメータ 備考
セキュリティグループ名 LB-SG
説明 Load balancer security group
VPC TargetVPC 「環境の準備」で作成したもの

インバウンドルールにHTTPとHTTPSのルールを追加します。

パラメータ
タイプ HTTP
ソース Anywhere-IPv4
パラメータ
タイプ HTTP
ソース Anywhere-IPv6
パラメータ
タイプ HTTPS
ソース Anywhere-IPv4
パラメータ
タイプ HTTPS
ソース Anywhere-IPv6

Elastic Container Service Task用セキュリティグループ作成

Amazon Elastic Container ServiceのTaskで使用するセキュリティグループを作成します。
下の図の赤い部分です。

操作内容

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「EC2 > セキュリティグループ」へ移動します
  • 「セキュリティグループを作成」ボタンをクリックします
  • 設定値のとおりセキュリティグループを作成します

設定値は以下のとおりです。

パラメータ 備考
セキュリティグループ名 ECS-Tasks-SG
説明 Allow communication between the LB and the ECS Tasks
VPC TargetVPC 「環境の準備」で作成したもの

インバウンドルールに以下のルールを追加します。

パラメータ 備考
タイプ すべてのTCP
ソース LB-SG 「ロードバランサー用セキュリティグループ作成」で作成したもの

Elastic File System用セキュリティグループ作成

Amazon Elastic File Systemで使用するセキュリティグループを作成します。
下の図の赤い部分です。

操作内容

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「EC2 > セキュリティグループ」へ移動します
  • 「セキュリティグループを作成」ボタンをクリックします
  • 設定値のとおりセキュリティグループを作成します

設定値は以下のとおりです。

パラメータ 備考
セキュリティグループ名 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マネジメントコンソールにアクセスします。

  • 「EC2 > セキュリティグループ」へ移動します
  • 「ターゲットデータベース用セキュリティグループ作成」で作成したDB-SGを選択します
  • 「アクション」メニューから「インバウンドのルールを編集」をクリックします
  • 設定値のとおりインバウンドルールを追加します

設定値は以下のとおりです。

パラメータ 備考
タイプ MYSQL/Aurora
ソース ECS-Tasks-SG 「Elastic Container Service Task用セキュリティグループ作成」で作成したもの

Amazon EFSファイルシステムの作成

Amazon EFSファイルシステムを作成します。
このEFSファイルシステムは、ソースサーバからコンテンツをコピーし、リプラットフォーム後のコンテナ環境で永続ストレージとして用います。

操作内容

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「EFS > ファイルシステム」へ移動します
  • 「ファイルシステムを作成」ボタンをクリックします
  • 設定値のとおりファイルシステムを作成します

設定値は以下のとおりです。

パラメータ 備考
名前 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ファイルシステムをマウントします。

Webserverへ接続

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マウント準備

ウェブサーバで、手順の通りNFSクライアントのインストールし、マウントポイントとなるディレクトリを作成します。

$ sudo apt-get update
$ sudo apt-get install nfs-common
$ sudo mkdir efs

NFSマウント

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「EFS > ファイルシステム」へ移動します
  • webserver-filesystemのファイルシステムIDを確認します

ウェブサーバで、手順の通り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コピー

ウェブサーバで、手順の通りコンテンツをEFSへコピーします。

$ sudo cp -r /var/www/html/wp-content/* efs/

パラメータストアの設定

Amazon Elastic Container ServiceのTaskへデータベースの接続情報を渡すため、AWS Systems Managerパラメータストアを設定します。

操作内容

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「Systems Manager > パラメータストア」へ移動します
  • 「パラメータの作成」ボタンをクリックします
  • 設定値のとおりパラメータを作成します

設定値は以下のとおりです。パラメータを4つ作成します。

パラメータ
名前 DB_HOST
利用枠 標準
タイプ 文字列
データ型 text
(database-1のエンドポイント)
パラメータ
名前 DB_NAME
利用枠 標準
タイプ 文字列
データ型 text
wordpress-db
パラメータ
名前 DB_USERNAME
利用枠 標準
タイプ 文字列
データ型 text
admin
パラメータ 備考
名前 DB_PASSWORD
利用枠 標準
タイプ 安全な文字列
******** 「ターゲットデータベース作成」で設定したマスターパスワード

ロードバランサーの作成

コンテナがインターネット側で使用するアプリケーションロードバランサーを作成します。

操作内容

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「EC2 > ロードバランサー」へ移動します
  • 「ロードバランサーの作成」ボタンをクリックします
  • 設定値のとおりロードバランサーを作成します

設定値は以下のとおりです。

パラメータ 備考
ロードバランサータイプ Application Load Balancer 「作成」ボタンをクリック
ロードバランサー名 unicorn-lb
スキーム インターネット向け
VPC TargetVPC 「環境の準備」で作成したもの
マッピング us-west-2a サブネットは「TargetVPC-public-a」を選択
us-west-2b サブネットは「TargetVPC-public-b」を選択
セキュリティグループ LB-SG 「ロードバランサー用セキュリティグループ作成」で作成したもの

更に、「リスナーとルーティング」セクションで「ターゲットグループの作成」を行います。

パラメータ
ターゲットタイプの選択 IPアドレス
ターゲットグループ名 unicorn-tg

ECSクラスターを作成

Amazon Elastic Container Service(ECS)のクラスターを作成します。

操作内容

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「Elastic Container Service > クラスター」へ移動します
  • 「クラスターの作成」ボタンをクリックします
  • 設定値のとおりECSクラスターを作成します

設定値は以下のとおりです。

パラメータ
クラスターテンプレートの選択 ネットワーキングのみ
クラスター名 unicorn-cluster
CloudWatch Container Insights Container Insightsを有効にする

ECSタスク定義を作成

Amazon Elastic Container Service(ECS)のタスク定義を作成します。

操作内容

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「Elastic Container Service > タスク定義」へ移動します
  • 「新しいタスク定義の作成」ボタンをクリックします
  • 設定値のとおりECSタスク定義を作成します

設定値は以下のとおりです。

パラメータ 備考
起動タイプの互換性の選択 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サービスを作成

ECSクラスターにサービスを作成します。

操作内容

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「Elastic Container Service > クラスター」へ移動します
  • 「unicorn-cluster」をクリックします
  • 「サービス」タブの「作成」ボタンをクリックします
  • 設定値のとおりECSサービスを作成します

設定値は以下のとおりです。

パラメータ 備考
起動タイプ 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

Webブラウザでのアクセス確認

「ロードバランサーの作成」で作成した「unicorn-lb」の 「DNS名」 を確認します。

WebブラウザでAWSマネジメントコンソールにアクセスします。

  • 「EC2 > ロードバランサー」へ移動します
  • 「unicorn-lb」を選択します
  • 「説明」タブの「DNS名」の名前を確認します

確認した「DNS名」 にWebブラウザでアクセスすると、ロードバランサー配下のコンテナでECサイトが動作していることを確認することができます。

まとめ

  • ウェブサーバを、Amazon Elastic Container Service(Amazon ECS)で稼働するコンテナを用いた構成にリプラットフォームしました
  • 移行先(ターゲット)環境は以下のようになっています
  • 次回は、作成した環境を削除するのみの補足的な内容です
  • ワークショップの内容としては以上となるため、ここでまとめに入ります

おわりに

AWSでは、実際に手を動かして学ぶワークショップのコンテンツが多数公開されています。
今回は、それらワークショップのコンテンツのうち、「アプリケーション移行ワークショップ」を実施しました。

手順を通じて、AWSへの移行を助けるサービスであるAWS MGN、AWS DMSや、コンテナオーケストレーションサービスであるAmazon ECSの基本的な使い方を学ぶことができました。

今回は触れませんでしたが、ワークショップには「Optimization」という章があり、ターゲット環境をAWS Well-Architectedの考え方に沿って最適化していくためのヒントが書かれています。
一通りの環境を作ってあとに読んでみると、AWS Well-Architectedの理解が深まると思います。

実際のシステム移行では、AWSの移行用サービスの操作や移行後の最適化もそうですが、AWSアカウントやランディングゾーン、移行元とAWS環境との閉域接続など、準備すべきものが数多くあります。
AWSへの移行をご検討の際には、ぜひお声かけください。

以上、「アプリケーション移行ワークショップやってみた」でした。
ここまでお読みいただきありがとうございます。

次回は、最後に片付けとしてワークショップで作成した環境の削除を行います。