2024. 8. 23. 18:48ㆍIT/d . e . v . O . p . s
목차
1. 테라폼에서 루프문 사용하기1
2. 테라폼에서 루프문 사용하기2
3. 테라폼에서 루프문 사용하기3
4. 테라폼에서 루프문 사용하기4
for_each의 실제 사용 사례
1. 리소스 체이닝
리소스 체이닝은 한 리소스의 구성이 다른 리소스의 출력에 따라 달라지는 리소스 간 종속성을 만드는 것을 포함합니다. 이는 특정 리소스를 순차적으로 프로비저닝해야 하는 인프라 설정에서 일반적입니다.
리소스 체이닝을 더 잘 이해하기 위해 VPC를 설정하고 VPC 내에 서브넷을 배포하는 일반적인 시나리오를 살펴보겠습니다.
variable.tf
# variable.tf
variable "networks" {
description = "Map of networks configurations"
type = map(string({
cidr = string
}))
default = {}
}
terraform.tfvars
# terraform.tfvars
networks {
"network1" = {
cidr = "10.0.1.0/24"
},
"network2" = {
cidr = "10.0.2.0/24"
}
}
main.tf
resource "aws_vpc" "main" {
for_each = var.networks
cidr_block = each.value.cidr
tags = {
Name = "VPC-${each.key}"
}
}
resource "aws_subnet" "subnets" {
for_each = var.networks
vpc_id = aws_vpc.main[each.key].id
cidr_block = each.value.cidr
availability_zone = "us-west-2a"
tags = {
Name = "Subnet-${each.key}"
}
}
이 예제에서 각 VPC는 network map
을 기반으로 생성되고, 그런 다음 각 VPC 내에 서브넷을 생성합니다.
aws_subnet 리소스는 aws_vpc
블럭의 ID를 참조하여 같은 방식으로 for_each
루프를 돌며 서브넷을 생성합니다.
2. 태깅 리소스를 동적으로 할당하기
동적 태그를 사용하면 구성의 설정이나 기타 동적 입력을 기반으로 리소스에 메타데이터를 할당하여 리소스 관리, billing 및 자동화를 개선할 수 있습니다.
다음을 for_each
문을 사용하여 s3 버킷을 동적으로 태그 지정하는 예를 들어 보겠습니다.
variable.tf
# variable.tf
variable "buckets" {
description = "Map of buckets configurations"
type = map(string({
name = string
tags = map(string)
}))
default = {}
}
terraform.tfvars
# terraform.tfvars
buckets {
"bucket1" = {
name = "app-logs",
tags = {
"Environment" = "Production",
"Application" = "Logging",
}
},
"bucket2" = {
name = "app-data",
tags = {
"Environment" = "Staging",
"Application" = "DataStore",
}
}
}
main.tf
resource "aws_s3_bucket" "app_bucket" {
for_each = var.buckets
bucket = each.value.name
tags = each.value.tags
}
이 예제에서는 bucket map
에서 정의된 태그를 기반으로 각 S3 버킷에 동적으로 태그를 적용합니다.
3. 여러 region에 리소스 배포
여러 region에 리소스를 배포하면 재해 복구를 향상하고 지연 시간을 줄일 수 있습니다.for_each
문은 이러한 배포를 효율적으로 관리하는 데 사용할 수 있습니다.
아래의 예와 같이 for_each
문을 사용하여 여러 region에 s3 버킷을 배포할 수 있습니다.
provider.tf
provider "aws" {
alias = "useast1"
region = "us-east-1"
}
provider "aws" {
alias = "apnortheast1"
region = "ap-northeast-1"
}
variable.tf
variable "regions" {
description = "Regions to deploy S3 buckets"
type = map(string({
"us-east-1" = string
"ap-northeast-1" = string
}))
default = {}
}
terraform.tfvars
regions = {
"us-east-1" = "env0-app-us-east-1",
"ap-northeast-1" = "env0-app-ap-northeast-1"
}
main.tf
# 멀티 리전 s3버킷 생성
resource "aws_s3_bucket" "multi_region_buckets" {
for_each = var.regions
bucket = each.value
provider = each.key == "us-east-1" ? aws.useast1 : aws.apnortheast1
}
이 예제에서 S3 버킷은 us-east-1
그리고 ap-northeast-1
두 region 모두에서 생성됩니다. provider
속성은 region이 정의되어진 map
콜렉트를 for_each
로 루프를 돌며 provider
의 key
값을 기준으로 올바른 제공자를 동적으로 선택하여 리소스를 생성합니다.
'IT > d . e . v . O . p . s' 카테고리의 다른 글
테라폼에서 루프문 사용하기4 (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 |