이 포스팅은 CloudNet@ 팀이 진행하는 테라폼 기초 입문 스터디에 참여하며 ‘테라폼으로 시작하는 IaC’ 책을 기준하여 정리한 글입니다.
도전과제
과제1 - Data Sources
특정 리전 내에서 사용 가능한 가용영역을 데이터 소스를 통해 가져온 목록으로 VPC 리소스 생성
예제코드
data "aws_availability_zones" "available" {
state = "available"
}
resource "aws_subnet" "primary" {
availability_zone = data.aws_availability_zones.available.names[0]
# e.g. ap-northeast-2a
}
resource "aws_subnet" "secondary" {
availability_zone = data.aws_availability_zones.available.names[1]
# e.g. ap-northeast-2b
}
1. 데이터 소스 정의 후 생성
data "aws_availability_zones" "available" {
state = "available"
}
2. 실행
$ terraform init && terraform plan && terraform apply -auto-approve
3. console을 통해 데이터 소스 확인
$ terraform state list
data.aws_availability_zones.available
$ terraform console
> data.aws_availability_zones.available
{
"all_availability_zones" = tobool(null)
"exclude_names" = toset(null) /* of string */
"exclude_zone_ids" = toset(null) /* of string */
"filter" = toset(null) /* of object */
"group_names" = toset([
"ap-northeast-2",
])
"id" = "ap-northeast-2"
"names" = tolist([
"ap-northeast-2a",
"ap-northeast-2b",
"ap-northeast-2c",
"ap-northeast-2d",
])
"state" = "available"
"timeouts" = null /* object */
"zone_ids" = tolist([
"apne2-az1",
"apne2-az2",
"apne2-az3",
"apne2-az4",
])
}
> data.aws_availability_zones.available.id
"ap-northeast-2"
> data.aws_availability_zones.available.names
tolist([
"ap-northeast-2a",
"ap-northeast-2b",
"ap-northeast-2c",
"ap-northeast-2d",
])
4. 코드 수정
main.tf
data "aws_availability_zones" "available" {
state = "available"
}
resource "aws_vpc" "vpc" {
cidr_block = "10.10.0.0/16"
tags = {
Name = "vpc"
}
}
resource "aws_subnet" "subnet1" {
# ap-northeast-2a
vpc_id = aws_vpc.vpc.id
cidr_block = "10.10.1.0/24"
availability_zone = data.aws_availability_zones.available.names[0]
tags = {
Name = "subnet1"
}
}
resource "aws_subnet" "subnet2" {
# ap-northeast-2b
vpc_id = aws_vpc.vpc.id
cidr_block = "10.10.2.0/24"
availability_zone = data.aws_availability_zones.available.names[1]
tags = {
Name = "subnet2"
}
}
5. 실행 및 확인
$ terraform apply -auto-approve
...
$ terraform state list
data.aws_availability_zones.available
aws_subnet.subnet1
aws_subnet.subnet2
aws_vpc.vpc
과제2 - EC2 + SG + VPC
TBA
과제3 - Input Variables & 과제 5 - 반복문
입력변수와 반복문을 활용해서 리소스 배포(응용을 위해 과제5를 함께 수행)
w/ count
과제1에서 사용한 코드를 활용하여 Input Variable과 Count를 함께 적용
variable "subnets" {
default = [
{
name = "subnet1"
cidr_block = "10.10.1.0/24"
availability_zone = "ap-northeast-2a"
},
{
name = "subnet2"
cidr_block = "10.10.2.0/24"
availability_zone = "ap-northeast-2b"
},
]
}
resource "aws_vpc" "vpc" {
cidr_block = "10.10.0.0/16"
tags = {
Name = "vpc"
}
}
resource "aws_subnet" "subnets" {
count = 2
vpc_id = aws_vpc.vpc.id
cidr_block = var.subnets[count.index].cidr_block
availability_zone = var.subnets[count.index].availability_zone
tags = {
Name = var.subnets[count.index].name
}
}
=> variable은 list type 내의 map type이 들어있는 형태로 작성
=> count 인덱스를 통해 리스트 내의 n번째 변수를 특정하여 반복적인 리소스 생성에 활용
w/ for_each
variable "subnets" {
default = {
subnet1 = {
name = "subnet1"
cidr_block = "10.10.1.0/24"
availability_zone = "ap-northeast-2a"
},
subnet2 = {
name = "subnet2"
cidr_block = "10.10.2.0/24"
availability_zone = "ap-northeast-2b"
},
}
}
resource "aws_vpc" "vpc" {
cidr_block = "10.10.0.0/16"
tags = {
Name = "vpc"
}
}
resource "aws_subnet" "subnets" {
for_each = var.subnets
vpc_id = aws_vpc.vpc.id
cidr_block = each.value.cidr_block
availability_zone = each.value.availability_zone
tags = {
Name = each.value.name
}
}
=> for_each는 인덱스가 없어 이중 map 타입으로 변수를 수정
과제4 - Local Values & 과제 5 - 반복문
Local Value와 반복문을 활용해서 리소스 배포(응용을 위해 과제5를 함께 수행). for문과 dynamic의 경우, 리소스 생성을 위한 반복이 아니라 블록 내의 반복 작성 혹은 값의 형태를 변환할 때 사용하는 구문.
w/ for
variable "alphabets" {
default = ["a", "b", "f", "h", "q", "u"]
}
locals {
even = [
for idx, alphabet in var.alphabets : alphabet
if idx % 2 == 1
]
odd = [
for idx, alphabet in var.alphabets : alphabet
if idx % 2 == 0
]
}
=> 6개의 알파벳으로 구성된 리스트 변수를 local value인 even 과 odd에 필터링하는 코드
=> 조건문을 통해 true 인 경우만 각각의 리스트에 반환하는 형태로 동작
w/ dynamic
TBA
'DevOps > Terraform' 카테고리의 다른 글
Terraform 기본 사용 (7) - terraform_data & moved blocks (0) | 2023.07.22 |
---|---|
Terraform 기본 사용 (6) - 조건문 & 함수 & 프로비저너 (0) | 2023.07.17 |
Terraform 기본 사용 (4) - Local & Output & 반복문 (2) | 2023.07.10 |
Terraform 기본 사용 (3) - Data Sources & Variable (0) | 2023.07.10 |
Terraform 기본 사용 (2) (0) | 2023.07.09 |