이 문서에서는 Google Cloud용 Terraform을 사용할 때 고려해야 할 버전 제어 권장사항을 제공합니다.
다른 코드 형식에서와 같이 이전 항목을 보존하고 쉽게 롤백할 수 있도록 버전 제어에 인프라 코드를 저장합니다.
이 가이드는 Terraform 소개 내용이 아닙니다. Google Cloud에서 Terraform 사용에 대한 소개는 정보는 Terraform 시작하기를 참조하세요.
기본 브랜치 전략 사용
Terraform 코드가 포함된 모든 저장소의 경우 기본적으로 다음 전략을 사용합니다.
main
브랜치는 기본 개발 브랜치이고 최신 승인 코드를 제공합니다.main
브랜치는 보호됩니다.- 개발은
main
브랜치 외부의 기능 및 버그 수정 브랜치에서 수행됩니다.- 특성 브랜치 이름을
feature/$feature_name
으로 지정합니다. - 버그 수정 브랜치 이름을
fix/$bugfix_name
으로 지정합니다.
- 특성 브랜치 이름을
- 특성 또는 버그 수정이 완료되면 pull 요청을 사용해서 이를 다시
main
브랜치로 병합합니다. - 병합 충돌을 방지하기 위해 병합 전 브랜치 기준을 다시 설정합니다.
루트 구성에 환경 브랜치 사용
Google Cloud에 직접 배포되는 루트 구성이 포함된 저장소의 경우 안전한 출시 전략이 필요합니다. 각 환경에 대해 개별 브랜치를 사용하는 것이 좋습니다. 따라서 여러 브랜치 간 변경사항을 병합하여 Terraform 구성에 대한 변경사항을 승격할 수 있습니다.
포괄적인 가시성 허용
Terraform 소스 코드 및 저장소가 엔지니어링 조직 간에, 인프라 소유자(예: SRE)에 대해, 인프라 이해관계자(예: 개발자)에 대해 포괄적으로 표시되고 액세스될 수 있게 합니다. 그러면 인프라 이해관계자가 사용되는 인프라를 더 잘 이해할 수 있습니다.
인프라 이해관계자가 변경 요청 프로세스 중 병합 요청을 제출할 수 있도록 권장합니다.
보안 비밀 커밋 안 함
Terraform 구성을 포함하여 소스 제어에 보안 비밀을 커밋하지 않습니다. 대신 Secret Manager와 같은 시스템에 업로드하고 데이터 소스를 사용해서 참조합니다.
이러한 민감한 값은 결국 상태 파일에 포함될 수 있고 출력으로 노출될 수도 있다는 사실에 주의하세요.
팀 경계를 기반으로 저장소 구성
개별 디렉터리를 사용해서 리소스 간 논리적 경계를 관리할 수 있지만 조직 경계 및 물류에 따라 저장소 구조가 결정됩니다. 일반적으로 승인 및 관리 요구사항이 서로 다른 구성을 서로 다른 소스 제어 저장소로 분리한다는 설계 원칙을 따르세요. 이 원칙을 설명하기 위해 사용 가능한 일부 저장소 구성은 다음과 같습니다.
하나의 중앙 저장소: 이 모델에서는 모든 Terraform 코드가 단일 플랫폼팀에 의해 중앙에서 관리됩니다. 이 모델은 모든 클라우드 관리를 책임지고 다른 팀에서 요청된 변경사항을 승인하는 전용 인프라팀이 있는 경우에 가장 적합합니다.
팀 저장소: 이 모듈에서는 각 팀이 자신의 Terraform 저장소를 책임지고 자신이 소유한 인프라와 관련된 모든 것을 관리합니다. 예를 들어 보안팀은 모든 보안 제어가 관리되는 저장소를 갖고 있고 애플리케이션팀은 애플리케이션 배포 및 관리를 위해 자체 Terraform 저장소를 갖고 있습니다.
팀 경계에 따라 저장소를 관리하는 것이 대부분의 엔터프라이즈 시나리오에서 가장 적합한 구조입니다.
분리된 저장소: 이 모델에서는 각 논리적 Terraform 구성요소가 자체 저장소로 분할됩니다. 예를 들어 네트워킹에 전용 저장소가 있고 프로젝트 만들기 및 관리를 위해 별도의 프로젝트 팩토리 저장소가 있을 수 있습니다. 이 방식은 업무 책임이 다른 팀으로 전환되는 경우가 많은 높은 분산 환경에서 가장 적합합니다.
샘플 저장소 구조
이러한 원칙을 조합해서 Terraform 구성을 서로 다른 저장소 유형으로 분할할 수 있습니다.
- 기본
- 애플리케이션 및 팀별
기본 저장소
폴더 또는 조직 IAM과 같은 중요한 중앙 구성요소가 포함된 기본 저장소입니다. 이 저장소는 중앙 클라우드팀에서 관리될 수 있습니다.
- 이 저장소에서는 각 주요 구성요소(예: 폴더, 네트워크 등)에 대한 디렉터리를 포함합니다.
- 구성요소 디렉터리에서는 앞에서 설명한 디렉터리 구조 가이드에 따라 각 환경에 대해 개별 폴더를 포함합니다.
애플리케이션 및 팀별 저장소
각 팀이 고유한 애플리케이션별 Terraform 구성을 관리할 수 있도록 애플리케이션 및 팀별 저장소를 개별적으로 배포합니다.