terraform ECSのコード例

# 前提

main.tfの１ファイルで作成する場合の簡易版メモ。


# terraform  ECSコード

```main.tf
provider "aws" {
  region = "ap-northeast-1"  # AWSリージョンを適切な値に変更
}

resource "aws_ecs_cluster" "my_cluster" {
  name = "my-ecs-cluster"  # ECSクラスターの名前
}

resource "aws_ecs_task_definition" "my_task" {
  family                   = "my-ecs-app"  # タスク定義のファミリー名
  network_mode             = "awsvpc"      # VPCネットワークモードを指定
  requires_compatibilities = ["FARGATE"]   # Fargateタスクとして実行

  execution_role_arn = aws_iam_role.ecs_execution_role.arn

  container_definitions = jsonencode([{
    name  = "my-container"
    image = "nginx:latest"  # コンテナイメージを指定

    portMappings = [{
      containerPort = 80  # コンテナのポートを設定
      hostPort      = 80  # ホストのポートを設定
    }]
  }])
}

resource "aws_iam_role" "ecs_execution_role" {
  name = "ecs-execution-role"
  
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Action = "sts:AssumeRole",
      Effect = "Allow",
      Principal = {
        Service = "ecs-tasks.amazonaws.com"
      }
    }]
  })
}

resource "aws_iam_policy_attachment" "ecs_execution_policy_attachment" {
  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
  role       = aws_iam_role.ecs_execution_role.name
}

resource "aws_ecs_service" "my_service" {
  name            = "my-ecs-service"
  cluster         = aws_ecs_cluster.my_cluster.id
  task_definition = aws_ecs_task_definition.my_task.arn
  launch_type     = "FARGATE"  # Fargateを使用
  network_configuration {
    subnets = ["subnet-12345678"]  # サブネットIDを指定
    security_groups = [aws_security_group.my_security_group.id]
  }
  depends_on = [aws_ecs_task_definition.my_task]
}

resource "aws_security_group" "my_security_group" {
  name        = "my-security-group"
  description = "My Security Group for ECS"
  
  // セキュリティグループの設定を追加
}
```

コードの例：

ECSクラスターを作成し、Fargateタスクを定義しています。

ECSタスクはNginxコンテナを使用し、指定されたVPC内のサブネットとセキュリティグループに配置されます。


# terraform  ECSコード 詳しめに解説

```main.tf
# AWSプロバイダーの設定
provider "aws" {
  region = "ap-northeast-1"  # 使用するAWSリージョンを指定
}

# ECSクラスターの作成
resource "aws_ecs_cluster" "my_cluster" {
  name = "my-ecs-cluster"  # ECSクラスターの名前
}

# ECSタスク定義の作成
resource "aws_ecs_task_definition" "my_task" {
  family                   = "my-ecs-app"  # タスク定義のファミリー名
  network_mode             = "awsvpc"      # VPCネットワークモードを指定
  requires_compatibilities = ["FARGATE"]   # Fargateタスクとして実行

  # タスク実行ロールのARNを指定
  execution_role_arn = aws_iam_role.ecs_execution_role.arn

  # タスクのコンテナ定義
  container_definitions = jsonencode([{
    name  = "my-container"
    image = "nginx:latest"  # 使用するコンテナイメージ

    portMappings = [{
      containerPort = 80  # コンテナ内のポート
      hostPort      = 80  # ホストのポート
    }]
  }])
}

# タスク実行ロールの作成
resource "aws_iam_role" "ecs_execution_role" {
  name = "ecs-execution-role"
  
  # タスク実行ロールの信頼ポリシーを指定　
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Action = "sts:AssumeRole",
      Effect = "Allow",
      Principal = {
        Service = "ecs-tasks.amazonaws.com"
      }
    }]
  })
}

# タスク実行ロールにAmazon ECSタスク実行ポリシーをアタッチ
resource "aws_iam_policy_attachment" "ecs_execution_policy_attachment" {
  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
  role       = aws_iam_role.ecs_execution_role.name
}

# ECSサービスの作成
resource "aws_ecs_service" "my_service" {
  name            = "my-ecs-service"
  cluster         = aws_ecs_cluster.my_cluster.id
  task_definition = aws_ecs_task_definition.my_task.arn
  launch_type     = "FARGATE"  # Fargateを使用

  # タスクが配置されるVPCとセキュリティグループを指定
  network_configuration {
    subnets = ["subnet-12345678"]  # サブネットIDを指定
    security_groups = [aws_security_group.my_security_group.id]
  }
  depends_on = [aws_ecs_task_definition.my_task]
}

# セキュリティグループの作成
resource "aws_security_group" "my_security_group" {
  name        = "my-security-group"
  description = "My Security Group for ECS"
  
  # セキュリティグループの設定を追加
}
```

既存のセキュリティグループアタッチ方法

```main.tf
# 既存のセキュリティグループIDを指定（例: sg-0123456789abcdef0）
variable "existing_security_group_id" {
  description = "既存のセキュリティグループID"
  type        = string
  default     = "sg-0123456789abcdef0"  # 実際のセキュリティグループIDに置き換え
}

# ...

# ECSサービスの作成
resource "aws_ecs_service" "my_service" {
  name            = "my-ecs-service"
  cluster         = aws_ecs_cluster.my_cluster.id
  task_definition = aws_ecs_task_definition.my_task.arn
  launch_type     = "FARGATE"  # Fargateを使用

  # 既存のセキュリティグループIDを指定してセキュリティグループをアタッチ
  network_configuration {
    subnets = ["subnet-12345678"]  # サブネットIDを指定
    security_groups = [var.existing_security_group_id]  # 既存のセキュリティグループIDを使用
  }
  depends_on = [aws_ecs_task_definition.my_task]
}
```