本記事で扱うリポジトリ
本記事で解説している構成の Terraform / GitHub Actions / アプリケーションコードは
以下の GitHub リポジトリにまとめています。
👉 https://github.com/marcy775/terraform-aws-ecs-fargate
- Terraform による AWS インフラ構築
- ECS(Fargate) + ALB 構成
- GitHub Actions による CI/CD
- CloudWatch 監視 + SNS 通知
- ECS Deployment Circuit Breaker による自動ロールバック
コードを先に見たい方は、リポジトリを眺めながら読むのがおすすめです。
はじめに
本記事では、
ECS(Fargate) + ALB + GitHub Actions + CloudWatch を用いて、
- IaC によるインフラ構築
- CI/CD
- 監視・通知
- ECS の自動ロールバック
までを SRE 視点で意識した構成 を記載します。
全体構成
今回構築した構成は以下の通りです。
使用技術
- Terraform
- Amazon ECS(Fargate)
- Application Load Balancer
- Amazon ECR
- GitHub Actions(OIDC)
- CloudWatch(Logs / Alarm)
- SNS(メール通知)
なぜ ECS(Fargate)を選んだか
運用負荷を最小化したかった
Fargate を使うことで、
- EC2 のキャパシティ管理
- OS パッチ適用
- ノード障害対応
といった インフラ運用の責務を AWS に任せる ことができます。
今回の目的は「Kubernetes を極める」ことではなく、
安全にアプリケーションを運用できる構成を作ることだったため、ECS を選択しました。
EKS との比較
- クラスタ管理の学習コスト
- 運用負荷の増加
を考慮し、学習・デモ用途かつ実務想定 という条件では ECS の方が適切だと判断しました。
Terraform の設計方針
Terraform の構成は 2 レイヤー構成 にしています。
env レイヤー(環境定義)
- 利用する module の組み立て
- 環境固有の値(CIDR / リージョン等)の定義
- module 間の依存関係の制御
env 配下では aws_* リソースを直接定義せず、
インフラの設計・構成管理に集中 するようにしています。
modules レイヤー(リソース定義)
- AWS リソースの具体的な定義
- 環境に依存しない設計
- 単一責務を意識した module 分割
各 module は他の module を直接参照せず、
必要な情報は variables 経由で受け取るようにしています。
CI/CD(GitHub Actions)
CI/CD には GitHub Actions を使用しています。
デプロイフロー
-
mainブランチに push - Docker イメージを build
- ECR に push
-
aws ecs update-serviceを実行 - ECS が新しいタスクを起動
- ALB のヘルスチェック通過後に切り替え
OIDC を使ったセキュアな認証
GitHub Actions から AWS への認証には OIDC を使用しています。
- アクセスキーを GitHub に保存しない
- IAM Role を AssumeRole する構成
にすることで、
セキュリティと運用性を両立 しています。
ECS の自動ロールバック設計
deployment_controller {
type = "ECS"
}
deployment_circuit_breaker {
enable = true
rollback = true
}
自動で前バージョンへロールバック される設計としています。
- タスク起動失敗
- ALB のヘルスチェック NG
これにより、デプロイ失敗時もサービス停止を最小限に抑えられます。
監視・通知設計
ログ
- ECS タスクのログを CloudWatch Logs に集約
メトリクス監視
- ECS サービスの CPU / メモリ使用率 を監視
- 使用率 80% 超過 で CloudWatch Alarm を発火
通知
- CloudWatch Alarm → SNS → メール通知
最低限ではありますが、
「異常に気づける構成」 を用意しています。
この構成で意識したこと
- 「動く」だけで終わらせない
- 障害が起きた時を前提に設計する
- 運用負荷を下げる仕組みを組み込む
IaC + CI/CD + 監視 + ロールバックまで含めて初めて
運用可能なインフラ だと考えています。
今後の改善案
- Terraform の
plan / applyを GitHub Actions に統合 - ECS タスク定義のバージョン管理改善
- Blue/Green デプロイ(CodeDeploy)の導入
- マルチ環境(dev / stg / prod)対応
おわりに
本構成は学習・デモ用途ではありますが、
実務を強く意識した設計 を心がけました。
同じように ECS や Terraform を学んでいる方の参考になれば嬉しいです!!