1. 리소스 생명 주기 (Lifecycle Rules)
Terraform은 리소스를 업데이트할 때 기존 리소스를 삭제(destroy)하고 새로운 리소스를 생성(create)하는 immutable 인프라 접근 방식을 따릅니다. 그러나 모든 경우에 이러한 동작이 적합하지 않을 수 있습니다. 이를 제어하려면 lifecycle rules를 활용할 수 있습니다.
1.1 create_before_destroy
기존 리소스를 삭제하기 전에 새로운 리소스를 먼저 생성한다. 어떤 리소스는 다운 타임을 최소화하기 위해 이러한 조치가 필요할 것이다.
resource "aws_instance" "example" {
ami = "ami-123456"
instance_type = "t2.micro"
lifecycle {
create_before_destroy = true
}
}
1.2 prevent_destroy
리소스가 삭제되지 않도록 보호한다, 이때 보호되는것은 변경에 의한 삭제이지 main.tf 등 문서에서 리소스가 사라졌을때 삭제되는 것까지지 방지하는것은 아니다.
resource "aws_s3_bucket" "example" {
bucket = "example-bucket"
lifecycle {
prevent_destroy = true
}
}
1.3. ignore_changes
특정 속성 변경을 무시한다. 예를 들어, 태그 변경을 Terraform에서 무시하도록 설정할 수 있다.
resource "aws_instance" "web" {
ami = "ami-123456"
instance_type = "t2.micro"
lifecycle {
ignore_changes = [
tags
]
}
}
주로 외부 시스템이나 사용자에 의해 변경될 수 있는 속성을 terraform 이 덮어쓰지 않도록 할 때 유용하다.
- 위의 예시처럼 EC2 인스턴스의 태그나
- S3 의 ACL 처럼 시스템이나 사용자에 의해 변경될 수 있는 것들
- 테스트 환경에서 의도적으로 속성을 변경하려고 할때
ignore_changes 가 유용하지만 Terraform 이 바라보는 상태와 실제 인프라의 상태가 달라지게 되므로 나중에 둘을 동기화할때 추가작업이 필요해진다. 따라서 신중히 사용해야한다.
2. Meta Arguments: Count
Terraform에서 동일한 리소스를 여러 개 생성하려면 count
메타 인수를 사용한다.
2.1 기본 사용법
다음은 로컬 파일을 3개 생성하는 예제이다.
resource "local_file" "example" {
count = 3
filename = "/root/file-${count.index}.txt"
content = "This is file ${count.index}"
}
이렇게 하면 /root/file-0.txt
, /root/file-1.txt
, /root/file-2.txt
가 생성된다.
2.2 Count와 리스트
동적 파일 이름을 사용하려면 리스트 변수를 활용할 수 있다.
variable "filenames" {
default = ["file-a.txt", "file-b.txt", "file-c.txt"]
}
resource "local_file" "example" {
count = length(var.filenames)
filename = "/root/${var.filenames[count.index]}"
content = "This is ${var.filenames[count.index]}"
}
리스트 길이가 변경되면 자동으로 리소스 개수가 조정된다.
3. Data Sources
Terraform은 외부에서 생성된 리소스를 읽고 활용하기 위해 Data Sources를 사용한다. 이때 외부라 하면 현재 terraform 파일에서 관리되지 않는 것을 총칭한다. 외부 클라우드에서 제공되는 데이터 소스일 수도 있으며, 내가 작업중인 컴퓨터의 다른 파일일 수도 있겠다.
3.1 기본 사용법
다음은 로컬 파일의 내용을 읽는 예시이다. example.txt 의 내용을 읽어서 new_example.txt 에 넣는다.
data "local_file" "example" {
filename = "/root/example.txt"
}
resource "local_file" "new_file" {
filename = "/root/new_example.txt"
content = data.local_file.example.content
}
3.2 Data Sources vs Managed Resources
Managed Resources | Data Sources |
---|---|
Terraform에서 리소스를 생성, 업데이트, 삭제 | 외부 리소스에서 데이터만 읽기 |
resource 키워드를 사용 |
data 키워드를 사용 |
Terraform이 리소스의 상태를 관리 | Terraform 외부의 리소스를 참조 |
위의 내용을 활용하여 Terraform을 더욱 효율적으로 관리해보자! 🎯
'탐구 생활 > Terraform' 카테고리의 다른 글
Terraform AWS: VPC 만들기 (0) | 2024.11.24 |
---|---|
Terraform 기초: commands (0) | 2024.11.21 |
Terraform 기초: State (0) | 2024.11.21 |
Terraform 기초: depends_on, output (0) | 2024.11.19 |
Terraform 기초: HCL 기본기 (0) | 2024.11.17 |