ECSのBlue/GreenデプロイがTerraformで設定できたのでやってみた

前回、手動で設定したものが Terraformから設定できるようになっていたので、Let’s Try!!

.oO( Terraform is SUGOI

環境

  • Terraform 1.52
  • 既存ECS環境構築済み

ECS側の追記

ect.tfのdeployment_controllertype = "CODE_DEPLOY" を追記

...(省略)

resource "aws_ecs_service" "test-service" {
  name            = "test-service"
  cluster         = "${aws_ecs_cluster.test-cluster.id}"
  task_definition = "${aws_ecs_task_definition.test-task-definition.arn}"
  desired_count   = 2
  launch_type     = "FARGATE"
  health_check_grace_period_seconds = "3600"
  deployment_maximum_percent = 200
  deployment_minimum_healthy_percent = 100

  # ★★ ここから ★★★
  deployment_controller {
    type = "CODE_DEPLOY" 
  }
  # ★★★ ここまで ★★★

  load_balancer {
    target_group_arn = "${aws_alb_target_group.test-alb-tg.arn}"
    container_name = "hoge-container",
    container_port = 80
  }

  network_configuration {
    subnets           = ["${lookup(var.alb, "${terraform.workspace}.subnet_ids_AZ_a")}", "${lookup(var.alb, "${terraform.workspace}.subnet_ids_AZ_c")}"]
    security_groups   = ["${aws_security_group.SG-TEST.id}"]
    assign_public_ip  = "true"
  }
}

...(省略)

CodeDeployの設定追加

新たにcodedeploy.tfを作成した

#★★★ の箇所は環境に合わせて変えてもらえればと思います

# CodeDeploy

#//----------------------------------------
#// アプリケーション
#//----------------------------------------
resource "aws_codedeploy_app" "app" {
  compute_platform = "ECS"
  name             = "AppECS-Test" #★★★
}

#//----------------------------------------
#// デプロイグループ
#//----------------------------------------
resource "aws_codedeploy_deployment_group" "group" {
  app_name               = "${aws_codedeploy_app.app.name}"
  deployment_config_name = "CodeDeployDefault.ECSAllAtOnce"
  deployment_group_name  = "DgpECS-Test" #★★★
  service_role_arn       = "arn:aws:iam::[アカウントID]:role/ecsCodeDeployRole" #★★★前回の記事で作成したRoleのARN

  auto_rollback_configuration {
    enabled = true
    events  = ["DEPLOYMENT_FAILURE"]
  }

  blue_green_deployment_config {
    deployment_ready_option {
      action_on_timeout = "CONTINUE_DEPLOYMENT"
    }

    terminate_blue_instances_on_deployment_success {
      action                           = "TERMINATE"
      termination_wait_time_in_minutes = 120 #★★★古いタスクの削除待機時間
    }
  }

  deployment_style {
    deployment_option = "WITH_TRAFFIC_CONTROL"
    deployment_type   = "BLUE_GREEN"
  }

  ecs_service {
    cluster_name = "${aws_ecs_cluster.test-cluster.name}" #★★★
    service_name = "${aws_ecs_service.test-service.name}" #★★★
  }

  load_balancer_info {
    target_group_pair_info {
      prod_traffic_route {
        listener_arns = ["${aws_alb_listener.test-alb-listener.arn}"] #★★★
      }

      target_group {
        name = "${aws_alb_target_group.test-alb-tg-blue.name}" #★★★
      }

      target_group {
        name = "${aws_alb_target_group.test-alb-tg-green.name}" #★★★
      }
    }
  }
}

試す

Terraform実行直後のECS画面はこんなカンジ(サービス>デプロイ)

Codedeployを起動させる

  1. タスク定義の内容は特に変えずリビジョンのみ更新
  2. サービス更新から最新のタスク定義を参照するよう更新。(リビジョンの設定以外は変更なし)

サービス > デプロイ画面に戻るとCodeDeployの表示がされています

DeploymentIDをクリックするとCodeDeployの画面に遷移します。
ステップ3 の待機時間も Terraformで指定した時間(120分)になっていることが確認できます。

おわり

手動での設定を行わなくてもコードで完結できるのでGood

サーバサイドエンジニア。オムライスが好物

シェアする

  • このエントリーをはてなブックマークに追加

フォローする