LabHub

Terraform 실전 · 모듈화 · 실습

자식 모듈 만들고 여러 번 호출하기

LabHub 에서 이어서 보기

목표

작은 자식 모듈을 표준 구조로 만들고, 같은 모듈을 여러 번 호출해 인스턴스를 늘리고, 모듈 안의 값을 출력으로 밖에 꺼내는 흐름을 손에 익힙니다.

왜 중요한가

모듈을 쓰는 이유를 "코드 중복 제거"로만 배우면 곧 벽에 부딪힙니다. 실제 이유는 변경 반경의 제한입니다. 구현이 한 벌이면 고칠 곳도 한 곳이고, 환경 사이의 차이는 코드가 아니라 넘기는 값으로만 드러납니다. 그래서 모듈 설계에서 가장 중요한 결정은 "무엇을 변수로 열어 줄 것인가"입니다 — 너무 많이 열면 모듈이 그냥 리소스의 다른 이름이 되고, 너무 적게 열면 아무도 못 씁니다. 또 하나 기억할 것은 모듈이 캡슐이라는 점입니다. 모듈 안 리소스는 밖에서 직접 참조할 수 없고 오직 output 으로만 나옵니다. 이 제약이 귀찮아 보이지만, 덕분에 모듈 내부를 뜯어고쳐도 쓰는 쪽 코드가 깨지지 않습니다. 마지막으로 자식 모듈 안에 provider 블록을 두지 마세요. 그 모듈 호출을 나중에 코드에서 지울 수 없게 되는, 되돌리기 어려운 사고의 원인입니다.

단계

1. /opt/lab/fixtures/terraform/modules-starter/modules/filebox/root/tf/modules/modules/filebox 로 복사하세요. 그 디렉터리에 main.tf, variables.tf, outputs.tf 세 파일이 있어야 합니다. variables.tf 에는 variable "dir"variable "name" 이 있어야 하고, 새로 만드는 outputs.tf 에는 output "path" (값은 local_file.box.filename)를 두세요. 모듈 안에 provider "..." 블록을 두면 안 됩니다.
2. /root/tf/modules/main.tfmodule "primary" 를 선언하고 source = "./modules/filebox" 로 지정하세요. dir 에는 /root/tf/modules/out, name 에는 primary, body 에는 아무 문자열을 넘깁니다. tofu inittofu apply/root/tf/modules/out/primary.txt 를 만드세요.
3. /root/tf/modules/outputs.tf 에 루트 출력 primary_path 를 만들어 module.primary.path 를 내보내고, tofu output -json 결과를 /root/tf/modules/out/outputs.json 로 저장하세요. primary_path 의 값은 /root/tf/modules/out/primary.txt 여야 합니다.
4. 같은 소스를 module "secondary" 로 한 번 더 호출하세요. namesecondary 로, body 는 primary 와 다른 문자열로 넘겨 /root/tf/modules/out/secondary.txt 의 내용이 primary.txt 와 달라지게 합니다. 모듈 디렉터리를 복사하지 마세요 — /root/tf/modules/modules 아래 디렉터리는 나중에 만들 bundle 까지 합쳐 2개를 넘으면 안 됩니다.
5. tofu state list 결과를 /root/tf/modules/out/state-list.txt 로 저장하세요. module.primary.module.secondary. 로 시작하는 주소가 각각 있어야 하고, 루트에 local_file.box 라는 주소가 따로 있으면 안 됩니다.
6. /root/tf/modules/modules/bundle/main.tf 를 만들어 그 안에서 source = "../filebox" 로 filebox 를 두 번 호출하세요(예: module "left", module "right", 이름은 bundle-left·bundle-right). 루트에서 module "bundle" 로 호출하고 적용하면 상태에 module.bundle.module.left.... 형태의 주소가 2개 이상 생깁니다.
7. /root/tf/modules/modules/filebox/variables.tfname 변수에 validation 블록을 추가하고 error_message 를 함께 쓰세요(예: 소문자·숫자·하이픈만 허용). 그다음 어느 호출의 name 에 규칙을 어기는 값을 잠깐 넣고 tofu plan 의 출력을 표준 오류까지 포함해 /root/tf/modules/out/module-error.txt 로 저장하세요. 저장한 내용에는 검증 실패 메시지와 filebox 경로가 함께 보여야 합니다. 확인이 끝나면 값을 원래대로 되돌립니다.
8. /root/tf/modules/outputs.tfall_paths 출력을 추가하세요. primary, secondary, bundle 세 키를 가진 맵이며 primary 값은 /root/tf/modules/out/primary.txt 여야 합니다. bundle 모듈에도 output "paths" 를 만들어 안쪽 두 경로를 담고 그것을 bundle 키에 넣으세요. 마지막에 tofu output -json 을 다시 /root/tf/modules/out/outputs.json 로 저장합니다.

참고

단계 8개

  1. 모듈을 입력·구현·출력 세 파일로 나누기
  2. 모듈 호출하고 적용하기
  3. 모듈 출력을 루트로 끌어올리기
  4. 같은 모듈을 다른 입력으로 두 번 호출하기
  5. 모듈 소속 리소스의 주소 확인하기
  6. 모듈 안에서 모듈 부르기
  7. 모듈 경계에서 잘못된 값 막기
  8. 세 모듈의 출력을 하나의 맵으로 모으기