大きく環境構築モジュール群とサービス構築モジュール群に別れます。環境構築モジュール群はGitHub Actionsを使用してECSサービスのCICDを行うための環境を準備するモジュールです。プロジェクトで一度だけ実施するモジュールです。サービス構築モジュール群はECSサービスをデプロイする前準備とECSサービスのデプロイおよびCICDパイプラインを構築するモジュールです。サービスごとに実施するモジュールです。
各モジュールはmainとmoduleのディレクトリに別れて構成されます。mainは各モジュールのパラメータを指定する{モジュール名}.tfという名前のtfファイルを格納しています。基本的に利用者はこのmain配下のtfファイル内にあるlocalsの値のみ修正し実行します。moduleは各モジュールが実行するサブモジュール群です。基本的に利用者はmodule配下を気にする必要はありません。(追加の設定など細かなカスタマイズが必要な方や実装が気になる方は見てください。)
また、各モジュールを実行した後に作成されるtfstateはとくにリモートのバックエンドへ保存します。バックエンドはS3バケットとDynamoDBで構成されます。tfstateはS3バケットに保存されます。tfstateへの書き込みはDynamoDBで排他制御を行います。バックエンドにtfstateを保存することで複数人での環境の共有やモジュール間のパラメータ連携が可能になります。
基本となる以下環境をセットアップするterraformモジュールを用意しています。
- tfバックエンド
- ネットワーク
- GitHub Actionsセルフホストランナー
- ECSクラスタ
tfバックエンドは各モジュール実行後に作成されるtfstateファイルを保存するS3バケットとDynamoDBを構築するterraformモジュールです。以降のモジュールはすべてこのモジュールで作成したバックエンドを使用します。これにより、モジュール間でパラメータ(VPC IDなど)を連携させています。なお、このモジュール自体のtfstateファイルはリモートに保存されず、モジュールを実行した端末のローカルディスク(実行時のカレントディレクトリ)に保存されます。そのため、このモジュールのtfstateファイルについては慎重に管理してください。
ネットワークはVPCとパブリックサブネットおよびプライベートサブネットを構築するterraformモジュールです。インターネットゲートウェイやNATゲートウェイ、ECRとS3へのエンドポイントも構築します。このモジュールで作成したVPCのIDやサブネットのIDは他のモジュールでも使用します。このモジュールはVPCがない場合などに実行ください。すでにVPCやサブネットがある場合はそれらのIDを他モジュールで使用してください。
GitHub ActionsセルフホストランナーはGitHub Actionsによるパイプライン処理を実行するGitHub Actionsセルフホストランナーサーバを構築するモジュールです。AMIは最新のAmazon Linuxを使用します。接続するGitHubと認証用のトークンを設定し、Runnerのセットアップを行います。このセットアップはUserdataにより自動で行います。また、GitHub ActionsセルフホストランナーサーバにはCICD処理のためS3とECRへの書き込みを許可するIAMロールを割り当てます。また、以下の追加機能を任意で設定できます。追加機能はデフォルトでは無効にしています。
| 機能 | 説明 |
|---|---|
| 自動起動/停止スケジュール | GitHub Actionsセルフホストランナーは自動で起動/停止するスケジュールを設定します。有効にした場合、デフォルトでは平日の日本時間09-19時の間に起動するように設定します。スケジュールは任意の値に変更可能です。 |
ECSクラスタはECSのサービスをまとめるクラスタを構築するモジュールです。また、ECSタスクやCodePipeline、CodeDeployに必要となる共通のIAMポリシーおよびロールを作成します。
ECSサービスとサービスのCICDをセットアップするモジュールを用意しています。大きく以下2つあります。
- 事前準備
- サービスデプロイ
事前準備はサービスをデプロイする前のソース置き場およびGitHub連携用の設定を構築するモジュールです。コンテナイメージを格納するECRレポジトリとCodeStarConnectionsを使用したGitHub接続設定を構築します。また、サービスに付与するセキュリティグループも作成します。ECRレポジトリは一日以上経過しているタグのついていないイメージを削除するライフサイクルポリシーも設定します。
サービスデプロイはサービスのデプロイおよびCICDの設定を行うモジュールです。ECSサービスに紐づくALBもデプロイします。CodePipelineとCodeDeployによるECSサービスのBlue/Greenデプロイを設定します。このモジュールを実行する前に事前準備モジュールで作成したソース置き場にコンテナイメージおよびデプロイ設定を格納してください。CICDはソース置き場の情報が更新される度に自動で実行されます。