count 메타-인자
count 메타-인자 (count reference)
count 메타-인자를 사용해 단일 블록에서 리소스나 모듈을 여러 개 생성하는 방법을 설명해 드릴게요. 거의 동일한 인스턴스를 만들 때 특히 유용해요.
출처: 문서
본문
기본적으로 각 resource 블록과 ephemeral 블록은 실제 인프라 객체 하나를 구성해요. 마찬가지로 module 블록은 자식 모듈의 내용을 구성에 한 번 포함시키고, action 블록에 정의된 동작을 한 번 호출해요.
count 메타-인자를 사용하면 고정된 컴퓨트 인스턴스 풀처럼 비슷한 객체 여러 개를 각 객체마다 별도 블록을 작성하지 않고 관리할 수 있어요. resource 또는 module 블록에 값이 정수인 count 인자가 포함되면 Terraform은 그만큼의 인스턴스를 만들어요. count가 action 블록에 나타나면 Terraform은 지정된 횟수만큼 동작을 호출해요.
사용법 (Usage)
count 메타-인자는 정수를 받으며, 리소스나 모듈의 인스턴스를 그만큼 만들거나 동작을 그만큼 호출해요. 각 인스턴스는 개별 인프라 객체와 연결되며, 구성이 적용될 때 각각 별도로 생성·업데이트·파괴돼요.
팁:
count인자를 리소스 생성의 조건부로 사용할 수 있어요. 예를 들어count = var.creator ? 3 : 0을 설정하면creator라는 변수가true일 때 리소스 인스턴스 3개를 만들라고 Terraform에 지시해요. 자세한 내용은 조건 표현식 참고.
다음 예시에서 Terraform은 같은 AMI와 인스턴스 유형을 사용하는 aws_instance.server 리소스 4개를 만들어요. count.index 속성은 각 aws_instance에 고유한 Name 태그를 부여해요:
resource "aws_instance" "server" {
count = 4 # 비슷한 EC2 인스턴스 네 개 생성
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
tags = {
Name = "Server ${count.index}"
}
}
count 안의 표현식 (Expressions in count)
count 메타-인자는 숫자 표현식을 받지만, 대부분의 인자와 달리 count 값은 Terraform이 원격 리소스 연산을 수행하기 전에 알려져 있어야 해요. count는 객체가 생성될 때 원격 API가 생성하는 고유 ID처럼 구성이 적용된 후에만 알 수 있는 리소스 속성을 참조할 수 없어요.
인스턴스 참조 (Referring to instances)
count가 설정된 블록에서 Terraform은 각 인스턴스의 구성을 수정하는 표현식에 사용할 수 있는 추가 count 객체를 만들어요. 이 객체는 다음 속성을 가져요:
count.index: 이 인스턴스에 해당하는0부터 시작하는 고유 인덱스 번호.
Terraform은 count 인자를 포함하는 블록과 그와 연결된 인스턴스를 구분해요. 인스턴스는 0부터 시작하는 인덱스 번호로 식별돼요.
.또는module.— 예:aws_instance.server는 리소스 블록을 가리켜요..[]또는module.[]— 예:aws_instance.server[0]와aws_instance.server[1]은 개별 인스턴스를 가리켜요.
이것은 인덱스나 키 없이 참조할 수 있는 count나 for_each가 없는 리소스·모듈과 다르다는 점을 참고해요. 마찬가지로 여러 인스턴스가 있는 자식 모듈의 리소스는 plan 출력과 UI의 다른 곳에 표시될 때 module.[]로 접두사가 붙어요. count나 for_each가 없는 모듈의 경우 모듈 이름만으로 참조할 수 있으므로 주소에 모듈 인덱스가 포함되지 않아요.
중첩된 provisioner 또는 connection 블록 안에서는 특수한 self 객체가 resource 블록 전체가 아니라 현재 리소스 인스턴스를 가리켜요.
count와 for_each 사이 선택 (How to choose between count and for_each)
count와 for_each는 비슷한 기능을 수행해요. 거의 동일한 인스턴스를 만들려면 count 인자를 사용하고, 일부 인스턴스 인자가 정수 인덱스에서 직접 유도할 수 없는 서로 다른 값을 가져야 하면 for_each를 사용해요. 같은 resource 또는 module 블록에서 count와 for_each 인자를 둘 다 사용할 수 없어요.
지원되는 구성 (Supported constructs)
다음 Terraform 구성 블록에서 count를 사용할 수 있어요: data 블록, ephemeral 블록, module 블록, resource 블록. 또한 다음 쿼리 구성 블록에서도 사용할 수 있어요: list 블록.
예시 사용 사례 (Example use cases)
모듈 리소스의 여러 인스턴스 만들기
다음 예시에서 Terraform은 instance_names 목록의 고유 이름을 가진 EC2 인스턴스 3개를 만들어요:
locals {
instance_names = ["web", "api", "batch"]
}
module "ec2_instance" {
source = "terraform-aws-modules/ec2-instance/aws"
version = "6.0.2"
count = length(local.instance_names)
name = local.instance_names[count.index]
ami = data.aws_ami.latest_amazon_linux.id
instance_type = "t2.micro"
depends_on = [aws_s3_bucket.example]
}
리소스의 여러 인스턴스 만들기
다음 예시는 입력 변수에 제공된 각 서브넷에 대해 인스턴스 하나를 만들어요:
variable "subnet_ids" {
type = list(string)
}
resource "aws_instance" "server" {
count = length(var.subnet_ids)
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
subnet_id = var.subnet_ids[count.index]
tags = {
Name = "Server ${count.index}"
}
}
동작을 여러 번 호출하기 (Invoke an action multiple times)
count를 사용해 동작을 여러 번 호출할 수 있어요. 예시는 action 블록 문서를 참고해요.
여러 쿼리 목록 만들기 (Create multiple query lists)
count를 사용해 쿼리 결과 목록을 여러 개 만들 수 있어요. 예시는 list 블록 문서를 참고해요.