Ssoon
Chapter (06) Module - 작성 기본 원칙 / 모듈화 본문
CloudNet@ 가시다님이 진행하는 Terraform 101 Study 2기
"테라폼으로 시작하는 IaC" (한빛미디어) 도서로 진행!
🧿 단일 파일 구조의 문제점
- 테라폼 구성에서 원하는 항목을 찾고 수정하는 것이 어려움
- Resource 들 간의 연관 관계가 복잡해질수록 변경 작업의 영향도 분석의 어려움
- 개발/스테이징/프로덕션 환경으로 구분된 경우 비슷한 형태의 구성이 반복되어 업무의 비효율
- 새로운 프로젝트를 구성하는 경우 기존 구성에서 가져와야 할 리소스 구성과 종속성 파악의 어려움
- 구성과 Module 간 정의를 통한 프로비저닝 과정
✅ Module
✔ Root Module
- 테라폼을 실행하고 프로비저닝하는 최상위 모듈
✔ Child Module
- 루트 모듈의 구성에서 호출되는 외부 구성 집합
Module = 테라폼 구성의 집합
▶ 관리성
- Module 은 서로 연관 있는 구성의 묶음
- 원하는 구성요소를 단위별로 쉽게 찾고 업데이트
- 다른 구성에서 쉽게 하나의 덩어리로 추가하거나 삭제
- Moduel 이 업데이트 되면 Module을 사용하는 모든 구성에서 변경 작업 진행
▶ 캡슐화
- 각 Module 은 논리적으로 묶어져 독립적으로 프로비저닝 및 관리
- 결과는 필요한 항목만을 외부에 노출
▶ 재사용성
- 비슷한 프로비저닝에 이미 검증된 구성을 바로 사용
▶ 일관성과 표준화
- Module 을 사용하는 워크플로는 구성의 일관성을 제공
- 서로 다른 환경과 프로젝트에도 이미 검증한 Module 을 적용해 구성과 보안 사고를 방지
🧿 Module 작성 기본 원칙
- 프로그래밍 언어에서 쓰는 라이브러리나 패키지와 역활이 비슷
- Module 디렉터리 형식은 terraform-<프로바이터 이름>-<모듈 이름>
- 디렉터리 또는 레지스트리 이름이 테라폼을 위한 것
- 어떤 프로바이더의 리소스를 포함
- 부여된 이름이 무엇인지 판별
- 테라폼 구조는 궁극적으로 Module 가 가능한 구조로 작성
- 처음부터 모듈화를 가정하고 구성파일 작성 > 후에 다른 Module 이 호출할 것을 예상하고 구조화 가능
- 작성자의 의도한 리소스 묶음을 구상한 대로 논리적인 구조로 그룹화 가능
- 각각의 Module 을 독립적으로 관리
- 하위 Module 또한 독립적인 Module 이므로 Root Module 하위에 두기 보다는 동일한 파일 시스템 레벨에 위치하거나 별도 Moulde 만을 위한 공간에서 호출
- 공개된 테라폼 레지스트리의 Module 를 참고
- 대다수의 테라폼 Module 은 공개되어 있고, 거의 모든 인수에 대한 모범사례 공개
- 작성된 Module 은 공개 또는 비공개로 게시
- Moduel 의 사용성을 높이고 피드백을 통해 더 발전된 Module 구성 가능
- 자식 모듈과 루트 모듈의 디렉터리 구조
🧿 모듈화 해보기
- Module 의 기본적 구성
- 테라폼 구성으로 입력 변수를 구성하고 결과를 출력하기 위한 구조로 구성
✔ 모듈화 ?
- 테라폼 구조를 재활용하기 위한 템플릿 작업
- 작성된 Module 을 다른 Root 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"
}
]
}
'Terraform 101 Study 2기' 카테고리의 다른 글
Chapter (07) - 협업 (0) | 2023.07.28 |
---|---|
Chapter (06) Module - 사용 형식 / 소스 관리 (0) | 2023.07.24 |
Chapter (05) State - 워크스페이스 (0) | 2023.07.19 |
Chapter (05) State - 목적/의미/동기화 (0) | 2023.07.19 |
Chapter (04) 프로바이더 (0) | 2023.07.17 |
Comments