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