[Terraform] Meta Arguments - life cycle

업데이트:     Updated:

카테고리:

태그:

🎯Meta Arguments

Terraform은 리소스의 동작을 변경하기 위해 모든 리소스 유형에서 함께 사용할 수 있는 여러(depends_on, count, for_each, provider, lifecycle, provisioner) 메타 인수를 정의합니다.

lifecycle

lifecycle 블록은 리소스 블록 내의 중첩 블록을 사용하여 사용자 지정할 수 있으며 lifecycle 블록 내에는 다음과 같은 인수를 사용할 수 있습니다.

  • create_before_destroy
  • prevent_destroy
  • ignore_changes
  • replace-triggerd_by

create_before_destroy


기본적으로 Terraform은 apply시 업데이트할 수 없는 리소스 인수를 변경해야 하는 경우 기존 객체를 삭제한 다음 새로 구성된 인수로 새 대체 개체를 만듭니다.

create_before_destroy 메타 인수는 이 동작을 변경하여 새 대체 객체가 먼저 생성되고 대체 객체가 생성된 후 이전 객체가 소멸되도록 합니다.

주의할 점으로 일부 리소스 유형은 충돌을 피하기 위해 각 개체 이름에 임의의 접미사를 추가 제공 해야합니다. create_before_destroy는 이러한 기능을 자동으로 활성화하지 않습니다.

예를 들어 ASG의 무중단 배포를 수행하는 방법은 교체용 ASG를 먼저 만든 다음 원래의 ASG를 파기하는 것입니다. 결과적으로 create_before_destroy 수명 주기 설정이 이 작업을 수행합니다.

  1. 시작 구성 이름에 직접 의존하도록 ASG의 name 매개 변수를 구성합니다. 시작 구성을 변경할 때 마다 즉, AMI 또는 사용자 데이터를 업데이트할 때마다 이름이 변경되고 ASG 이름이 변경되어 테라폼이 ASG를 강제로 교체합니다.
  2. ASG의 create_before_destroy 매개 변수를 true로 설정하면 테라폼이 교체를 시도할 때마다 원본을 삭제하기에 앞서 교체 ASG를 생성합니다.
  3. ASG의 min_elb_capacity 매개 변수를 클러스터의 min_size로 설정합니다. 그러면 테라폼은 원래의 ASG를 파괴하기 전에 최소한 새 ASG의 서버들이 ALB에서 상태 확인을 통과하기를 기다립니다.
resource "aws_autoscaling_group" "example" {
  name = "${var.cluster_name}-${aws_launch_configuration.example.name}"

  launch_configuration = aws_launch_configuration.example.name
  vpc_zone_identifier  = data.aws_subnet_ids.default.ids
  target_group_arns    = [aws_lb_target_group.asg.arn]
  health_check_type    = "ELB"

  min_size = var.min_size
  max_size = var.max_size

  min_elb_capacity = var.min.size

  lifecycle {
    create_before_destroy = true
  }

  ...
}

prevent_destroy


이 메타 인수를 ture로 설정하면 인수가 구성에 남아 있는 한 Terraform이 리소스와 연결된 인프라 객체를 파괴하는 모든 계획을 오류와 함께 거부하게 됩니다.

이는 데이터베이스 인스턴스와 같이 재생상하는 데 비용이 많이 들 수 있는 개체의 우발적인 교체에 대한 안전 조치로 사용할 수 있습니다. 그러나 특정 구성 변경 사항을 적용할 수 없게 만들고 인수가 적용된 리소스가 생성된 후에는 terraform destroy 명령을 사용할 수 없게 되므로 이 옵션은 잘 사용되지 않습니다.

인수가 리소스 블록에서 완전히 제거된 경우 비로서 원격 객체가 파괴되는 것을 방지하지 않습니다.

ignore_changes


기본적으로 Terraform은 실제 인프라 개체의 현재 설정에서 차이를 감지하고 구성과 일치하도록 원격 개체를 업데이트합니다.

ignore_changes 메타 인수는 연결된 원격 개체에 대한 업데이트를 계획할 때 Terraform이 무시해야 하는 리소스 속성을 지정합니다. 지정된 속성 이름에 해당하는 인수는 create 작업을 계획할 때는 고려되지만 update 작업을 계획할 때는 무시됩니다.

resource "aws_instance" "example" {
  # ...

  lifecycle {
    ignore_changes = [
      tags,
    ]
  }
}

replace_triggered_by


replace_triggered_by에서 참조하는 항목이 변경되면 리소스를 대체합니다. 참조하는 항목에는 리소스 또는 속성 참조 목록이 될 수 있습니다. 다음의 조건에서 트리거됩니다.

  • 여러 인스턴스로 이루어진 리소스에 대한 참조인 경우 개별 인스턴스를 업데이트하거나 교체하려는 계획이 교체를 트리거합니다.
  • 참조가 단일 리소스 인스턴스에 대한 것이라면 해당 인스턴스를 업데이트하거나 교체하려는 계획이 교체를 트리거합니다.
  • 참조가 리소스의 단일 속성에 대한 것이라면 속성 값이 변경되면 교체가 트리거됩니다.
resource "aws_appautoscaling_target" "ecs_target" {
  # ...
  lifecycle {
    replace_triggered_by = [
      aws_ecs_service.svc.id
    ]
  }
}

사용자 지정 상태 확인

리소스 및 데이터 소스가 작동하는 방식을 보장하기 위해 precondition, postcondition 블록을 추가할 수 있습니다. 다음 예제에서는 lifecycle 예제에서는 AMI가 제대로 구성되었는지 확인하는 precondition 조건을 생성합니다.

resource "aws_instance"  "example"  { 
  instance_type  =  "t2.micro" 
  ami            =  "ami-abc123" 

  lifecycle  { 
    # AMI ID는 
    `x86_64` 아키텍처용 # 운영 체제가 포함된 AMI를 참조해야 합니다. 
    precondition  { 
      condition      = data.aws_ami.example.architecture = =  "x86_64" 
      error_message  =  "선택한 AMI는 x86_64 아키텍처용이어야 합니다." 
    } 
  } }


📌출처

Terraform Up & Running


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

terraform 카테고리 내 다른 글 보러가기

댓글남기기