ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Terraform과 모듈
    Iac(Infrastructure as Code) 2023. 3. 22. 11:52

     

    들어가기 전에

    Terraform 구성 파일을 만들어 Azure 리소스 배포를 하다보니 재사용되는 리소스가 많아지고 리소스 속성이 변경될 때 파일을 찾아가는게 어려워지는 것을 느꼈다.

    이 때 관련된 내용으로 조사해보니 Terraform 에서 Module 을 사용하면 이 문제점을 해결할 수 있다는 걸 알게되어 Terraform Module 에 대해서 알아보려한다.

     

    Terraform 모듈 구성도

     

    Terraform 모듈 코드

     

    Modules Overview

    Terraform으로 인프라 관리를 지속할수록 점점 더 복잡한 구성을 만들게 된다.

    단일 Terraform 구성 파일 또는 디렉토리는 복잡성이 낮아 계속 작성하고 업데이트하는데 무리가 없다.

    그러나 이렇게 프로세스를 유지하게되면 문제가 발생한다.

    • 구성 파일을 이해하고 탐색하는 것이 점점 더 어려워진다.
    • 하나의 섹션을 업데이트하면 구성의 다른 부분에 의도하지 않은 결과가 발생할 수 있어 구성 업데이트가 더 위험해진다.
    • 예를 들어, 별도의 개발/스테이징/프로덕션 환경을 구성할 때 유사한 구성 블록의 중복이 증가하게 되고 이는 업데이트해야하는 범위가 늘어나 구성을 하는 사람의 부담도 증가한다.
    • 프로젝트와 팀 간에 구성의 일부를 공유하고 싶을 때, 구성 블록을 잘라서 붙여넣는 것은 오류가 발생하기 쉽고 유지 관리하기 어렵다는 것을 금방 알게된다.
    • 엔지니어는 구성을 이해하고 수정하기 위해 더 많은 Terraform 전문 지식이 필요하다. 이로인해 다른 팀의 셀프 서비스 작업흐름이 더 어려워지고 개발 속도가 느려진다.

     

    모듈이란 무엇일까?

    모듈이 위에 나열된 문제를 해결하는 데 도움이 되는 몇 가지 방법을 제시한다.

    • Organize configuration(구성의 조직화)
      : 엄청 복잡하지 않은 인프라도 구성하려면 수백 또는 수천 줄의 구성이 필요할 수 있다. 모듈을 사용하면 구성의 관련 부분을 유지하여 구성을 보다 쉽게 탐색, 이해 및 업데이트할 수 있다.
    • Encapsulate configuration(구성의 캡슐화)
      : 모듈의 이점은 구성을 고유한 논리적 구성 요소로 캡슐화하는 것이다. 캡슐화는 구성의 한 부분을 변경하여 실수로 다른 인프라를 변경하는 것과 같은 의도하지 않은 결과를 방지하고 두 개의 서로 다른 리소스에 동일한 이름을 사용하는 것과 같은 단순한 오류의 가능성을 줄이는 데 도움이된다.
    • Re-use configuration(구성의 재사용)
      : 처음부터 모든 구성을 작성하면 시간이 많이 걸리고 오류가 발생하기 쉽다. 모듈을 사용하면 자신, 팀의 다른 구성원 또는 사용할 모듈을 게시한 다른 Terraform 실무자가 작성한 구성을 재사용하여 시간을 절약하고 비용이 발생하는 오류를 줄일 수 있다.
    • Provide consistency and ensure best practices(일관성 제공 및 모범 사례 보장)
      : 모듈은 구성의 일관성을 제공하는 데 도움이 된다. 일관성은 복잡한 구성을 이해하기 쉽게 만들 뿐만 아니라 모든 구성에 모범 사례를 적용하는 데도 도움이 된다. 예를 들어, 클라우드 공급자는 Amazon S3 또는 Google Cloud Storage 버킷과 같은 객체 스토리지 서비스를 구성하기 위한 다양한 옵션을 제공한다.
      복잡한 구성 옵션의 수를 고려할 때 실수로 잘못된 보안 정책 구성을 하게되어 보안 사건이 많이 발생했다.
    • Self service(셀프 서비스)
      : 모듈을 사용하면 다른 팀에서 구성을 보다 쉽게 사용할 수 있다. Terraform Cloud 레지스트리를 사용하면 다른 팀에서 게시 및 승인된 Terraform 모듈을 찾고 재사용할 수 있다. 또한 Terraform 전문 지식이 없는 팀이 조직의 표준 및 정책을 준수하는 자체 인프라를 프로비저닝할 수 있는 코드 없는 지원 모듈을 빌드하고 게시할 수 있다.

     

    모듈을 사용하면 이러한 오류를 줄이는 데 도움이 된다. 예를 들어 조직의 공개된 웹 사이트 버킷이 구성되는 방식을 설명하는 모듈과 로깅 애플리케이션에 사용되는 비공개 버킷에 대한 서로 다른 모듈을 만들 수 있다. 또한 리소스 유형에 대한 구성을 업데이트해야 하는 경우 모듈을 사용하면 한 곳에서 해당 업데이트를 수행하고 해당 모듈을 사용하는 모든 경우에 적용할 수 있다.

     

    Terraform 모듈이란 무엇일까?

    Terraform 모듈은 단일 디렉토리에 있는 Terraform 구성 파일 세트이다. 하나 이상의 파일이 있는 단일 디렉토리로 구성된 .tf 모듈이다. 이러한 디렉토리에서 직접 Terraform 명령을 실행하면 루트 모듈로 간주된다. 따라서 모든 Terraform 구성은 모듈의 일부이다. 다음과 같은 간단한 Terraform 구성 파일 세트가 있다.

     

     

    이 경우, minimal-module 디렉토리 내에서 terraform 명령을 실행하면 해당 디렉토리의 내용은 루트 모듈로 간주된다.

     

    모듈 호출

    Terraform 명령은 일반적으로 현재 작업 디렉토리인 하나의 디렉토리에 있는 구성 파일만 직접 사용한다. 그러나 구성은 모듈 블록을 사용하여 다른 디렉토리의 모듈을 호출할 수 있다. Terraform은 모듈 블록을 만나면 해당 모듈의 구성 파일을 로드하고 처리한다.

    다른 구성에 의해 호출되는 모듈을 해당 구성의 '자식 모듈'이라고 한다.

     

    로컬 및 원격 모듈

    모듈은 로컬 파일 시스템이나 원격 소스에서 로드할 수 있다. Terraform은 Terraform 레지스트리, 대부분의 버전 제어 시스템, HTTP URL, Terraform Cloud 또는 Terraform Enterprise 개인 모듈 레지스트리를 비롯한 다양한 원격 소스를 지원한다.

     

    모듈 모범 사례

    여러 면에서 Terraform 모듈은 대부분의 프로그래밍 언어에서 볼 수 있는 라이브러리, 패키지 또는 모듈의 개념과 유사하며 동일한 많은 이점을 제공한다.

     

    Terraform 실무자는 다음 모범 사례에 따라 모듈을 사용하는 것이 좋다.

    1. 공급자 이름을 지정한다 terraform-<PROVIDER>-<NAME>. Terraform Cloud 또는 Terraform Enterprise 모듈 레지스트리에 게시 하려면 이 규칙을 따라야 한다.
    2. 모듈을 염두에 두고 구성 작업을 시작한다. 한 사람이 관리하는 복잡한 Terraform 구성의 경우에도 모듈을 적절하게 사용하는 데 걸리는 시간보다 모듈을 사용했을 때 이점이 더 크다.
    3. 로컬 모듈을 사용하여 코드를 구성하고 캡슐화한다. 원격 모듈을 사용하거나 게시하지 않더라도 처음부터 모듈 측면에서 구성하면 인프라가 복잡해지더라도 구성을 유지 관리하고 업데이트하는 부담이 줄어든다.
    4. 공용 Terraform 레지스트리를 사용하여 유용한 모듈을 찾는다. 이렇게 하면 공통 인프라 시나리오를 구현하기 위해 다른 사람이 만든 작업에 의존하여 보다 빠르고 확실하게 구성을 구현할 수 있다.
    5. 모듈을 게시하고 팀과 공유한다. 대부분의 인프라는 한 팀이 관리하며 모듈은 팀이 인프라를 만들고 유지 관리하기 위해 함께 작업할 수 있는 중요한 방법이다. 앞에서 언급한 대로 모듈을 공개적으로 또는 비공개로 게시할 수 있다. 모듈 사용자는 루트 모듈에서 게시된 하위 모듈을 참조하거나 Terraform Cloud UI를 통해 코드가 없는 준비된 모듈을 배포할 수 있다.

    'Iac(Infrastructure as Code)' 카테고리의 다른 글

    Terraform과 모듈 - 로컬  (0) 2023.03.25
Designed by Tistory.