Terraformについて体系的な知識を理解するため、
オライリー社のTerraformではじめる実践IaCを用いてハンズオン学習を進めています。
https://www.oreilly.co.jp/books/9784814400133/
前回はECRクラスター・ECRリポジトリ・GitHub Actions連携について学びました。
https://qiita.com/Blago518/items/c2b2cc07c15a297b3ad0
1.IAMロールの定義 / 14章
背景と目的
ECSタスクがAWSリソースにアクセスするためにはIAMロールが必須となる。
ECRからのイメージ取得、CloudWatch logsにログを出力する際もこの権限が使用される。
Terraformで明示的に定義しておくことで、セキュリティリスクを最低限に抑えられる。
実装構成
- ファイル:
modules/iam/roles/task_exec_role.tf - 目的: ECSタスクがECRからイメージ取得・CloudWatchへのログ書き込みを行う権限を付与
- 補足: 書籍では2種類のロール(タスクロール・実行ロール)を定義するが、本構成は実行ロールにフォーカス
resource "aws_iam_role" "task_exec_role" {
name = "${var.service_name}-${var.env}-exec-role"
assume_role_policy = data.aws_iam_policy_document.task_exec_assume_role.json
tags = local.task_exec_role_tags
}
data "aws_iam_policy_document" "task_exec_assume_role" {
statement {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ecs-tasks.amazonaws.com"]
}
}
}
resource "aws_iam_policy" "task_exec_policy" {
name = "${var.service_name}-${var.env}-exec-policy"
policy = data.aws_iam_policy_document.task_exec_policy.json
}
data "aws_iam_policy_document" "task_exec_policy" {
statement {
actions = [
"logs:CreateLogStream",
"logs:PutLogEvents"
]
resources = ["*"]
}
}
要点
- ECSタスクがAWSリソースを操作するための「実行権限」を与える。
- ログ書き込みやECR Pullが失敗する場合はこのロール設定を疑う。
- Terraformで一元管理すれば、環境ごとに権限差異が生まれにくい。
パラメータ
-
assume_role_policy: このロールを「誰が使えるか」を定義する設定。 -
principalsidentifiers: 権限を付与するAWSサービス-
ecs-tasks.amazon.comで固定
-
-
actions: 許可する操作 -
resources: 対象リソース- 開発中は
*、本番ではARNの指定を推奨
- 開発中は
2.CloudWatchロググループの管理 / 14章
背景と目的
ECSタスクが出力する標準出力をCloudWatch Logsに転送し、
アプリ動作を可視化する。Terraformで構築しておくことで環境間のログ仕様を統一できる。
実装構成
- ファイル:
modules/cloudwatch/logs/log_group.tf - 目的: CloudWatchロググループを作成し、ECSからのログを保存できるようにする。
- 補足: retention期間は環境に応じて可変設定が可能。
resource "aws_cloudwatch_log_group" "log_group" {
name = local.log_group_name
retention_in_days = var.log_retention_in_days
tags = local.log_group_tags
}
要点
- ECSタスク定義で
awslogsドライバを指定すれば、自動的にこのグループへ出力される。 - 長期運用では
retention_in_daysを忘れるとコストが膨らむ。 - 名前規則を統一することで監視設定もスクリプト化しやすい。
パラメータ
-
name: ロググループ名- 環境 + サービス名で一意に設定
-
retention_in_days: 保存期間 -
tags: 管理タグ- 運用、請求分析に役立つ
3.ECSタスク定義の作成 / 14章
背景と目的
ECSで動かすコンテナ(アプリ)の構成を定義する。
CPU・メモリ・ポート・ログ設定・環境変数を1つの設計図としてまとめる。
実装構成
- ファイル:
modules/ecs/task/task.tf - 目的: ECSタスク定義を作成し、アプリのリソース・ポート・実行ロールを指定する。
- 補足:
container_definitionsはlocals.tfでjsoncodeで管理する。
resource "aws_ecs_task_definition" "task" {
family = "${var.service_name}-${var.env}-task"
cpu = 256
memory = 512
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
execution_role_arn = module.roles.task_exec_role_arn
task_role_arn = module.roles.task_role_arn
container_definitions = local.container_definitions
}
要点
- Fargate実行ではEC2不要、完全サーバレスで稼働する。
- タスク定義を変更して
terraform applyすると、自動で新バージョンに置き換わる。 - 複数コンテナも配列として定義することが可能(例: Nginx + App)。
パラメータ
-
family: タスク定義名 -
cpu/memory: コンテナリソース設定 -
network_mode: 通信方式-
awsvpcでENIの割当てを有効化
-
-
execution_role_arn: 実行ロール: ECSエージェント(AWSの管理プロセス)が裏側でタスクを準備、実行するために使う代理権限- ECRからDockerイメージをPull(取得)するとき
- タスク内のログをCloudWatch Logsへ送信するとき
- Secret ManagerやSSM Parameter Storeから環境変数を取得するとき
-
task_role_arn: タスクロール: タスク内のコンテナ(アプリケーション)が、AWSリソースを操作するための権限- S3へファイルをアップロード
- DynamoDBへデータ書き込み
- SQSへメッセージ送信
4.ECSサービスの作成 / 14章
背景と目的
タスク定義を元に、実際にクラスタ上でアプリを常駐稼働させる仕組みを作る。
ECSサービスは「自動復旧・スケーリング・デプロイ制御」の中心的存在である。
実装構成
- ファイル:
modules/ecs/service/service.tf - 目的: ECSタスクをクラスタにデプロイし、ネットワーク構成とスケーリング設定を行う。
- 補足: 本構成では単一タスクを起動し、ALBは次章で追加予定。
resource "aws_ecs_service" "service" {
name = "${var.service_name}-${var.env}-service"
cluster = var.cluster_arn
task_definition = var.task_definition_arn
launch_type = "FARGATE"
desired_count = 1
network_configuration {
subnets = var.subnet_ids
security_groups = var.security_group_ids
assign_public_ip = true
}
deployment_minimum_healthy_percent = 100
deployment_maximum_percent = 200
}
要点
- サービスがタスクを常に監視し、異常停止時に自動復旧する。
- ALBを組み合わせることで、トラフィックをタスクに自動ルーティングできる。
- Terraformによる定義で、環境差異(手動操作ミス)を完全排除できる。
パラメータ
-
cluster: 実行先のECSクラスター: デプロイ先環境を指定 -
task_definition: 使用するタスク定義: アプリの設計図を紐付け -
desired_count: 稼働させるタスク数: 1なら単一インスタンス -
subnets: サブネット設定: パブリック or プライベート選択 -
security_groups: 通信ルール設定: ポート8501などを許可 -
assign_public_ip: 外部アクセス可否 -
development_minimum_healthy_percent: デプロイ時に維持する稼働率
5.まとめ
- IAMロール: ECSがAWSリソースへアクセスするための役割付与
- CloudWach Logs: ログを一元管理し、監視やトラブルシュートを容易にする
- ECSタスク定義: アプリの構成情報(リソース・ポート・環境変数)を明示
- ECSサービス: タスクを常時稼働させ、安定的な運用を実現する
これらをTerraformで統合的に構築することで、
「誰が実行しても同じ環境を再現できる」再現性の高いAWS基盤が完成する。