Day-08 AWS Terraform 메타 인수 | count, depends_on, for_each
Source: Dev.to

Terraform는 메타 인수를 이해하면 훨씬 사용하기 쉬워집니다. 이 인수들은 몇 개의 리소스를 만들지, 어떻게 연결할지, 그리고 Terraform이 이를 어떻게 추적할지를 결정하는 데 도움을 줍니다. 이 글에서는 가장 많이 사용되는 세 가지 메타 인수인 count, for_each, depends_on을 자세히 살펴봅니다.
AWS 인프라를 Terraform으로 구축할 때, 특히 여러 리소스를 만들거나 순서를 관리해야 할 경우 반드시 알아두어야 할 내용입니다.
1. count: 여러 리소스를 손쉽게 생성
count는 간단한 숫자를 사용해 동일한 리소스의 여러 인스턴스를 만들 수 있게 해줍니다. 리소스 생성을 스케일링하는 가장 직관적인 방법입니다.
Example
resource "aws_s3_bucket" "bucket_example" {
count = 3
bucket = "my-bucket-${count.index}"
}
How it works
count = 3은 세 개의 버킷을 생성합니다.- 각 리소스는
0,1,2인덱스를 갖습니다. - 인덱스를 이용해 고유한 이름이나 태그를 만들 수 있습니다.
When to use
- 리소스가 서로 동일할 때.
- 간단한 숫자 기반 스케일링이 필요할 때.
- 순서가 중요하지 않을 때.
2. for_each: 안정적인 식별자를 가진 리소스 생성
for_each는 count보다 유연하고 안전하며, 특히 프로덕션 환경에서 권장됩니다. 맵이나 세트를 기반으로 리소스를 만들며, 각 리소스에 안정적인 식별자를 부여합니다.
Example
resource "aws_s3_bucket" "bucket_foreach" {
for_each = toset(["bucket-a", "bucket-b"])
bucket = each.value
}
How it works
- 숫자 인덱스 대신
each.key와each.value를 사용합니다. - 리스트 순서가 바뀌어도 리소스 식별자는 변하지 않습니다.
- 각 리소스가 고유한 논리적 항목을 나타낼 때 이상적입니다.
When to use
- 리소스 이름이 안정적으로 유지되어야 할 때.
- 리스트, 세트, 맵 등 컬렉션으로부터 리소스를 만들 때.
- 인덱스 이동으로 인한 재생성을 방지하고 싶을 때.
3. depends_on: 리소스 생성 순서 제어
Terraform는 보통 의존성을 자동으로 감지합니다. 하지만 일부 상황에서는 명시적인 순서 지정이 필요하며, 이때 depends_on이 유용합니다.
Example
resource "aws_s3_bucket" "primary" {
bucket = "primary-bucket"
}
resource "aws_s3_bucket" "secondary" {
bucket = "secondary-bucket"
depends_on = [aws_s3_bucket.primary]
}
How it works
secondary가primary이후에만 생성되도록 보장합니다.- 두 리소스를 직접 연결하는 참조가 없을 때 유용합니다.
- 생성 및 삭제 순서를 완전히 제어할 수 있습니다.
When to use
- 한 리소스가 다른 리소스보다 먼저 존재해야 할 때.
- IAM 역할, 어태치먼트, 권한, 혹은 모듈 간 연결 등에 사용합니다.
- Terraform이 자동으로 의존성을 판단하지 못할 때.
Conclusion
Terraform 메타 인수는 대규모 인프라 관리에 핵심적인 역할을 합니다. count를 사용하면 리소스를 빠르게 복제할 수 있고, for_each를 통해 예측 가능하고 안정적인 리소스 식별자를 얻으며, depends_on을 통해 의존성 순서를 완전히 제어할 수 있습니다. 이 기능들을 함께 활용하면 AWS용 Terraform 구성을 더 깔끔하고 안전하며 유지보수가 쉬운 형태로 작성할 수 있습니다. 이러한 기본기를 마스터하면 신뢰할 수 있는 프로덕션‑레디 인프라스트럭처를 코드로 구현하는 기반이 됩니다.
References
- (Add any relevant links or documentation here)