【入門#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自動デプロイの実装方法も解説していきます。
Discussion