본문 바로가기
terraform

[terraform] 테라폼 count, 조건문, 반복문, dynamic, for_each, lookup 사용법

by devjh 2022. 5. 24.
반응형

이번게시글에서는 count, 조건문, 반복문 사용법을 정리합니다.

s3 bucket만 사용한 예제입니다.

1. count 사용법

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_s3_bucket" "this" {
  count = 3
  bucket = "frozen-bucket-${count.index}"
}

count라는 필드는 내부적으로 반복되는 특징이 있어서 이런식으로 사용하게되면 버킷이 3개 생성되게 됩니다.

(아래의 상황에 직면할 가능성이 조금이라도 존재한다면 count로 resource를 관리하는것은 추천하지 않습니다)

 

[terraform] resource를 여러개 생성하는법(count보다는 module과 for_each)

이번 게시글에서는 resource를 여러개 생성하는 방법에 대해 정리합니다. 테라폼에 익숙하지 않다면 count를 사용하기 쉬운데 좋은 방법이 아닙니다. 잘못된 예시와 올바른 예시를 정리합니다. 이

frozenpond.tistory.com

2. count를 활용하여 조건문처럼 사용하기

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_s3_bucket" "this" {
  count = var.needBucket? 1 : 0
  bucket = "frozen-bucket"
}

variable "needBucket" {
  type = bool
  default = false
}

count에 삼항연산자를 사용하여 1이나 0을 줬습니다.

needBucket이 true면 버킷이 한개 만들어지고, false라면 count가 0이 되어 해당 블록은 동작하지 않게 됩니다.

 

3. dynamic과 foreach

resource "aws_s3_bucket" "this" {
  bucket = "frozend-bucket"
  lifecycle_rule {
    enabled = true
    id = "first_rule"
  }
  lifecycle_rule {
    enabled = true
    id = "second_rule"
  }
}

해당 버킷을 관리하는 lifecycle_rule을 두개 만들어줄 예정입니다.(이름만 있는 rule 입니다)

count를 사용하면 resource 자체가 여러개가 되게 할 수는 있지만 내부 블락을 여러개 만들때 사용하기에는 적절하지 않습니다.

 

이럴때 dynamic을 사용합니다.

resource "aws_s3_bucket" "this" {
  bucket = "frozen-bucket"
  dynamic "lifecycle_rule" {
    for_each = var.my_lifecycle_rule
    content {
      id      = lifecycle_rule.value["id"]
      enabled = lifecycle_rule.value["enabled"]
    }
  }
}

variable "my_lifecycle_rule" {
  default = [
    {
      id : "first_rule",
      enabled = true,
    },
    {
      id : "second_rule",
      enabled = true
    }
  ]
}

 

루프를 돌려야하므로 외부는 list 내부에는 map으로 넣는게 일반적입니다.

 

4. lookup

hashmap의 자료구조를 사용할때는 key가 있는지 검증해줘야 합니다.

누군가 variable을 사용할때 enabled 필드를 빼먹었다면 python이라면 아래의 소스코드의 과정이 필요합니다.

# python
for my_lifecycle_rule in my_lifecycle_rules:
  if "enabled" not in my_lifecycle_rule.keys():
    my_lifecycle_rule["enabled"] = true

테라폼코드에서는 lookup을 사용합니다.

resource "aws_s3_bucket" "this" {
  bucket = "rookie-terraform-bucket"
  dynamic "lifecycle_rule" {
    for_each = var.my_lifecycle_rule
    content {
      id      = lifecycle_rule.value["id"]
      // key를 빼먹은경우 default를 true로 지정하겠습니다.
      enabled = lookup(lifecycle_rule.value, "enabled", true)
    }
  }
}

variable "my_lifecycle_rule" {
  default = [
    {
      id : "first_rule",
      enabled = true,
    },
    {
      id : "second_rule",
      // 누군가 enabled를 빼먹은상황
    }
  ]
}

 

 

반응형

댓글