베하 - ! 안녕하세요 BTC 콩순이들입니다!
계속해서 Terraform 을 톺아보도록 하겠습니다 ㅎㅎㅎ

이번주는 Terraform 이 지원하는 Terraform Meta-Argument에 대해 알아보기로 할텐데요 !
필요에 따라 실습도 함께 해보며 이해해보도록 합시다 !!
그럼 시작할게요 -!
Terraform 에는 각각의 resource를 생성하려면 resource 블록 안에 각각 다른 Arguments 를 선언할 수 있습니다.
aws 인프라로 예를 들어보면 ,
이렇게 ami, instance_type 등 특정 리소스에만 국한적인 Arguments가 대부분입니다.
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
tags = { Name = "HelloWorld" }
}
이와 달리 모든 resource가 공통적으로 사용 할 수 있는 Arguments를 Meta-Arguments 라고 합니다.
Meta-Arguments 에는 총 5개의 인수가 있는데
- depends_on
- count
- for_each
- provider
- lifecycle
이렇게 나누어 볼 수 있습니다.
그 중 처음으로 우리가 알아 볼 인수는 바로바로
Count 인수 입니다!!

그럼 먼저 Count 인수가 어떤 역할을 해주는지 알아볼까요 ?
Count 인수를 사용하면 Count로 설정한 값만큼 리소스 블록이나 모듈 블록이 생성되어 해당하는 인스턴스를 한 번에 다룰 수 있습니다. 예를 들어, 일정 개수의 컴퓨팅 인스턴스를 관리하고 싶을 때, count를 사용하여 여러 개의 인프라 오브젝트를 한 번에 생성할 수 있습니다.
예를들어 aws Subnet을 만들 때 , 총 4개의 routetable이 필요하다 !
그러면 count문을 사용하여 하나의 resource 블록으로 8개의
routetable을 한번에 생성할 수 있습니다 !
그럼 어떻게 코드를 구성할 수 있는지 코드로 보여드리겠습니다 ~~~ !
resource "aws_route_table" "main_private" {
count = "${length(var.availability_zone)}"
vpc_id = aws_vpc.main.id
tags = {
Name = "${var.name_tag}-rtb-pri-${count.index + 1}"
Owner = var.owner_tag }
}
resource 블록 안에 count는 var.availability_zone 변수에서 사용 가능한 가용 영역(Availability Zone) 수와 동일합니다.
즉, 조건부로 생성되는 리소스 수는 가용 영역 수와 같습니다. 여기서 length() 함수는 var.availability_zone 리스트의 길이, 즉 가용 영역 수를 반환합니다.
결국 코드를 변수와 함께 호출된 모듈을 실행하면 지정한 availability_zone의 개수만큼 routetable이 생성됩니다.
특히 인스턴스, subnet 등 대.량.생.산이 필요할 때 count 문을 쓰면 정말 간편하겠죠 !!?
(분신술,,,)

여기서 tags Name에는 count.index + 1 이라 되어 있는데 이건 무슨 뜻일까 궁금하신 분들 계실텐데요 !
count 문을 사용해 리소스를 생성하게 되면 0부터 시작하는 배열과 비슷한 형태를 갖습니다.
따라서 특정 인덱스의 리소스를 접근하려면 반드시 인덱스를 0부터 시작하여 작성해야 합니다.
예를 들어, count 인수 값이 3이고 aws_route_table 리소스의 이름이 main_private인 경우, 생성된 리소스는 aws_route_table.main_private[0], aws_route_table.main_private[1], aws_route_table.main_private[2]와 같이 각각의 인덱스를 가지게 됩니다.
이처럼 Terraform에서 접근할 수 있는 리소스는 배열과 비슷한 형태, 즉 "튜플(tuple)" 형태로 생성되며, 인덱스는 0부터 시작합니다.
결국 count.index + 1 이라고 함은, 첫 번째 생성된 리소스 [0]번에 1을 더해 이름에 rtb-pri-1 이런식으로 숫자가 만들어질 수 있도록 하는 역할을 하게 됩니다! 이렇게 하면 반복된 리소스를 생성할 때 좀더 쉽고 간편하게 생성할 수 있습니당!!!
(yeah -!)

오늘 Terraform 에서 사용할 수 있는 Meta-Argument 중 Count 인수를 알아보았습니다 !
하지만 이 Count 인수에는 조금 불편한 단점이 하나 있는데요 !
반복해서 만들 수 는 있지만 그 개수가 늘어나면 늘어날수록 관리가 굉장히 어렵습니다.. 그 이유는 다음과 같습니다.
count는 인덱스 형태로 관리하기 때문에 만약 0~9의 리소스 중 4번째 생성된 리소스가 빠지면
0123 56789 여기 56789 값이 앞으로 당겨지며 다시 리소스를 생성하는 문제점이 생깁니다ㅠ_ㅠ
이 치명적인 문제점을 해결할 방법 !!!!
다음시간에 들고 오도록 하겠습니다 -!
그럼 오늘도 유익한 시간이 되셨길 바라며 !!!!!
베빠 ! -
'INFRA > Automation' 카테고리의 다른 글
[Terraform] Meta-Argument 2 . for_each문 (0) | 2023.06.30 |
---|---|
[Terraform] 모듈과 모듈화 (0) | 2023.06.22 |
Terraform Remote State (S3편) (0) | 2023.05.26 |
[Terraform] Terraform module (0) | 2023.05.21 |
[Terraform] Terraform 환경구성 (0) | 2023.05.12 |
댓글