본문 바로가기
INFRA/Automation

[Terraform] Meta-Argument 1 . Count문

by BTC_쭈콩 2023. 6. 13.

 

베하 - ! 안녕하세요 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

댓글