실전! 테라폼 적용기 [추가설명] - dynamic 블록 사용하기

2023. 12. 18. 23:28·DevOps/테라폼(Terraform)
반응형
 
 

다이나믹 블록은 설정이 복잡하거나 조건에 따라 변할 수 있는 리소스 속성을 효율적으로 관리하기 위해 사용된다.

📌 서론

우리 팀은 프로젝트에서 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. 가변성 있는 설정 관리:
    • 리소스의 특정 속성이 실행 시점이나 환경에 따라 달라질 때, 다이나믹 블록을 사용해서 이를 효율적으로 처리할 수 있다.

  2. 코드의 간결함과 유지 관리 향상:
    • 비슷한 구조의 코드를 여러 번 반복 작성할 필요 없이, 한 번의 선언으로 다양한 경우를 처리할 수 있어서 코드가 간결해지고, 유지 관리가 용이해진다.

  3. 조건부 리소스 생성:
    • 특정 조건에 따라 리소스의 일부를 생성하거나 생략해야 할 경우에 유용하다. 예를 들어, 특정 변수의 값에 따라 리소스의 세부 설정을 추가하거나 빼는 것이 가능하다.



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 설정을 생성하지 않는다.

 

 

 

이 내용은 아래의 테라폼 적용기에서 이어지는 설명입니다.

 

실전! 테라폼 적용기3편 - Auto Scaling Group과 용량 공급자(Capacity provider) 작성

이번에는 Auto Scaling Group과 Capacity Provider를 테라폼 모듈로 생성하자 이 글을 이해하기 위해서는 이전 포스트를 꼭 확인하도록 하자👇🏻👇🏻 실전! 테라폼 정복기 2편 - vpc, subnet 설정과 인프라

curiousjinan.tistory.com

이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '평양냉면 7'님의 블로그도 한번 봐주세요 :)
 

하다보니 재미있는 개발

하다 보니 재미있는 개발에 빠져있는 중입니다. 문의사항: ysoil8811@gmail.com

yijoon009.tistory.com

 

반응형

'DevOps > 테라폼(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) 모듈화  (2) 2023.12.09
테라폼(Terraform) 사용 가이드 7: AutoScailingGroup과 LoadBalancer을 생성하고 연결하기  (0) 2023.12.07
'DevOps/테라폼(Terraform)' 카테고리의 다른 글
  • 실전! 테라폼 적용기4편 - ECS 클러스터, 서비스 ,태스크 구성하기
  • 실전! 테라폼 적용기3편 - Auto Scaling Group과 용량 공급자(Capacity provider) 작성
  • 실전! 테라폼 정복기 2편 - vpc, subnet 설정과 인프라 구축
  • 실전! 테라폼 정복기 1편 - 테라폼(Terraform) 모듈화
Stark97
Stark97
문의사항 또는 커피챗 요청은 링크드인 메신저를 보내주세요! : https://www.linkedin.com/in/writedev/
  • Stark97
    오늘도 개발중입니다
    Stark97
  • 전체
    오늘
    어제
    • 분류 전체보기 (247)
      • 개발지식 (20)
        • 스레드(Thread) (8)
        • WEB, DB, GIT (3)
        • 디자인패턴 (8)
      • JAVA (21)
      • Spring (88)
        • Spring 기초 지식 (35)
        • Spring 설정 (6)
        • JPA (7)
        • Spring Security (17)
        • Spring에서 Java 활용하기 (8)
        • 테스트 코드 (15)
      • 아키텍처 (6)
      • MSA (15)
      • DDD (11)
      • gRPC (9)
      • Apache Kafka (18)
      • DevOps (23)
        • nGrinder (4)
        • Docker (1)
        • k8s (1)
        • 테라폼(Terraform) (12)
      • AWS (32)
        • ECS, ECR (14)
        • EC2 (2)
        • CodePipeline, CICD (8)
        • SNS, SQS (5)
        • RDS (2)
      • notion&obsidian (3)
      • AI 탐험대 (1)
      • 팀 Pulse (0)
  • 링크

    • notion기록
    • 깃허브
    • 링크드인
  • hELLO· Designed By정상우.v4.10.0
Stark97
실전! 테라폼 적용기 [추가설명] - dynamic 블록 사용하기
상단으로

티스토리툴바