count 메타-인자

count 메타-인자 (count reference)

count 메타-인자를 사용해 단일 블록에서 리소스나 모듈을 여러 개 생성하는 방법을 설명해 드릴게요. 거의 동일한 인스턴스를 만들 때 특히 유용해요.

출처: 문서

본문

기본적으로 각 resource 블록ephemeral 블록은 실제 인프라 객체 하나를 구성해요. 마찬가지로 module 블록은 자식 모듈의 내용을 구성에 한 번 포함시키고, action 블록에 정의된 동작을 한 번 호출해요.

count 메타-인자를 사용하면 고정된 컴퓨트 인스턴스 풀처럼 비슷한 객체 여러 개를 각 객체마다 별도 블록을 작성하지 않고 관리할 수 있어요. resource 또는 module 블록에 값이 정수인 count 인자가 포함되면 Terraform은 그만큼의 인스턴스를 만들어요. countaction 블록에 나타나면 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]은 개별 인스턴스를 가리켜요.

이것은 인덱스나 키 없이 참조할 수 있는 countfor_each가 없는 리소스·모듈과 다르다는 점을 참고해요. 마찬가지로 여러 인스턴스가 있는 자식 모듈의 리소스는 plan 출력과 UI의 다른 곳에 표시될 때 module.[]로 접두사가 붙어요. countfor_each가 없는 모듈의 경우 모듈 이름만으로 참조할 수 있으므로 주소에 모듈 인덱스가 포함되지 않아요.

중첩된 provisioner 또는 connection 블록 안에서는 특수한 self 객체가 resource 블록 전체가 아니라 현재 리소스 인스턴스를 가리켜요.

countfor_each 사이 선택 (How to choose between count and for_each)

countfor_each는 비슷한 기능을 수행해요. 거의 동일한 인스턴스를 만들려면 count 인자를 사용하고, 일부 인스턴스 인자가 정수 인덱스에서 직접 유도할 수 없는 서로 다른 값을 가져야 하면 for_each를 사용해요. 같은 resource 또는 module 블록에서 countfor_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 블록 문서를 참고해요.

더 알아보기 (Learn more)