다이나믹 블록은 설정이 복잡하거나 조건에 따라 변할 수 있는 리소스 속성을 효율적으로 관리하기 위해 사용된다.
📌 서론
우리 팀은 프로젝트에서 3개의 ECS 클러스터를 사용하고 각각 1개씩 ECS서비스를 운영하고 있다. 이 중 2개는 오토 스케일링 그룹(ASG)을 사용하는 반면, 나머지 하나는 ASG를 사용하지 않고 있다. 이런 다양한 설정을 테라폼 코드로 표현하고 싶었는데, 굳이 두 가지 다른 ECS 서비스 모듈을 만들고 싶지는 않았다.
이런 상황에서 테라폼의 유연성을 최대한 활용할 방법이 무엇일까 고민하던 중, 테라폼의 'dynamic 블록'이라는 기능을 발견했다. 이 기능을 사용하면 하나의 모듈 안에서도 조건에 따라 다른 설정을 동적으로 적용할 수 있게 된다. 예를 들어, ASG를 사용하는 경우와 사용하지 않는 경우를 동일한 ECS 서비스 모듈 안에서 구분하여 처리할 수 있다.
결과적으로, dynamic 블록을 사용함으로써 테라폼 코드의 중복을 줄이면서도, 서로 다른 설정을 가진 ECS 서비스들을 효율적으로 관리할 수 있게 되었고 그 내용을 소개한다.
1. 다이나믹 블록(Dynamic Block) 이해하기
1-1. 다이나믹 블록이란?
- 다이나믹 블록은 Terraform HCL(HashiCorp Configuration Language)에서 반복되는 구조를 좀 더 간결하게 만들어주는 문법이다. 이것을 사용하면 코드의 반복을 줄이고, 가독성을 향상시킬 수 있다. 주로 반복되는 리소스 설정이나 조건에 따라 달라지는 구성 요소에 적합하다.
1-2. 왜 다이나믹 블록을 사용하는가?
- 가변성 있는 설정 관리:
- 리소스의 특정 속성이 실행 시점이나 환경에 따라 달라질 때, 다이나믹 블록을 사용해서 이를 효율적으로 처리할 수 있다.
- 리소스의 특정 속성이 실행 시점이나 환경에 따라 달라질 때, 다이나믹 블록을 사용해서 이를 효율적으로 처리할 수 있다.
- 코드의 간결함과 유지 관리 향상:
- 비슷한 구조의 코드를 여러 번 반복 작성할 필요 없이, 한 번의 선언으로 다양한 경우를 처리할 수 있어서 코드가 간결해지고, 유지 관리가 용이해진다.
- 비슷한 구조의 코드를 여러 번 반복 작성할 필요 없이, 한 번의 선언으로 다양한 경우를 처리할 수 있어서 코드가 간결해지고, 유지 관리가 용이해진다.
- 조건부 리소스 생성:
- 특정 조건에 따라 리소스의 일부를 생성하거나 생략해야 할 경우에 유용하다. 예를 들어, 특정 변수의 값에 따라 리소스의 세부 설정을 추가하거나 빼는 것이 가능하다.
1-3. 다이나믹 블록을 적용한 나의 코드
- 내가 작성한 테라폼 코드를 보면 'capacity_provider_strategy'와 'load_balancer'에 대한 설정이 다이나믹 블록으로 정의되어 있다. 이렇게 함으로써, 해당 변수들이 'null'이 아닐 때만 해당 설정 블록을 포함시키는 조건부 구성이 가능해진다.
- 예를 들어, 'var.capacity_provider_name'이 'null'이 아니면, 'capacity_provider_strategy' 블록이 생성되고, 'null'이면 해당 블록은 생성되지 않는다. 이런 식으로 동적으로 리소스의 구성을 변경할 수 있다.
이렇게만 봐서는 다이나믹 블록이 어떻게 동작하는지 이해하기 어려울 것이다.
지금부터 조금 더 깊게 다이나믹 블록의 동작을 이해해 보자
2. 다이나믹 블록(Dynamic Block) 코드 분석
2-1. 다이나믹 블록의 삼항 연산자 이해하기
- Terraform 코드에서 dynamic 블록 내의 for_each 구문은 capacity_provider_strategy 설정을 동적으로 생성하는 데 사용되고 있다. 여기서 for_each 구문은 조건에 따라 dynamic 블록이 실행될 횟수를 결정한다.
2-2. 조건 이해하기: "var.capacity_provider_name != null"
- 이 조건은 capacity_provider_name 변수가 null인지 아닌지를 확인한다. null이 아니면, 즉 값이 설정되어 있으면 조건은 참(true)이 되고, null이면 조건은 거짓(false)이 된다.
2-3. 참일 때 ([1]):
- 조건이 참일 때, 즉 capacity_provider_name 변수에 값이 설정되어 있을 때, for_each는 [1]을 사용한다. [1]은 단일 요소를 가진 리스트를 의미하고, 이는 dynamic 블록이 정확히 한 번 실행되어야 한다는 것을 나타낸다.
2-4. 거짓일 때 ([]):
- 조건이 거짓일 때, 즉 capacity_provider_name 변수에 값이 설정되어 있지 않을 때, for_each는 []를 사용한다. []는 빈 리스트를 의미하고, 이는 dynamic 블록이 실행되지 않아야 한다는 것을 나타낸다.
2-5. [3] 같은 다른 숫자들이 사용된다면?
- '[3]', '[2]', '[4]' 같은 다른 숫자를 사용하는 것도 가능하다. 이런 경우에는 그 숫자만큼 'dynamic' 블록이 반복해서 실행되어야 함을 의미한다.
- 예를 들어, '[3]'이라면 'dynamic' 블록이 세 번 실행되어야 하고, 그 결과로 세 개의 'capacity_provider_strategy' 설정이 생성될 것이다.
2-6. 결론
- 위의 코드에서 삼항연산자가 참일 때 사용하는 [1]은 외부에서 주입하는 값을 직접 사용하는 것이 아니라, 단순히 조건에 따라 'dynamic' 블록을 실행할지 말지를 결정하기 위한 것이다. '[1]', '[]' 이런 것들은 실제 값을 나타내는 게 아니라, 조건에 따른 실행 여부를 나타내는 신호로 사용되는 것이다.
실제 모듈코드는 어떻게 작성했는지 알아보자
3. 모듈 코드에 따른 다이나믹 블록의 동작
3-1. root 경로의 main.tf에서는 아래와 같이 모듈코드를 작성한다.
- ecs 서비스를 생성하는 2개의 모듈 코드를 선언했는데 코드가 서로 다르게 작성된 것을 알 수 있다. 레시피 서비스는 capacity_provider가 작성되었지만 지프킨 서비스에는 작성되지 않았다.
3-2. 레시피 서비스 (ecs_cluster_service_recipe 모듈) 작성:
- capacity_provider_name에 값이 할당되어 있다. (module.recipe_ecs_capacity_provider.capacity_provider_name). 따라서 for_each는 [1]을 사용하고, dynamic 블록은 한 번 실행되어 capacity_provider_strategy 설정을 생성한다.
3-3. 지프킨 서비스 (ecs_cluster_service_zipkin 모듈) 작성:
- 지금처럼 capacity_provider_name이 할당되지 않았다면 (null인 경우), for_each는 []를 사용하고, dynamic 블록은 실행되지 않아 capacity_provider_strategy 설정을 생성하지 않는다.
이 내용은 아래의 테라폼 적용기에서 이어지는 설명입니다.
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '평양냉면 7'님의 블로그도 한번 봐주세요 :)
'AWS > 테라폼(Terraform)' 카테고리의 다른 글
실전! 테라폼 적용기4편 - ECS 클러스터, 서비스 ,태스크 구성하기 (3) | 2023.12.18 |
---|---|
실전! 테라폼 적용기3편 - Auto Scaling Group과 용량 공급자(Capacity provider) 작성 (1) | 2023.12.18 |
실전! 테라폼 정복기 2편 - vpc, subnet 설정과 인프라 구축 (0) | 2023.12.16 |
실전! 테라폼 정복기 1편 - 테라폼(Terraform) 모듈화 (1) | 2023.12.09 |
테라폼(Terraform) 사용 가이드 7: AutoScailingGroup과 LoadBalancer을 생성하고 연결하기 (0) | 2023.12.07 |