[Terraform] Meta Arguments - life cycle
카테고리: terraform
태그: terraform
🎯Meta Arguments
Terraform은 리소스의 동작을 변경하기 위해 모든 리소스 유형에서 함께 사용할 수 있는 여러(depends_on, count, for_each, provider, lifecycle, provisioner) 메타 인수를 정의합니다.
lifecycle
lifecycle 블록은 리소스 블록 내의 중첩 블록을 사용하여 사용자 지정할 수 있으며 lifecycle 블록 내에는 다음과 같은 인수를 사용할 수 있습니다.
create_before_destroyprevent_destroyignore_changesreplace-triggerd_by
create_before_destroy
기본적으로 Terraform은 apply시 업데이트할 수 없는 리소스 인수를 변경해야 하는 경우 기존 객체를 삭제한 다음 새로 구성된 인수로 새 대체 개체를 만듭니다.
create_before_destroy 메타 인수는 이 동작을 변경하여 새 대체 객체가 먼저 생성되고 대체 객체가 생성된 후 이전 객체가 소멸되도록 합니다.
주의할 점으로 일부 리소스 유형은 충돌을 피하기 위해 각 개체 이름에 임의의 접미사를 추가 제공 해야합니다. create_before_destroy는 이러한 기능을 자동으로 활성화하지 않습니다.
예를 들어 ASG의 무중단 배포를 수행하는 방법은 교체용 ASG를 먼저 만든 다음 원래의 ASG를 파기하는 것입니다. 결과적으로 create_before_destroy 수명 주기 설정이 이 작업을 수행합니다.
- 시작 구성 이름에 직접 의존하도록 ASG의 name 매개 변수를 구성합니다. 시작 구성을 변경할 때 마다 즉, AMI 또는 사용자 데이터를 업데이트할 때마다 이름이 변경되고 ASG 이름이 변경되어 테라폼이 ASG를 강제로 교체합니다.
- ASG의 create_before_destroy 매개 변수를 true로 설정하면 테라폼이 교체를 시도할 때마다 원본을 삭제하기에 앞서 교체 ASG를 생성합니다.
- 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 아키텍처용이어야 합니다."
}
} }
📌출처
👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄
댓글남기기