🎉

TerraformでECS(Fargate)+ALBの構成を作る

2023/05/21に公開

前置き

client→ALB→ECSコンテナ(Fargate)の構成をTerraform化しました。

構成図

main.tfを実行するとこちらの構成が出来上がります。

リポジトリ

tfファイルはこちら
https://github.com/not75743/Terraform-Fargate-ALB

ポイント

templatefile

タスク定義内で使用する設定をtemplatefileで書くことで、main.tfで定義した値を使用することが出来ます。

コンテナ名、コンテナイメージを定義し、

envs/dev/main.tf
module "app" {
  source          = "../../modules/app"
... 略 ...
  container-name  = "nginx"
  container-image = "nginx:latest"

container_definitions.jsonで使えるようにしています。

modules/app/container_definitions.json
[
    {
      "name": "${container-name}",
      "image": "${container-image}",

https://developer.hashicorp.com/terraform/language/functions/templatefile

target_typeはip

ターゲットグループのtarget_typeはFargateを使用する場合ipとする必要があります。
ネットワークモードawsvpcを使用しているためです。

modules/LB/main.tf
resource "aws_lb_target_group" "test_target_group" {
  target_type = "ip"
}

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/create-application-load-balancer.html

ignore_changes

lifecycleのignore_changesを使用し、タスク定義とタスク数の変化を無視します。

  • 新リビジョンのタスク定義に更新される
  • タスク数の変化に対応する
    という理由からです。
modules/app/main.tf
resource "aws_ecs_service" "service" {
... 略 ...
  lifecycle {
    ignore_changes = [
      task_definition,
      desired_count,
    ]
  }

https://developer.hashicorp.com/terraform/language/meta-arguments/lifecycle#syntax-and-arguments

課題

serviceの更新が手動

ignore_changesを使っているため、terraform側でタスク定義を変更したら人力でServiceをアップデートする必要があります。

モジュールで変数が重複する

モジュールごとに変数を読み込んでしまっている。
共通化できないかね...

main.tf
module "network" {
  source       = "../../modules/network"
  system_name  = var.system_name #例えばこれ
  ... 略 ...
  
 module "app" {
  source          = "../../modules/app"
  system_name     = var.system_name # 重複

参考

https://qiita.com/hajimeni/items/f41a83bdced6d1c091d6

Discussion