Skip to content

Instantly share code, notes, and snippets.

@melvinkcx
Last active September 18, 2020 07:34
Show Gist options
  • Save melvinkcx/f07159ffbfe767dc0b6afeaa757b1854 to your computer and use it in GitHub Desktop.
Save melvinkcx/f07159ffbfe767dc0b6afeaa757b1854 to your computer and use it in GitHub Desktop.
Terraform Provisioner: Wait For ECS To Register With LB Before Destroying
# Ref: https://github.com/terraform-providers/terraform-provider-aws/pull/3485#issuecomment-397918310
resource "aws_ecs_service" "web" {
name = "web_service_${var.environment}_${replace(timestamp(), ":", "-")}"
cluster = aws_ecs_cluster.web.id
task_definition = aws_ecs_task_definition.web.arn
desired_count = 1
force_new_deployment = true
load_balancer {
target_group_arn = data.aws_lb_target_group.web_ecs_arn.arn
container_name = "web"
container_port = 8000
}
# Important! Wait till services are up and running before destroying
provisioner "local-exec" {
command = "aws ecs wait services-stable --services ${aws_ecs_service.web.name} --cluster ${aws_ecs_cluster.web.name} --region ${data.aws_region.current.name}"
}
provisioner "local-exec" {
command = "aws elbv2 wait target-in-service --target-group-arn ${data.aws_lb_target_group.web_ecs_arn.arn} --region ${data.aws_region.current.name}"
}
lifecycle {
create_before_destroy = true
}
}
@melvinkcx
Copy link
Author

melvinkcx commented Sep 18, 2020

terraform {
  required_version = ">= 0.13, < 0.14"

  required_providers {
    null = {
      source = "hashicorp/null"
      version = "2.1.2"
    }
  }
}

provider "null" {}

// ...

resource "null_resource" "wait_for_service_deploy" {
  triggers = {
    task_definition = aws_ecs_service.web.task_definition
  }

  provisioner "local-exec" {
    command = "aws ecs wait services-stable --services ${aws_ecs_service.web.name} --cluster ${aws_ecs_cluster.web.name} --region ${data.aws_region.current.name}"
  }
}


resource "null_resource" "wait_for_service_lb_healthy" {
  triggers = {
    task_definition = aws_ecs_service.web.task_definition
    service_stable = null_resource.wait_for_service_deploy.id
  }

  provisioner "local-exec" {
    command = "aws elbv2 wait target-in-service --target-group-arn ${data.aws_lb_target_group.web_ecs_arn.arn} --region ${data.aws_region.current.name}"
  }
}

@melvinkcx
Copy link
Author

resource "null_resource" "wait_for_service_deploy" {
  triggers = {
    ecs_service = aws_ecs_service.web.name
  }

  provisioner "local-exec" {
    command = "aws ecs wait services-stable --services ${aws_ecs_service.web.name} --cluster ${aws_ecs_cluster.web.name} --region ${data.aws_region.current.name}"
  }
}


resource "null_resource" "wait_for_service_lb_healthy" {
  triggers = {
    ecs_service = aws_ecs_service.web.name
    service_stable = null_resource.wait_for_service_deploy.id
  }

  provisioner "local-exec" {
    command = "aws elbv2 wait target-in-service --target-group-arn ${data.aws_lb_target_group.web_ecs_arn.arn} --region ${data.aws_region.current.name}"
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment