count 가 대략 어떻게 작동하는 지 감이 왔을 것이다. 다음의 그림으로 자세하게 알아보자 !!
count 를 사용하게 되면 해당 값만큼 테라폼 리소스를 생성하게 된다.
이때 테라폼은 배열을 통해 리소스를 반복 생성한다. [0, 1, 2, 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 반복에 대해서 알아보자 !!