AWS 멀티 리전 Terraform.
리전별 locals 맵 하나를 고치면 16개 AWS 리전에 같은 인프라가 만들어지는 Terraform 모듈 모음입니다.
문제
같은 형태의 리소스를 여러 리전에 만들어야 했습니다. 리전이 늘수록 복사한 코드가 늘고 리전마다 설정이 달라질 위험이 커졌습니다.
접근
리전별 locals 맵에 원하는 상태를 선언하고 module과 for_each로 일괄 생성합니다. provider는 리전마다 별칭을 두고 같은 role을 assume합니다. for_each가 provider를 동적으로 고를 수 없어 리전별 module 블록은 반복합니다.
구현
- Terraform
- AWS
- EKS
- CloudWatch
- AWS Chatbot
규모 · 16개 리전 · 모듈 24종 · 예제 3개
AWS 16개 리전마다 provider 별칭을 하나씩 둡니다.
별칭 provider는 모두 같은 role을 assume합니다. 미주 리전부터 연결됩니다.
아시아·태평양 리전 6곳이 같은 역할로 연결됩니다.
유럽 리전 5곳까지 연결되면 16개 리전이 모두 켜집니다.
리전을 늘려도 수정할 곳은 locals 맵 항목과 리전별 module 블록입니다.
전체 단계 읽기
- AWS 16개 리전마다 provider 별칭을 하나씩 둡니다.
- 별칭 provider는 모두 같은 role을 assume합니다. 미주 리전부터 연결됩니다.
- 아시아·태평양 리전 6곳이 같은 역할로 연결됩니다.
- 유럽 리전 5곳까지 연결되면 16개 리전이 모두 켜집니다.
- 리전을 늘려도 수정할 곳은 locals 맵 항목과 리전별 module 블록입니다.
결과
변경은 맵 항목 하나로 끝나고, 키가 고정이라 순서를 바꿔도 리소스가 다시 생성되지 않습니다. 모듈 24종에 암호화, IMDSv2, 비공개 S3 같은 기본값을 넣었고 EKS와 알림 예제까지 3종을 공개했습니다.
- 16
- 리전별 provider 별칭
- 24
- 공개한 Terraform 모듈
- 3
- 검증한 예제
배운 점
반복을 줄이는 것만큼 리소스를 가리키는 키를 고정하는 것이 중요했습니다. count는 목록의 위치로 리소스를 구분해 항목을 끼워 넣거나 순서를 바꾸면 뒤쪽 리소스가 다시 만들어질 수 있지만, for_each는 맵의 키로 구분하므로 순서와 상관없이 같은 리소스를 가리킵니다. provider를 for_each로 고를 수 없다는 Terraform의 제약은 억지로 감추지 않고 리전별 module 블록을 반복해 드러냈고, 그 편이 읽고 고치기 쉬웠습니다. 이후로는 같은 구조를 여러 곳에 만들 때 데이터(맵)와 코드(모듈)를 먼저 나누고, 변경이 맵 항목 하나로 끝나는지를 설계의 기준으로 삼습니다.
16개 리전 — 모듈 24종, 리전별 locals 맵