Ssoon

[5주차] 05 테라폼의 팁과 요령 (1) 반복문 - count 본문

Terraform 101 Study

[5주차] 05 테라폼의 팁과 요령 (1) 반복문 - count

구구달스 2022. 11. 14. 22:56
CloudNet@ 팀의 가시다님이 진행하는 Terraform 101 Study 05주차 정리입니다.
 

GitHub - kschoi728/T101: Terraform 101 Study

Terraform 101 Study. Contribute to kschoi728/T101 development by creating an account on GitHub.

github.com

  • count parameter(매개변수) : resources 와 modules 반복
  • for_each expressions(표현식) : resources 와 module 내에서 resources 및 Inline Block 반복
  • for expressions(표현식) : lists 와 maps 을 반복
  • for string directive(지시문) : string(문자열) 내에서 lists 와 maps 반복

1️⃣ count Parameter 을 이용한 반복

  • 모든 테라폼 resource 에는 count 라는 meta-parameter 가 있습니다.
  • count 에 생성하고자 하는 resource 의 copy(사본) 수를 정의합니다.

live/global/existing-iam-user/main.tf 

   👉 count 를 사용하여 3명의 IAM 사용자를 생성합니다. 

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

resource "aws_iam_user" "existing_user" {
  count = 3
  name = "Ssoon"
}

   😫 3명의 IAM 사용자가 모두 같은 이름으로 오류가 발생합니다.

 

count.index 를 사용하여 반복문 안에 있는 각각의 반복(iteration)을 가리키는 index 을 가져올 수 있습니다.

${count.index}

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

resource "aws_iam_user" "existing_user" {
  count = 3
  name = "Ssoon.${count.index}"
}

 

📢 CLI 확인

   👉 Ssoon.0 , Ssoon.1 , Ssoon.2 가 생성됩니다.

 live/global/three-iam-users-unique-names/variables.tf

variable "user_names" {
  description = "Create IAM users with these names"
  type        = list(string)
  default     = ["APEACH", "CHUN-SIK", "RYAN"]
}

Array lookup (배열 조회) Syntax(구문)

ARRAY[<INDEX>]

    👁‍🗨 var.user_names 의 index 1에서 element(요소)를 찾는 방법입니다.

var.user_names[1]

 

 length함수 는 주어진 ARRAY 의 항목 수를 반환합니다. strings(문자열) 및 maps 을 대상으로 동작합니다.

length(<ARRAY>)

 live/global/three-iam-users-unique-names/main.tf

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

resource "aws_iam_user" "main" {
  count = length(var.user_names)
  name  = var.user_names[count.index]
}

📢 CLI 확인

 

resource 에 count 를 사용한 후에는 하나의 리소스가 아니라 resource 의 array(배열) 이 됩니다. -> array(배열) 조회 구문을 이용해 array(배열)에서 index를 지정함으로써 IAM 사용자를 명시합니다.

<PROVIDER>_<TYPE>.<NAME>[INDEX].ATTRIBUTE

    👁‍🗨 IAM 사용자 중 하나의 ARN [0] 을 출력 변수로 제공하려면 다음과 같이 작성합니다.

aws_iam_user.main[0].arn

 live/global/three-iam-users-unique-names/outputs.tf

output "first_arn" {
  value       = aws_iam_user.main[0].arn
  description = "The ARN for the first user"
}

    👁‍🗨 IAM 사용자 전체의 ARN 을 원하면 splat (*) 를 사용합니다.

aws_iam_user.main[*].arn

output "all_arns" {
  value       = aws_iam_user.main[*].arn
  description = "The ARNs for all users"
}

📢 CLI 확인

 

count 제약사항 

1️⃣ resource 내에서 Inline Block 을 반복할 수 없습니다.

  ❓ Inline Block 이란

2️⃣ count 를 사용하여 resource 목록을 만들 때에마다 목록 중간에서 항목을 제거하면 테라폼은 해당 항목 뒤에 있는 모든 resource 를 삭제한 다음 해당 리소스를 처음부터 다시 만듭니다. 

  •  IAM 사용자 목록에서 하나("CHUN-SIK") 를 제거 후 terraform plan 을 실행합니다.

📢 CLI 확인

  • "CHUN-SIK" 이 삭제되지 않고 "RYAN" 으로 변경되고 "RYAN"은 삭제됩니다.
  • Arry 의 중간에서 항목을 제거하면 모든 항목은 1칸씩 앞으로 당겨집니다.
  • 테라폼이 index 번호를 resource 식별자로 보기 때문에
    • index 1 에서는 버킷을 "CHUN-SIK" 에서 "RYAN" 로 변경하고
    • index 2에서는 버킷을 삭제한다 로 해석합니다.

 

 

 

 
Comments