공부하면서/Terraform

[T1012] 4주차 - State & 모듈 (Module)

omelette master 2023. 7. 27. 23:01
해당 내용은 T1012 스터디에 나온 내용과 '테라폼으로 시작하는 IaC' 책을 기준으로 정리 했습니다

Module?

 

Modules Overview - Configuration Language | Terraform | HashiCorp Developer

Modules are containers for multiple resources that are used together in a configuration. Find resources for using, developing, and publishing modules.

developer.hashicorp.com

모듈이란걸 몰랐을때...

하나의 디렉터리에 무수한 .tf파일만 생성해놓고 사용했는데

  1. 이렇게 리소스가 늘어남에 따라 원하는 리소스를 검색하고 수정하는것들이 힘들어지고
  2. 리소스간 참조하는 영역이 늘어날수록 작업 영향도를 분석하기 위해 노력하는 시간도 늘어난다
    (+하나 수정시 사이드 이팩트가!)
  3. dev/stg/prd 각각 환경에 대해 .tf파일 복붙...
  4. 새로운 프로젝트 구성시 기존 구성에서 취해야할 리소스 구성과 종속성 파악 어려움 (+2번의 내용)

모듈은 root 모듈과 child 모듈로 구분된다

  • 루트 모듈 Root Module : 테라폼을 실행하고 프로비저닝하는 최상위 모듈
  • 자식 모듈 Chile Module : 루트 모듈의 구성에서 호출되는 외부 구성 집합

6.1 모듈 작성 기본 원칙

모듈은 대부분의 프로그래밍 언어에서 쓰이는 라이브러리나 패키지와 역할이 비슷하다

모듈을 독립적으로 관리하기 위해 디렉터리 구조를 생성할 때 모듈을 위한 별도 공간을 생성하는 방식으로 진행한다.

특정 루트 모듈 하위에 자식 모듈을 구성하는 경우 단순히 복잡한 코드를 분리하는 용도로 명시되며 종속성이 발생하므로 루트 모듈 사이에 모듈 디렉터리를 지정한다.

루트 모듈 하위에 자식모듈을 구성하는 경우의 예시

6.2 모듈화 해보기

모듈의 기본적 구조는 테라폼 구성으로 입력 변수를 구성하고 결과를 출력하기 위한 구조로 구성한다.

 

다음은 하나의 프로비저닝에서 사용자와 패스워드를 여러번 구성해야 하는 경우에 대한 모듈화 실습

자식 모듈 작성

더보기
# 자식 모듈 작성 (폴더, main.tf, variable.tf, output.tf 생성)

# 06-module-traning/modules/terraform-random-pwgen 폴더 생성후 이동
mkdir -p 06-module-traning/modules/terraform-random-pwgen
cd 06-module-traning/modules/terraform-random-pwgen

# main.tf 생성
# 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 plan

# 테스트를 위해 apply 시 변수 지정
terraform apply -auto-approve -var=isDB=true
# 확인
terraform state list
terraform state show random_pet.name
terraform state show random_password.password

# tfstate에 모듈 정보 확인
cat terraform.tfstate | grep module

# graph 확인
terraform graph > graph.dot

자식 모듈 호출

더보기
# 06-01-basic 폴더 생성 후 이동
mkdir -p 06-module-traning/06-01-basic
cd 06-module-traning/06-01-basic

# main.tf 생성
module "mypw1" {
  source = "../modules/terraform-random-pwgen"
}

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

output "mypw1" {
  value  = module.mypw1
}

output "mypw2" {
  value  = module.mypw2
}
# 초기화 및 실행
terraform init && terraform plan && terraform apply -auto-approve
# 확인
terraform state list

# tfstate에 모듈 정보 확인
cat terraform.tfstate | grep module
# terraform init 시 생성되는 modules.json 파일 확인
tree .terraform
.terraform
├── modules
│   └── modules.json
...
## 모듈로 묶여진 리소스는 module이라는 정의를 통해 단순하게 재활용하고 반복 사용할 수 있다.
## 모듈의 결과 참조 형식은 module.<모듈 이름>.<output 이름>으로 정의된다.
cat .terraform/modules/modules.json | jq
{
  "Modules": [
    {
      "Key": "",
      "Source": "",
      "Dir": "."
    },
    {
      "Key": "mypw1",
      "Source": "../modules/terraform-random-pwgen",
      "Dir": "../modules/terraform-random-pwgen"
    },
    {
      "Key": "mypw2",
      "Source": "../modules/terraform-random-pwgen",
      "Dir": "../modules/terraform-random-pwgen"
    }
  ]
}
# graph 확인
terraform graph > graph.dot
많이... 복잡하다