본문 바로가기!

Terraform

[Terraform] Resource Block 구문 문법(lifecycle, depends_on)

728x90
반응형

resource를 생성하기 위해 필요한 Arguments 외에 모든 resource가 공통적으로 사용할 수 있는 Arguments를 Meta Arguments라 합니다. - Arguments 참조

  • resource를 생성하기 위해 필요한 Arguments 외에 모든 resource가 공통적으로 사용할 수 있는 Arguments를 Meta Arguments라 합니다.
  • Meta Argument 인 lifecycle, depends_on 에 대해 실습을 진행합니다.

 

1. lifecycle

  • lifecycle Meta Agument는 리소스의 수명 주기 동작을 제어합니다.
  • lifecycle은 다음과 같은 object을 통해 리소스의 수명주기를 제어할 수 있습니다. 
    • create_before_destroy
      • 업데이트 중에 리소스가 삭제되기 전에 리소스가 생성되도록 보장
    • prevent_destroy
      • 실수로 삭제하는 것을 방지
    • ignore_changes
      • 업데이트 중에 특정 속성을 무시
    • replace_triggered_by
      • 특정 조건에서 교체를 트리거하는 것과 같은 작업을 지정

 

1-1) create_before_destroy

  • 기본적으로 Terraform 에서 리소스의 설정을 update 를 해야할 때 제약사항에 의해 update 가 불가능한 경우 만들어진 리소스를 삭제 후 새롭데 리소스를 생성하게 됩니다.
  • create_before_destroy 설정 true로 설정하면 먼저 update된 리소스를 생성하고 기존의 리소스를 삭제하는 방식으로 동작하여 가동 중지 시간을 방지할 수 있습니다.
resource "aws_instance" "example" {
  ami           = data.aws_ami.latest_amazon_linux_2.id
  instance_type = "t3.micro"

  lifecycle {
    create_before_destroy = true
  }
}

  • 위와 같이 lifecyle의 create_before_destroy가 true로 설정되어 있다면 인스턴스의 이미지가 변경되었을 때, 새로운 Ubuntu 이미지용 인스턴스가 생성되고, 기존의 아마존리눅스2용 인스턴스가 삭제되는 것을 확인할 수 있습니다.

 

1-2) prevent_destroy

  • prevent_destroy 설정은 실수로 리소스를 삭제하는 것을 방지하여 중요한 인프라 구성 요소에 유용합니다.
  • prevent_destroy을 true 로 설정하면 resource 가 destroy 되려고 할때 error 를 반환합니다.
resource "aws_instance" "example" {
  ami           = data.aws_ami.latest_ubuntu2204.id
  instance_type = "t3.micro"

  lifecycle {
    prevent_destroy = true
  }
}

 

 

1-3) ignore_changes

  • ignore_changes 구성을 사용하면 업데이트 중에 특정 속성을 무시하고 수동 또는 대역 외 변경을 유지할 수 있습니다.
  • ignore_changes 는 list 값을 가지며 작성한 arguments를 terraform이 실제환경과 코드간에 비교하는 대상에서 제외시켜 update를 하지않습니다.
  • 예를 들어 Terraform Code를 통해 배포된 리소스가 있는데, 운영상의 빠른 환경 구성 변경이 필요하여 콘솔을 통해 리소스의 설정을 변경했다면, Terraform Code를 다시 apply 했을 시, Code에 작성된 설정값으로 원복하려 할 것이지만, 이렇게 설정이 변경된다면 운영하고 있는 서비스에 큰 장애가 발생하게 됩니다. ignore_changes를 사용해서 Terraform이 비교하는 대상에서 제외시켜 update를 방지할 수 있습니다.
resource "aws_instance" "example" {
  ami           = data.aws_ami.latest_ubuntu2204.id
  instance_type = "t3.micro"

  lifecycle {
    ignore_changes = [ami, instance_type]
  }
}

 

  • 현재 실제 EC2의 유형은 t3.small로 바뀌었고, Terraform Code상에는 t3.micro로 설정되어있지만, ignore_changes 설정에 instance_type이 추가되어 있기 때문에 아무것도 update 되지 않는 것을 확인 가능합니다.

 

1-4) replace_triggered_by

  • 지정된 변경 사항이 발생할 때 리소스 교체를 트리거합니다.
  • replacement_triggered_by는 언급된 모든 리소스에 대해 계획된 작업을 기반으로 하기 때문에 replacement_triggered_by 수명 주기 argument에는 지정된 모든 값은 리소스용이어야 합니다.
  • local 값 및 입력 variable과 같은 일반 데이터 값은 replacement_triggered_by에서 유효하지 않습니다.
  • 입력이 변경될 때마다 작업을 계획하는 terraform_data의 동작을 사용하여 일반 값을 간접적으로 사용하여 대체를 트리거할 수 있습니다.
resource "aws_instance" "example" {
  ami           = data.aws_ami.latest_ubuntu2204.id
  instance_type = var.instance_type_name

  lifecycle {
    replace_triggered_by = [terraform_data.replacement]
  }
}

variable "instance_type_name" {
  default = "t3.micro"
}

resource "terraform_data" "replacement" {
  input = var.instance_type_name
}

 

  • 기본적으로 EC2의 인스턴스 유형을 변경하게 되면 인스턴스는 삭제되지않고, 인스턴스 유형만 변경되게 됩니다. 
  • 하지만, replace_triggered_by 를 통해 terraform_data.replacement 블록이 변경되면 인스턴스가 재생성되도록 해놨기 때문에 다음과 같이 인스턴스가 삭제 후 재생성되는 것을 확인할 수 있습니다.

 

 

 

2. depends_on

  • depend_on Meta Agument는 리소스 간의 종속성을 명시적으로 지정하는 데 사용되며, 순환 종속성(Cycle Error) 및 런타임 오류를 방지하기 위해 올바른 생성 순서를 보장합니다.
resource "aws_s3_bucket" "log_bucket" {
  bucket = "web-app-logs"
}

resource "aws_instance" "web_server" {
  ami           = "ami-123456"
  instance_type = "t2.micro"

  depends_on = [aws_s3_bucket.log_bucket]
}

 

728x90
반응형