테라폼은 선언형(Declarative) 언어입니다. 일반적인 프로그래밍 언어와 달리 선언형 언어이기때문에 for-loop나 if-statement 같은 로직을 직접 사용하기에는 어려움이 있습니다.
그럼 어떻게 반복문을 활용할 수 있을까요? 만약, 테라폼을 이용해서 가상 네트워크를 여러개 만들려고 하면 어떻게 만들 수 있을까요? 그리고 어떻게 조건문을 사용할 수 있을까요?
이러한, 궁금증을 해결하기 위해서 본 블로그를 작성하게 되었습니다.
다행히 테라폼은 이런 반복이나 조건부 작업을 처리할 수 있는 몇 가지 방법을 제공합니다.
반복문 (Loop)
일반적인적으로 for-loop 반복문을 통해서 코드를 작성하게 되면 아래와 같이 진행 될 수 있을 것 같습니다.
# 이 코드는 실제로 오류가 발생합니다.
resource "azurerm_virtual_network" "example" {
count = 3
name = "vnet-prod" # 모든 리소스의 이름이 동일하여 오류 발생
address_space = ["10.0.0.0/16"]
location = "eastus"
resource_group_name = "my-resource-group"
}
하지만, 이코드의 경우 Terraform에서 작동하지 않으며 만약 작동한다고 해도 가상 네트워크는 "vnet-prod"라는 동일한 이름으로 생성되려고할 것입니다. 그럼 오류가 발생하겠죠!
그래서 테라폼에서는 다음과 같이 count, length, element를 이용해서 반복문을 활용할 수 있습니다.
아래 코드 내용과 같이 반복문을 설정해서 테라폼 코드를 반복하여 리소스를 생성할 수 있습니다.
1. vnet/variables.tf
# Azure 가상 네트워크 이름 변수 값 정의
variable "vnet_names" {
type = list(string)
default = ["vnet-prod", "vnet-dev", "vnet-test"]
}
2. vnet/main.tf
# Azure 가상 네트워크 생성
resource "azurerm_virtual_network" "example" {
count = length(var.vnet_names)
name = element(var.vnet_names, count.index)
address_space = ["10.0.${count.index}.0/24"]
location = "eastus"
resource_group_name = "my-resource-group"
}
위 코드를 간단하게 설명하면 다음과 같아요.
우선, vnet_name이라는 변수의 길이를 length라는 함수를 통해서 가져오게 됩니다.
vnet_name(vnet/variables.tf)를 보게되면 type이 list(string)이고 default로 "vnet-prod", "vnet-dev", "vnet-test"가 선언되어있습니다. 그러므로 length의 경우 3이되게 됩니다. 그럼 example의 count는 3이 되겠죠!
다음으로 element라는 함수로 vnet_names들의 리스트 이름을 받아오고 count.index로 몇 개를 받아올지 정하게 됩니다.
count.index의 경우 정수형 인덱스 값을 갖는 변수로서 count=3으로 설정되면 해당 리스트 값에서 0,1,2를 순서대로 할당되게 됩니다. 그러므로 example name에 "vnet-prod", "vnet-dev", "vnet-test"가 할당되는 것이죠
마지막으로 ${count.index}의 경우 element 함수에서 사용되는게 아니라서 리스트 값 순서대로 가져오는 것이 아니므로 숫자 0,1,2로 할당되게 됩니다. 그럼 결과적으로 "10.0.0.0/24", "10.0.1.0/24", "10.0.2.0/24"가 할당되게 됩니다.
3. vnet/outputs.tf
# Azure 가상네트워크 출력 변수 정의
output "all_vnet_ids" {
value = [azurerm_virtual_network.example.*.id]
}
마찬가지로 위 코드에 대해서 간단히 설명하도록 할게요.
output으로 출력 변수가 출력되는 테라폼 코드이고 azurerm_virtual_network.example.*.id의 뜻은 다음과 같아요 .
vnet/main.tf를 참고하시면 이해할 수 있습니다.
- azurerm_virtual_network: 리소스의 유형(Type)
- example: 리소스의 이름(Name)
- *: 여러 리소스를 참조할 때 사용하는 와일드카드
- id: 출력하고자 하는 리소스의 속성(Attribute)
값의 경우 azurerm_virtual_network.example.0.id, azurerm_virtual_network.example.1.id, azurerm_virtual_network.example.2.id의 정보가 출력될 것입니다.
여기서 주의할 점은, value 값에 특수문자 *를 사용할 경우 목록이 반환되므로 출력 변수를 대괄호로 묶어야합니다.
그럼 이제 실제로 정확하게 동작하는지 확인하기 위해서 Azure에 가상네트워크를 테라폼 반복문을 통해서 배포해보도록 할게요.
실습을 진행하기 위해서 사전 준비 과정이 필요합니다.
아래 내용을 완료해주세요!!
사전 준비 사항)
- Terraform 설치: Terraform 공식 홈페이지에서 운영체제에 맞는 Terraform을 설치합니다.
- Azure 계정: 실습을 위해 Azure 계정이 필요합니다.
- Azure CLI 설치 및 로그인:
- Azure CLI를 설치합니다.
- 터미널에서 az login 명령어를 실행하여 Azure 계정에 로그인합니다.
1. Terraform 프로젝트 디렉터리 및 파일 생성
cheol@MZC01-CLOUDLSC0406:/mnt/c/code/terraform_code/loop$ ls
main.tf outputs.tf variables.tf
cheol@MZC01-CLOUDLSC0406:/mnt/c/code/terraform_code/loop$ tree
.
├── main.tf
├── outputs.tf
└── variables.tf
1 directory, 3 files
1-1) main.tf
1-2) variables.tf
1-3) outputs.tf
2. 테라폼 초기화 및 배포
terraform init 명령어를 통해서 프로젝트 디렉터리를 초기화하고 Azure Provider를 다운로드 합니다.

다음으로 terraform plan 명령어를 통해서 실제 리소스가 생성되기 전에 어떤 작업이 수행될 지 미리 확인합니다.
아래 이미지를 살펴보면 빨간 박스 처럼 여러 개의 가상 네트워크가 순차적으로 생길 것을 예고하는 것을 볼 수 있습니다.

직접 Azure에 리소스를 배포해보도록 하겠습니다.
terraform apply --auto-approve 명령어를 통해서 Azure에 리소스를 배포합니다.

배포된 리소스를 Azure portal로 접속해서 확인해볼게요.
아래 이미지와 같이 정상적으로 여러개의 가상네트워크가 배포 된 것을 확인할 수 있습니다.

조건문(Conditionals)
앞서 설명했듯이, 테라폼은 선언형 언어이기 때문에 if 조건문이 작동하지 않습니다. 그러므로 terraform에서는 삼항 연산자를 활용하여 특정 조건에 따라 리소스가 생성되거나 생성되지 않도록 할 수 있습니다.
삼항 연산은 다음과 같습니다.
<조건식> ? <참일 때 값> : <거짓일 때 값>
예) var.is_prod ? 1 : 0
예와 같이 var.is_prod?1:0 문법을 해석하면, "var.is_prod가 true이면 count가 1이 되어 리소스가 생성되고, false이면 count가 0이되어 리소스가 생성되지 않습니다." 고 이해하시면 될 것 같습니다.
그럼 바로 실습으로 진행해볼게요!
실습에서의 목표는 is_prod라는 변수 값에 따라 프로덕션 환경용 Azure 스토리지 계정을 조건부로 생성합니다. is_prod가 true일 때만 스토리지 계정을 만들고, false일 때는 만들지 않는 것이 목표입니다.
1. Terraform 프로젝트 및 파일 생성
cheol@MZC01-CLOUDLSC0406:/mnt/c/code/terraform_code/conditionals$ tree
.
├── main.tf
├── outputs.tf
└── variables.tf
1 directory, 3 files
1-1) main.tf
위 코드에 대해서 간단히 설명을 하도록할게요.
"prod_storage"를 보시면 count에 var.is_prod?1:0이 있을텐데요.
그럼 일단 삼항 항목을 이해했다면 is_prod 변수가 어떻게 설정되어있는지 확인해봐야겠죠?
아래 variables.tf 파일을 확인해보면 default로 false가 설정되어 있습니다.
그럼 false는 0으로 환산되고 var.is_prod?1:0은 0이되며 count 값에는 0이 할당되게 됩니다.
결국, storage account를 생성하기 위한 "prod_storage"는 동작하지 않게되며 스토리지 계정은 생성되지 않겠죠!?
반대로, 생성하기 위해서는 variables.tf 파일의 "storage_account_id"의 default 값을 true로 변경하면 생성이 될 것입니다.
("rg" 리소스 그룹 생성을 위한 코드는 삼항 연산이 없기때문에 무조건 생성 되겠죠)
1-2) outputs.tf
1-3) variables.tf
2. 테라폼 초기화 및 배포
우선 is_prod 값을 false로 설정한 후 생성이 안되는지 확인합니다.
terraform init 및 plan을 실행하여 상황을 확인해봅니다.


위 빨간 박스에서 보이듯이,, Not create로 outputs 출력 값이 출력됩니다.
한번 terraform apply --auto-approve를 통해서 배포해볼게요! 그래도 혹시 모르니까,,

위 빨간 박스에서 보이듯이,, main.tf 파일에 있는 리소스 그룹만 생성되고 스토리지 계정은 생성되지 않았어요
Azure portal에서도 리소스 그룹만 생성된 것을 확인할수있습니다.

자,, 그럼 이제 true로 변경하고 나서 스토리지 계정이 생성되는지 다시 한번 확인해볼게요!
variables.tf 파일 코드를 변경합니다.
마찬가지로 테라폼 코드를 plan 하고 apply 해볼게요!

위 이미지와 같이 plan 했을 경우 Changes to Outputs으로 storage_account_id의 변경사항이 있을거라고 알려줍니다.
그럼, 실제로 apply를 진행해보도록 하겠습니다.

배포를 진행했을경우 stroage_account_id가 실제 스토리지 계정의 id 값을 가져와 출력되게 됩니다.
Azure portal에서도 한번 확인해볼게요!

정상적으로 Azure portal에도 제가 원하는 스토리지 계정이 배포된 것을 볼 수 있습니다.

마무리
이렇게 실습을 마무리 하도록 하겠습니다.
이번 실습을 진행하면서 선언형 언어인 IaC 테라폼에서는 어떻게 반복문과 조건문이 사용되는지 알게되었습니다.
물론, 다른 방법도 많을 것이고 해당 내용은 기초 과정이기 때문에 한번 간단하게 실습해보는 것도 좋을거라고 생각드네요!
다음 블로그에서는 좀 더 복잡한(?) 문법을 사용하여 실습을 진행해보도록 하겠습니다.
아! 실습 완료한 리소스는 terraform destroy --auto-approve 명령어로 꼭 삭제해주세요!

'Terraform' 카테고리의 다른 글
| [Terraform] Azure Cyclecloud & Managed Lustre Infra 구축 (2) | 2025.09.01 |
|---|---|
| [Terraform] 복잡한 조건문 (조건 분기) (4) | 2025.08.08 |
| [Terraform] 모듈 버전 관리 with Github (2) | 2025.08.04 |
| [Terraform] 테라폼 모듈 (2) | 2025.08.01 |
| [Terraform] 상태 파일(tfstate) 관리 (0) | 2025.07.31 |