カテゴリー: Server

Amazon ECSでGoアプリケーションのデプロイとALB設定をやる

はじめに

前回、前々回と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アプリケーションのインフラ構築からデプロイまでは、これでひととり試すことができのではないかと思います。

おすすめ書籍

Hiroki Ono

シェア
執筆者:
Hiroki Ono
タグ: AWS

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前