728x90
안녕하세요, 오늘은 테라폼 count에 대해서 정리한 내용을 가지고 포스팅합니다.
‘테라폼으로 시작하는 IaC’를 기준으로 내용 정리하였으며, Cloudnet의 테라폼 스터디 내용을 기반으로 하고 있습니다.
Terraform에서 list 형태의 값 목록이나 Key-Value 형태의 문자열 집합을 사용하면, 동일한 내용을 반복적으로 구성하지 않고도 효율적으로 관리할 수 있습니다.
count를 사용한 리소스 생성
- count를 사용하여 여러 리소스를 생성할 때는 <리소스 타입>.<이름>[<인덱스 번호>] 형태로 해당 리소스를 참조합니다.
- 모듈의 경우 module.<모듈 이름>[<인덱스 번호>] 형태로 참조합니다.
- 단, 모듈 내에서는 count 적용이 불가능한 선언이 있을 수 있으므로 주의해야 합니다.
- 예를 들어, provider 블록 선언부가 포함된 경우에는 count를 적용할 수 없습니다. 이러한 경우 provider를 분리해야 합니다.
주의 사항
- 외부 변수가 list 타입인 경우 중간에 값이 삭제되면 인덱스가 줄어들어 의도했던 중간 값에 대한 리소스만 삭제되는 것이 아니라 이후의 모든 리소스들도 삭제되고 재생성됩니다. 이는 예기치 않은 리소스 재생성을 유발할 수 있으므로 주의해야 합니다.
variables.tf
variable "instance_count" {
description = "The number of EC2 instances to create"
type = number
default = 2
}
variable "ami_id" {
description = "The AMI ID for the EC2 instances"
type = string
default = "ami-0edc5427d49d09d2a"
}
variable "instance_type" {
description = "The type of instance to use"
type = string
default = "t2.micro"
}
main.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
count = var.instance_count
ami = var.ami_id
instance_type = var.instance_type
tags = {
Name = "instance_${count.index}"
}
}
count를 2로 세팅하여 2대의 인스턴스가 생성됩니다.
마찬가지로 설정된 내용처럼 잘 생성된 것을 확인하실 수 있습니다.
다만 count.index는 0부터 시작됩니다.
Terraform에서 리소스를 반복적으로 생성할 때 count를 사용하는 것은 때때로 취약할 수 있습니다. 그 이유는 리소스 인스턴스가 리스트의 인덱스로 식별되기 때문입니다. 만약 리스트 중간에서 요소를 제거하면, 그 이후의 모든 인스턴스는 subnet_id 값이 변경되어 의도하지 않은 객체 변경이 발생할 수 있습니다.
이에 비해 for_each를 사용하면 이러한 문제를 방지하면서 같은 유연성을 제공합니다.
for_each는 리스트의 인덱스가 아닌 리스트의 값을 기준으로 리소스를 식별하므로, 리스트 중간에 있는 요소를 제거하더라도 다른 리소스의 식별자에 영향을 주지 않습니다. 따라서 의도하지 않은 변경 없이 리소스를 보다 안정적으로 관리할 수 있습니다.
Terraform에서 count와 for_each 비교
count의 문제점
- 인덱스 기반 식별: 리소스 인스턴스가 리스트의 인덱스로 식별됩니다.
- 요소 제거 시 문제: 리스트 중간에서 요소를 제거하면, 그 이후의 모든 인스턴스의 subnet_id 값이 변경됩니다.
- 의도치 않은 변경: 인덱스 변화로 인해 많은 원격 객체 변경이 발생할 수 있습니다.
for_each의 장점
- 값 기반 식별: 리소스 인스턴스가 리스트의 값으로 식별됩니다.
- 안정성: 리스트 중간에 있는 요소를 제거하더라도 다른 리소스 식별자에 영향을 미치지 않습니다.
- 유연성: count와 같은 유연성을 제공하면서도 추가적인 변경이 발생하지 않습니다.
자세한 내용은 공식 문서를 참고해 주세요!
728x90
반응형
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] for_each, for, dynamic의 사용법 (0) | 2024.06.29 |
---|---|
[Terraform] cidrsubnet, cidrsubnets 함수 (0) | 2024.06.23 |
[Terraform] 로컬 변수 사용하기 (0) | 2024.06.23 |
[Terraform] 입력 변수 사용하기 (0) | 2024.06.23 |
[Terraform] 테라폼을 이용한 vpc 배포 (0) | 2024.06.23 |