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명의 유저만을 생성하는 코드다.
그런데 만약 3명의 유저를 생성하고 싶을 때는 어떻게 해야할까??
원래라면 다음과 같이 생성해야될 것이다.
동일한 코드를 3번이나 복사해야되기 때문에 굉장히 비효율적으로 보인다.
이 때, count 함수를 사용하면 다음과 같이 간단하게 표현할 수 있다.
3개의 반복적인 IAM User 를 생성해준다는 의미인데, terraform plan 을 해보자
이전에 못보던 인덱스가 생긴 것을 확인할 수 있다.
테라폼은 반복적인 리소스를 인덱스로 구분한다.
그럼 terraform apply 를 해보자
IAM User 1개는 만들어지지만, 이후 2개는 오류가 발생한다.
왜 그럴까??
이것은 테라폼의 문제가 아닌 AWS IAM User 의 특징 때문이다.
AWS 에서는 동일한 이름을 가지지 못하는 리소스가 몇 가지 있는데,
IAM User 는 계정 내 동일한 이름을 가진 2개의 리소스가 존재할 수 없다.
그 때, 테라폼의 특징인 [count.index] 배열 조회 구문을 활용하면 해결할 수 있다.
1.2. count.index 활용
이후 terraform plan 및 apply 를 입력하면 다음과 같이 성공한다.
count 가 대략 어떻게 작동하는 지 감이 왔을 것이다.
다음의 그림으로 자세하게 알아보자 !!
- count 를 사용하게 되면 해당 값만큼 테라폼 리소스를 생성하게 된다.
- 이때 테라폼은 배열을 통해 리소스를 반복 생성한다. [0, 1, 2, 3 ...]
- count.index 구문은 해당 배열에 속하는 값을 차례로 넣어주는 역할을 하게 된다.
그럼 이러한 성질을 활용하여 variable 을 통해 원하는 값을 넣어보자
2. Variable 을 통한 count 활용
2.1. variable.tf 파일 생성
user_name 변수는 list 로 구성되어 있으며 테라폼 코드를 통해 해당 값을 가진 유저를 생성할 것이다.
2.2. iam.tf 파일 수정
- length 는 user_names 에 속한 항목 개수를 나타내는 내장 함수
- Terraform plan 화면
- IAM User Name 값이 변수의 리스트 순서대로 입력된 것을 확인할 수 있다.
3. 배열 Output
count 를 사용하게 되면 리소스는 배열로 구성된다고 했다.
그렇다면 배열에서 원하는 값을 output 으로 뽑아내는 방법을 알아보자 !!
3.1. 배열 Output 사용
배열 Output 구문은 다음과 같다.
방금 만든 IAM User 의 arn 을 output 으로 출력해보자 !!
- 특정 배열의 값을 출력하고 싶으면 [ ] 안에 배열의 순서를 입력
- 모든 배열의 값을 출력하고 싶을 때는 Splat 연산자인 * 사용
이렇게 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 반복에 대해서 알아보자 !!