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
- 특정 조건에서 교체를 트리거하는 것과 같은 작업을 지정
- create_before_destroy
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
반응형
'Terraform' 카테고리의 다른 글
[Terraform] count, for_each 등 실습예제 (0) | 2024.05.12 |
---|---|
[Terraform] Variables, Outputs, Data, functions (0) | 2024.05.12 |
[테라폼] ECS배포 및 revision관리 (1) | 2023.12.03 |
[테라폼] EKS 배포 및 Add on 설치 (0) | 2023.10.20 |
[테라폼] Workflow & gitlab runner 프로비저닝 파이프라인 (0) | 2023.08.20 |