새소식

IaC/Terraform

5주차(1)_Terraform 반복문_count

  • -
CloudNet@ 팀의 가시다님께서 Leading 하시는 Terraform T101 Study 내용 요약

 

해당 Terraform Study 는 Terraform Up and Running 책을 기반으로 진행 중입니다.

 

테라폼에는 반복되는 여러 리소스를 한 번에 배포할 수 있도록 count, for, for_each 등의 반복문을 제공하고 있다.
이번 포스팅에서는 테라폼 반복문 중 count 에 대해서 알아보자!



1. Count ??


Count 는 테라폼에서 지정한 개수의 리소스를 반복 생성해주는 매개 변수

모든 테라폼 리소스는 count 매개 변수를 지닐 수 있다.

 

1.1. count 사용법

다음과 같이 IAM 유저를 생성하는 코드가 존재한다고 치자.
아래의 코드는 1명의 유저만을 생성하는 코드다.


provider "aws" {
  region = "us-east-2"
}

resource "aws_iam_user" "example" {
  name = "scott"
}

 

그런데 만약 3명의 유저를 생성하고 싶을 때는 어떻게 해야할까??

원래라면 다음과 같이 생성해야될 것이다.


provider "aws" {
  region = "us-east-2"
}

resource "aws_iam_user" "example1" {
  name = "scott.1"
}

resource "aws_iam_user" "example2" {
  name = "scott.2"
}

resource "aws_iam_user" "example3" {
  name = "scott.3"
}

 

동일한 코드를 3번이나 복사해야되기 때문에 굉장히 비효율적으로 보인다.
이 때, count 함수를 사용하면 다음과 같이 간단하게 표현할 수 있다.


resource "aws_iam_user" "example" {
  count = 3
  name  = "scott"
}

 

3개의 반복적인 IAM User 를 생성해준다는 의미인데, terraform plan 을 해보자

이전에 못보던 인덱스가 생긴 것을 확인할 수 있다.
테라폼은 반복적인 리소스를 인덱스로 구분한다.

 

그럼 terraform apply 를 해보자

IAM User 1개는 만들어지지만, 이후 2개는 오류가 발생한다.
왜 그럴까??

 

이것은 테라폼의 문제가 아닌 AWS IAM User 의 특징 때문이다.

 

AWS 에서는 동일한 이름을 가지지 못하는 리소스가 몇 가지 있는데,
IAM User 는 계정 내 동일한 이름을 가진 2개의 리소스가 존재할 수 없다.

 

그 때, 테라폼의 특징인 [count.index] 배열 조회 구문을 활용하면 해결할 수 있다.

 

1.2. count.index 활용

  • 기존 IAM 코드를 다음과 같이 변경해보자

resource "aws_iam_user" "example" {
  count = 3
  name  = "scott.${count.index}"
}

 

이후 terraform plan 및 apply 를 입력하면 다음과 같이 성공한다.

 

count 가 대략 어떻게 작동하는 지 감이 왔을 것이다.
다음의 그림으로 자세하게 알아보자 !!

 

  1. count 를 사용하게 되면 해당 값만큼 테라폼 리소스를 생성하게 된다.
  2. 이때 테라폼은 배열을 통해 리소스를 반복 생성한다. [0, 1, 2, 3 ...]
  3. count.index 구문은 해당 배열에 속하는 값을 차례로 넣어주는 역할을 하게 된다.

 

그럼 이러한 성질을 활용하여 variable 을 통해 원하는 값을 넣어보자



2. Variable 을 통한 count 활용


2.1. variable.tf 파일 생성

// variables.tf 내용

variable "user_names" {
  description = "Create IAM users with these names"
  type        = list(string)
  default     = ["terraform", "aws", "local"]
}
user_name 변수는 list 로 구성되어 있으며 테라폼 코드를 통해 해당 값을 가진 유저를 생성할 것이다.

 

2.2. iam.tf 파일 수정

  • length 는 user_names 에 속한 항목 개수를 나타내는 내장 함수
// iam.tf 내용

resource "aws_iam_user" "example" {
  count = length(var.user_names)
  name  = var.user_names[count.index]
}
  • Terraform plan 화면
  • IAM User Name 값이 변수의 리스트 순서대로 입력된 것을 확인할 수 있다.



3. 배열 Output


count 를 사용하게 되면 리소스는 배열로 구성된다고 했다.
그렇다면 배열에서 원하는 값을 output 으로 뽑아내는 방법을 알아보자 !!

 

3.1. 배열 Output 사용

배열 Output 구문은 다음과 같다.

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

 

방금 만든 IAM User 의 arn 을 output 으로 출력해보자 !!

  • 특정 배열의 값을 출력하고 싶으면 [ ] 안에 배열의 순서를 입력
  • 모든 배열의 값을 출력하고 싶을 때는 Splat 연산자인 * 사용

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

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

 

이렇게 count 를 통해 리소스를 반복 생성하고 output 으로 출력하는 방법을 알아보았다.

그렇다면 count 를 사용할 때 주의사항은 무엇일까??



4. count 한계


4.1. 인라인 블록 사용 불가

count 는 테라폼의 모든 리소스에서 사용 가능하지만, 리소스 내 인라인 블록에서는 사용이 불가하다.

  • 아래와 같은 구문을 인라인 블록이라고 지칭한다.

 

4.2. count 로 생성한 리소스 수정 시 문제 발생

count 로 만든 리소스는 1:1 매핑되는 관계가 아니다.

 

앞서 variable.tf 을 통해서 IAM User 를 생성했다.
이 때, 우리는 다음과 같이 1번 terraform , 2번 aws , 3번 local 이라고 인식하게된다.

 

이 때, 2번 aws 를 삭제하면 어떻게 될까??

 

2번 aws 만 삭제되고 3번 local 은 남아있을 것이라고 착각하기 쉽다.
테라폼은 인덱스 번호를 식별자로 보기 때문에 다음과 같이 리소스가 변화한다.

 

  • Plan 을 통해 출력되는 값을 보면 더 자세하게 알 수 있다.

  • 즉, count 중간 항목을 제거하면 해당 항목 뒤의 모든 리소스의 순서가 하나씩 당겨지는 것이다.

 

이 문제를 해결하기 위한 것이 for_each 반복 !!

 


 

이번 포스팅에서는 테라폼 count 매개 변수가 어떻게 작동하는 지, 어떻게 활용할 수 있는 지 알아보았다.

다음 포스팅에서는 인라인 블록에서도 사용가능한 for_each 반복에 대해서 알아보자 !!

 

 

Contents

포스팅 주소를 복사했습니다