Ssoon

Chapter (06) Module - 작성 기본 원칙 / 모듈화 본문

Terraform 101 Study 2기

Chapter (06) Module - 작성 기본 원칙 / 모듈화

구구달스 2023. 7. 24. 21:59
CloudNet@ 가시다님이 진행하는 Terraform 101 Study 2기
"테라폼으로 시작하는 IaC" (한빛미디어) 도서로 진행!

🧿 단일 파일 구조의 문제점

  • 테라폼 구성에서 원하는 항목을 찾고 수정하는 것이 어려움
  • Resource 들 간의 연관 관계가 복잡해질수록 변경 작업의 영향도 분석의 어려움
  • 개발/스테이징/프로덕션 환경으로 구분된 경우 비슷한 형태의 구성이 반복되어 업무의 비효율
  • 새로운 프로젝트를 구성하는 경우 기존 구성에서 가져와야 할 리소스 구성과 종속성 파악의 어려움

  • 구성과 Module 간 정의를 통한 프로비저닝 과정


✅ Module

Root Module

  • 테라폼을 실행하고 프로비저닝하는 최상위 모듈

Child Module

  • 루트 모듈의 구성에서 호출되는 외부 구성 집합

Module = 테라폼 구성의 집합


관리성

  • Module 은 서로 연관 있는 구성의 묶음
  • 원하는 구성요소를 단위별로 쉽게 찾고 업데이트
  • 다른 구성에서 쉽게 하나의 덩어리로 추가하거나 삭제
  • Moduel 이 업데이트 되면 Module을 사용하는 모든 구성에서 변경 작업 진행

캡슐화

  • 각 Module 은 논리적으로 묶어져 독립적으로 프로비저닝 및 관리
  • 결과는 필요한 항목만을 외부에 노출

재사용성

  • 비슷한 프로비저닝에 이미 검증된 구성을 바로 사용

일관성과 표준화

  • Module 을 사용하는 워크플로는 구성의 일관성을 제공
  • 서로 다른 환경과 프로젝트에도 이미 검증한 Module 을 적용해 구성과 보안 사고를 방지

🧿 Module 작성 기본 원칙

  • 프로그래밍 언어에서 쓰는 라이브러리나 패키지와 역활이 비슷
  • Module 디렉터리 형식은 terraform-<프로바이터 이름>-<모듈 이름>
    1. 디렉터리 또는 레지스트리 이름이 테라폼을 위한 것
    2. 어떤 프로바이더의 리소스를 포함
    3. 부여된 이름이 무엇인지 판별
  • 테라폼 구조는 궁극적으로 Module 가 가능한 구조로 작성
    • 처음부터 모듈화를 가정하고 구성파일 작성 > 후에 다른 Module 이 호출할 것을 예상하고 구조화 가능
    • 작성자의 의도한 리소스 묶음을 구상한 대로 논리적인 구조로 그룹화 가능
  • 각각의 Module 을 독립적으로 관리
    • 하위 Module 또한 독립적인 Module 이므로 Root Module 하위에 두기 보다는 동일한 파일 시스템 레벨에 위치하거나 별도 Moulde 만을 위한 공간에서 호출
  • 공개된 테라폼 레지스트리의 Module 를 참고
    • 대다수의 테라폼 Module 은 공개되어 있고, 거의 모든 인수에 대한 모범사례 공개
  • 작성된 Module 은 공개 또는 비공개로 게시
    • Moduel 의 사용성을 높이고 피드백을 통해 더 발전된 Module 구성 가능

 

  • 자식 모듈과 루트 모듈의 디렉터리 구조

 

🧿 모듈화 해보기

  • Module 의 기본적 구성
    • 테라폼 구성으로 입력 변수를 구성하고 결과를 출력하기 위한 구조로 구성

Module 의 기본 구조

 모듈화 ?

  • 테라폼 구조를 재활용하기 위한 템플릿 작업
  • 작성된 Module 을 다른 Root Module 에서 가져다 사용
  • 재사용성과 표준화 구조를 구성

Root Module 과 Child Module

  • 기존에 작성된 Module 은 다른 Module 에서 참조 사용
  • Module 에서 필요한 값은 variable 로 선언
  • Module 에서 생성된 값 중 외부 Module 에서 참조하고 싶은 값은 output 으로 설정

 

🧿 자식 모듈 작성 실습

  • random_pet 이름을 자동 생성
  • random_password 사용자 패스워드 설정
  • random_password 는 random 프로바이더 리소스로 난수 형태로 패스워드 생성

  • 06-module-training/modules/terradorm-random-pwgen 에 module 작성

✔ main.tf

resource "random_pet" "name" {
  keepers = {
    ami_id = timestamp()
  }
}

resource "random_password" "password" {
  length           = var.isDB ? 16 : 10
  special          = var.isDB ? true : false
  override_special = "!#$%*?"
}

 

✔ variable.tf

variable "isDB" {
  type        = bool
  default     = false
  description = "패스워드 대상의 DB 여부"
}

✔ output.tf

output "id" {
  value = random_pet.name.id
}

output "pw" {
  value = nonsensitive(random_password.password.result)
}
  • terraform init 실행

  • terraform apply 실행 (변수 지정)

 

🧿 자식 모듈 호출 실습

  • Module 을 활용하면 반복되는 Resource 묶음을 최소화
  • 06-module-training/06-01-basic Root Module 작성

✔ main.tf (자식 모듈을 호출하는 루트 모듈의 정의)

module "mypw1" {
  source = "../modules/terradorm-random-pwgen"
}

module "mypw2" {
  source = "../modules/terradorm-random-pwgen"
  isDB = true
}

output "mypw1" {
  value = module.mypw1
}

output "mypw2" {
  value = module.mypw2
}
  • terraform init 실행

  • terraform apply 실행

  • module 로 묶여진 리소스는 module 이라는 정의를 통해 재활용하고 반복 가능
  • module 의 결과 참조 방식
  • module.<모듈 이름>.<output 이름>
  • .terraform/modules/modules.jason 확인 - 여러 개의 module 정의가 있고 테라폼 구성에서 선언한 값이 각각 정의
{
  "Modules": [
    {
      "Key": "",
      "Source": "",
      "Dir": "."
    },
    {
      "Key": "mypw1",
      "Source": "../modules/terradorm-random-pwgen",
      "Dir": "../modules/terradorm-random-pwgen"
    },
    {
      "Key": "mypw2",
      "Source": "../modules/terradorm-random-pwgen",
      "Dir": "../modules/terradorm-random-pwgen"
    }
  ]
}
 
Comments