🦁

【入門#4】TerraformでECSを作ろう(クラスター/サービス定義作成)

に公開

今回の目標

Terraformを使って、ECSを作ります。
将来的には下記のシステム構成図になるように進めていきますが、今回はその中のECSに絞って解説します。

◯今回のシステム構成図の全体像

関連記事:https://zenn.dev/alt_tanuki/articles/7c1f97da33496b

前提

下記記事を完了し、Terraformが使用できる状態になっている、ECR/タスク定義を作成していること。

【入門#1】Terraformをインストールしよう!(tfenv事前準備編)
【入門#2】TerraformでECRで作成を作ろう
【入門#3】Terraformでタスク定義を作ろう

ECSは将来的にGithubActionで自動デプロイする想定です。
その場合、タスクの詳細設定はGithubアクションにて管理することになるため
Terraformでは仮の設定を入れて完了するような形とします。

ではやっていきましょう!

順番的には、下記を順を追って行っていきます。
・ECS用 ALB紐付け設定作成(ターゲットグループ/リスナー)
・ECS クラスター作成
・ECS サービス作成

ECS用 ALB紐付け設定作成(ターゲットグループ/リスナー)

こちらもcompute.tfに集めていきます。
今回作成するリスナーはHTTPはHTTPSへリダイレクトさせ、HTTPSはターゲットグループへ転送するようにします。

compute.tfに下記を記述します。

# ALB: 443 Listener
resource "aws_lb_listener" "cask_tokyo_ecs_listener_https" {
  load_balancer_arn = aws_lb.cask_tokyo_ecs.arn
  port              = "443"
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-2016-08"
  certificate_arn   = aws_acm_certificate.cask_tokyo_cert.arn

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.cask_tokyo_ecs_tgtgrp.arn
  }
}

# ALB: 80 Listener
resource "aws_lb_listener" "cask_tokyo_ecs_listener_http" {
  load_balancer_arn = aws_lb.cask_tokyo_ecs.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"
    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

# ALB: TargetGroup
resource "aws_lb_target_group" "cask_tokyo_ecs_tgtgrp" {
  target_type      = "ip"
  name             = "${var.project_name}-tgtgrp"
  protocol_version = "HTTP1"
  port             = 80
  protocol         = "HTTP"

  vpc_id = aws_vpc.cask_tokyo_ecs_vpc.id

  tags = {
    Name = "${var.project_name}-tgtgrp"
  }

  health_check {
    interval = 30
    path     = var.tgtgrp_health_check_path
  }
}

ECS クラスター作成

compute.tfに下記を記述します。
基本的に何も設定しなくても大丈夫です。

モニタリングを強化したい場合は、setting属性を指定すれば色々できるみたい。

# ECSクラスター
resource "aws_ecs_cluster" "cask_tokyo_ecs_cluster" {
  name = var.project_name

  tags = {
    Name = var.project_name
  }
}

ECS サービス作成

compute.tfに下記を記述します。

# ECSサービス
resource "aws_ecs_service" "cask_tokyo_ecs_service" {
  name                              = var.project_name
  # 上で作成したクラスターを指定
  cluster                           = aws_ecs_cluster.cask_tokyo_ecs_cluster.id
  # タスク定義を指定
  task_definition                   = aws_ecs_task_definition.cask_tokyo_ecs_task_definition.arn
  # タスク起動数
  desired_count                     = 1
  launch_type                       = "FARGATE"

  # ネットワーク設定
  network_configuration {
    security_groups = [aws_security_group.cask_tokyo_ecs_sg_ecs.id]
    subnets         = [
      aws_subnet.cask_tokyo_ecs_subnet_public1.id,
      aws_subnet.cask_tokyo_ecs_subnet_public2.id
    ]
    assign_public_ip = true
  }

  # ロードバランサー設定
  load_balancer {
    target_group_arn = aws_lb_target_group.cask_tokyo_ecs_tgtgrp.arn
    container_name   = "task"
    container_port   = 80
  }

  tags = {
    Name = var.project_name
  }
}

今回は実行することで、AWSリソース上に色々作られますがまだアプリをアップロードしていないため、アクセスできません。
※Github自動デプロイを行った際に動くようにしていきます。

下記の記事を目次として、続きをどんどん構築を行っていきますので、今回作成したFargateの使い方などが気になる方はぜひ見に来てください!

Github自動デプロイの実装方法も解説していきます。

https://zenn.dev/alt_tanuki/articles/7c1f97da33496b

Discussion