0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Terraformについて / IAM・ログ管理・ECSタスク・ECSサービスの定義

0
Last updated at Posted at 2025-11-17

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種類のロール(タスクロール・実行ロール)を定義するが、本構成は実行ロールにフォーカス
task_exec_role.tf
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: このロールを「誰が使えるか」を定義する設定。
  • principals identifiers: 権限を付与するAWSサービス
    • ecs-tasks.amazon.comで固定
  • actions: 許可する操作
  • resources: 対象リソース
    • 開発中は*、本番ではARNの指定を推奨

2.CloudWatchロググループの管理 / 14章

背景と目的

ECSタスクが出力する標準出力をCloudWatch Logsに転送し、
アプリ動作を可視化する。Terraformで構築しておくことで環境間のログ仕様を統一できる。

実装構成

  • ファイル: modules/cloudwatch/logs/log_group.tf
  • 目的: CloudWatchロググループを作成し、ECSからのログを保存できるようにする。
  • 補足: retention期間は環境に応じて可変設定が可能。
log_group.tf
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_definitionslocals.tfでjsoncodeで管理する。
task.tf
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は次章で追加予定。
service.tf
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基盤が完成する。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?