DDetB.Log
article thumbnail
이 포스팅은 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

profile

DDetB.Log

@DDetMok

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!