2024. 8. 23. 18:51ㆍIT/d . e . v . O . p . s
목차
1. 테라폼에서 루프문 사용하기1
2. 테라폼에서 루프문 사용하기2
3. 테라폼에서 루프문 사용하기3
4. 테라폼에서 루프문 사용하기4
for_each를 사용하는 장점
1. 동적 리소스 관리
for_each
문은 컬렉션(map 또는 set)을 기반으로 리소스를 동적으로 생성, 관리 및 destroy를 가능하게 합니다. 이 동적 접근 방식을 통해 인프라는 Terraform 코드의 구성을 수동으로 업데이트하지 않고도 terraform.tfvars
에 정의된 입력변수 데이터의 변경만으로도 자동으로 구성을 변경할 수 있습니다.
예를 들어, 아래 예와 같이 프로젝트 이름 목록을 기반으로 동적 개수의 S3 버킷을 프로비저닝하기 위한 인프라 프로비저닝을 위한 IaC를 작성할 수 있습니다.
variable.tf
# variable.tf
variable "project_names" {
description = "Map of Project Names"
type = set(string)
default = []
}
terraform.tfvars
# terraform.tfvars
project_names = ["DisasterRecovery", "VPCNetworkSetup"]
main.tf
resource "aws_s3_bucket" "project_bucket" {
for_each = var.project_names
bucket = each.value
}
2. 조건부 리소스 생성
Terraform의 조건식과 결합하면, for_each
문에 의해 반복되는 데이터 내의 특정 기준에 따라 리소스를 조건부로 생성하는 데 사용할 수 있습니다. 이를 통해 어떤 리소스를 생성, 업데이트 또는 파괴할지에 대한 보다 세부적인 제어가 가능합니다.
예를 들어, 다음과 같이 create속성이 참 경우에만 S3 버킷을 생성하도록 IaC를 조정할 수도 있습니다.
variable.tf
# variable.tf
variable "bucket_configs" {
description = "Map of buckets configurations"
type = map(object({
name = string
create = bool
}))
default = {}
}
terraform.tfvars
# terraform.tfvars
buckets {
"bucket1" = {
name = "env01",
create = true
},
"bucket2" = {
name = "env02",
create = false
}
}
main.tf
resource "aws_s3_bucket" "conditional_bucket" {
for_each = { for k, v in var.bucket_configs : k => v if v.create }
bucket = each.value.name
}
3. 향상된 코드 재사용성
리소스의 각 인스턴스에 대해 리소스 블록을 복제해서 작성하는 대신, 각각에 대해 컬렉션(예: map
이나 set
)의 각 항목에 적용할 수 있는 단일 resource
(또는 modules
) 블록을 정의할 수 있습니다.
이러한 접근 방식은 공통적인 구성 요소를 단일 매개변수화된 블록으로 추상화하고, 각 리소스 인스턴스에 대한 구체적인 세부 정보는 반복되는 컬렉션에서 동적으로 파생됩니다.
예를 들어, 다음을 통합할 수 있습니다. 각각에 대해 module
을 사용하여 코드를 DRY하게 유지하세요:
variable.tf
variable "environments" {
description = "Map of environment configurations"
type = map(string({
"dev" = string
"prod" = string
}))
default = {}
}
terraform.tfvars
environments = {
"dev" = "ami-02d3fd86e6a2f5122",
"prod" = "ami-0ce2cb35386fc22e9",
}
main.tf
module "dry_module_ec2" {
for_each = var.environments
source = "terraform-aws-modules/ec2-instance/aws"
ami = each.value
instance_type = "t2.micro"
}
자주 묻는 질문
Q. Terraform에서 for_each와 count를 같은 리소스에 사용할 수 있나요?
아니요,for_each
와 count
는 동일한 리소스 또는 모듈 블록 내에서 함께 사용할 수 없습니다. 사용할 때 필요에 따라 하나를 선택해야 합니다.
count
문은 지정된 수의 동일한 리소스를 생성하는 데 사용되는 반면 for_each
는 map
이나 set
의 항목을 반복하여 서로 다른 구성으로 여러 리소스를 생성할 때 사용됩니다.
Q. Terraform에서 count.index의 용도는 무엇인가요?
Terraform에서는 count
문이 사용되는 블록에서 생성된 리소스의 0부터 시작하는 인덱스로 시작하는 내장 변수가 있는데 이 인덱스를 호출하는 것이 count.index
입니다.
이는 count
문에 의해 여러 개의 인스턴스 리소스를 만들때 각 개별의 인스턴스의 숫자 식별자를 사용하여 카운트하거나 구별해야 할 때 주로 사용됩니다.
Q. for_each를 모듈과 함께 사용할 수 있나요?
예, for_each
문은 Terraform 모듈과 함께 사용할 수 있으며, map
이나 set
의 항목을 기반으로 모듈의 여러 인스턴스를 만들 수 있습니다. module
에서 for_each
문을 사용할 때 반복하려는 값은 컬렉션(map
또는 set
) 정의된 항목의 속성을 참조하여 리소스를 생성할 수 있습니다.
Q. count를 사용하여 리소스를 조건부로 생성할 수 있나요?
예, count
문은 Terraform에서 리소스를 조건부로 생성하는 데 사용할 수 있습니다. count
문을 활용하여 조건에 따라 리소스를 생성할지 여부를 지정할 수 있습니다. 예를 들어, 조건문을 사용하여 해당 조건이 true
이면 리소스의 단일 인스턴스를 생성하고 false
이면 리소스를 생성하지 않습니다.
Q. count에서 for_each로 마이그레이션하는 것이 가능합니까?
네, count
문에서 for_each
문으로 마이그레이션이 가능합니다. 하지만, 이 프로세스에는 신중한 계획과 실행이 필요합니다.
'IT > d . e . v . O . p . s' 카테고리의 다른 글
테라폼에서 루프문 사용하기3 (0) | 2024.08.23 |
---|---|
테라폼에서 루프문 사용하기2 (0) | 2024.08.23 |
테라폼에서 루프문 사용하기1 (0) | 2024.08.23 |
ec2인스턴스 기동/정지 스케쥴링 (0) | 2023.07.11 |
테라폼에서 aws_caller_identity는 어디에 쓰이나요? (0) | 2022.06.17 |