はじめに
前回、前々回とAmazon ECSについて紹介してきました。今回はその応用として、以下の内容について書きたいと思います。
- ALBからECSタスクにリクエストを流す
- ALBに独自ドメインを紐付ける
- ECSタスクで機密データを扱う
- オートスケーリング
- GitHub Actionsでデプロイする
ECSの概要については、Amazon ECSでGoのEchoサーバを立ち上げるをご覧ください。こちらで構築した環境を元に作業を進めていきます。
また、タスク定義については、Amazon ECSのタスク定義についてをご覧ください。
独自ドメインを取得する
後々、ALBの作成にあたり証明書が必要になってくるので、予めドメインを取得し、証明書を取得しておきます。
ドメインを取得する
ドメインはRoute53で取得します。
サイドメニューの「ドメイン」の「登録済みドメイン」をクリックします。
「ドメインの登録」をクリックし、任意の名前と拡張子を選択し、「続行」をクリックします。
住所等を入力し、ドメインの自動更新を無効にして登録します。
メールが送られてくるので、リンクをクリックして暫く待つとドメインの取得が完了します。
証明書を取得する
ドメインが取得できたら証明書を発行します。
証明書はCertification Managerから取得することができます。
「リクエスト」をクリックし、パブリック証明書を選択して「次へ」をクリックします。
取得したドメイン名を入力し、リクエストをクリックします。
証明書一覧に戻り、作成した証明書IDをクリックします。
「Route53でレコードを作成」をクリックし、「レコードを作成」をクリックします。
暫くすると証明書が発行されます。
ALBからECSタスクにリクエストを流す
ALBからECSにリクエストを流すには、以下の手順が必要になります。
- ターゲットグループを作成する
- ALBを作成する
- ALBを紐付けたECSサービスを作成する
順番に見ていきます。
ターゲットグループを作成する
ALB関連の設定はコンソールのEC2の画面から行います。
サイドメニューにある「ロードバランシング」の「ターゲットグループ」をクリックします。
「Create target group」をクリックし、以下のように設定してターゲットグループを作成します。
- ターゲットタイプで「IP address」を選択する
- 任意のグループネームを入力する
- VPCを選択する
作成に成功すると以下のようになっていると思います。
ALBを作成する
サイドメニューにある「ロードバランシング」の「ロードバランサー」をクリックします。
「Create load balancer」をクリックし、「Application Load Balancer」の「Create」をクリックします。
以下のように設定してALBを作成します。
- Load balancer nameに任意の名前を入力する
- VPCを選択する
- Subnetにチェックを入れる
- Security groupsを選択する
- 事前にインバウンドルールにHTTPSを追加しておく
- Listeners and routingを設定する
- HTTPのDefault actionに先程作ったターゲットグループを選択する
- HTTPSを追加し、HTTPと同様の設定にする
- Secure listener settingsで先程作った証明書を選択する
Listeners and routingの設定では以下のようになっているはずです。
ALBを紐付けたECSサービスを作成する
ALBに紐付けたECSサービスを作成します。
クラスターのサービスタブから「作成」をクリックし、以前の設定と同様に入力していきます。
「ロードバランシング」の項目で、「Application Load Balancer」を選択します。
「ロードバランサー用のコンテナのロードバランサーに追加」をクリックし、ターゲットグループ名で作成したターゲットグループを選択します。
AutoScalingは設定せずに、サービスを作成します。
タスクが立ち上がると、ALBのDNS名でアクセスできるようになっているはずです。
ALBに独自ドメインを紐付ける
ALBへのドメインの紐付けはRoute53で行います。
Route53のホストゾーンから、作成したホストゾーン名をクリックします。
レコードを作成をクリックします。
エイリアスをONにし、以下のように選択します。
- Application Load BalancerとClassic Load Balancerへのエイリアス
- ap-northeast-1
- 作成したALBのDNS名
レコードを作成をクリックします。これで、ドメイン名でアクセスできるようになっているはずです。
ECSタスクで機密データを扱う
ECSタスクで機密データを扱うには以下の手順が必要になります。
- System Managerのパラメータストアに機密データを登録する
- タスク実行ロールにパラメータストアへのアクセス権限を付与する
- タスク定義でコンテナの環境変数に機密データを埋め込む
順番に見ていきます。
機密データの登録
機密データの登録はSystem Managerで行います。
サイドメニューの「アプリケーション管理」の「パラメータストア」をクリックします。
パラメータの作成をクリックし、以下のように設定してパラメータを作成します。
- 名前と値を入力する
- タイプで「安全な文字列」を選択する
IAMロールの修正
ECSのタスクからパラメータストアにアクセスするには、タスク実行ロールに権限を追加する必要があります。
以前作成した「ecsTaskExecutionRole」に「ssm:GetParameters」の権限を付与します。
タスク定義の修正
ECSのタスク定義を修正します。
コンテナ定義のコンテナ名をクリックます。
環境変数の項目を以下のように設定します。
- Keyに環境変数名を入力する
- ValueFromを選択する
- 値にパラメータストアのパラメータ名を入力する(ARNでなくて良い)
オートスケーリング
オートスケーリングの設定は、ECSのサービスの設定から行う事ができます。
Service AutoScalingの項目で、サービスの必要数を調整するを選択します。
タスクの最小数、必要数、最大数、AutoScaling用のIAMロールを選択します。
スケーリングポリシーを以下のように設定します。
- 任意のポリシー名を入力する
- ESCサービスメトリクスを選択する
- ターゲット値、スケールイン/アウトのクールダウン期間を入力する
なお、ESCサービスメトリクスでは「平均CPU使用率」、「平均メモリ使用率」、「ALBのリクエスト回数」が選択できます。
GitHub Actionsでデプロイする
GitHub ActionsでECSにデプロイする方法を紹介します。
GitHub Actionsでデプロイするには、デプロイ対象のリポジトリにActionの定義とECSのタスク定義を追加する必要があります。
Actionの定義
こちらにActionのYAMLのサンプルがあります。
基本的にはこの通りで大丈夫ですが「aws-actions/amazon-ecs-deploy-task-definition」については、サンプルのバージョンには不具合があるようで、デプロイに失敗しました。そこで、バージョンを「v1」にしたところデプロイに成功しました。
タスク定義
プロジェクトルートの「./aws/task-definition.json」にECSから取得したタスク定義を配置しました。
注意点としては、ECSから取得したJSONをそのまま使用したのではなく、
値がnullのものはキーごと削除しました。
さいごに
駆け足でしたが、Webアプリケーションのインフラ構築からデプロイまでは、これでひととり試すことができのではないかと思います。