Consul 네트워크 인프라 자동화를 위한 Terraform 드라이버
Consul 네트워크 인프라 자동화를 위한 Terraform 드라이버
Consul-Terraform-Sync(CTS)는 Terraform을 공식 지원 도구 프로젝트로 포함하도록 Consul 생태계를 확장해요. Terraform 드라이버를 사용하면 CTS가 로컬에서 Terraform CLI를 설치하고 감시된 Consul 변경 사항을 기반으로 Terraform 명령을 실행해요.
출처: 문서
본문
Consul-Terraform-Sync(CTS)는 Terraform을 공식 지원 도구 프로젝트로 포함하도록 Consul 생태계를 확장합니다. Terraform 드라이버를 사용하면 CTS가 로컬에서 Terraform CLI를 설치하고 감시된 Consul 변경 사항을 기반으로 Terraform 명령을 실행합니다. 이 페이지는 Terraform 드라이버가 로컬 워크스페이스와 템플릿 파일을 사용하여 어떻게 작동하는지 자세히 설명합니다.
Terraform CLI 자동화 (Terraform CLI Automation)
시작 시 CTS는 다음을 수행합니다.
- Terraform 다운로드 및 설치
- 로컬 워크스페이스 디렉터리 준비. 각 태스크의 Terraform 구성과 실행은 별도의 Terraform 워크스페이스로 구성됩니다. 태스크의 상태 파일은 서로 독립적입니다.
- 각 태스크의 루트 모듈을 구성하는 Terraform 구성 파일 생성.
모든 워크스페이스가 설정되면 CTS는 서비스 변경사항에 대해 Consul 카탈로그를 모니터링합니다. 관련 변경이 감지되면 Terraform 드라이버는 해당 태스크에 대한 입력 변수를 동적으로 업데이트하고, 템플릿을 사용하여 이를 terraform.tfvars라는 파일로 렌더링합니다. 이 파일은 terraform plan과 terraform apply를 실행할 때 매개변수로 Terraform CLI에 전달되어 최신 Consul 서비스 세부 정보로 네트워크 인프라를 업데이트합니다.
로컬 워크스페이스 (Local Workspaces)
태스크에 대한 CTS 구성 내에서 사용자는 태스크에 대해 실행할 원하는 모듈을 선택하고 태스크를 실행할 조건을 설정할 수 있습니다. Terraform 드라이버가 실행하는 각 태스크는 격리된 Terraform 환경에서 선택한 모듈을 호출하는 자동화된 루트 모듈에 해당합니다. CTS는 이러한 태스크의 동시 실행을 관리합니다.
태스크에 대한 자동 생성된 루트 모듈은 CTS 작업 디렉터리의 로컬 하위 디렉터리에 유지됩니다. 각 하위 디렉터리는 태스크의 로컬 워크스페이스를 나타냅니다. 기본적으로 sync-tasks 작업 디렉터리가 현재 디렉터리에 생성됩니다. Terraform 구성 파일이 저장되는 위치를 구성하려면 working_dir을 원하는 경로로 설정하거나 task.working_dir을 개별적으로 구성하세요.
참고: 태스크 워크스페이스의 Terraform 상태 파일은 독립적이지만, 이는 동시 태스크 실행으로 인한 인프라 변경이 독립적임을 보장하지 않습니다. 모든 태스크의 모듈이 동일한 리소스 객체를 수정하지 않거나 자동화 중 경합 조건(race condition)을 초래할 수 있는 겹치는 변경이 없는지 확인하세요.
루트 모듈 (Root Module)
루트 모듈은 Consul 정보, 구성, 기타 변수를 태스크의 Terraform 모듈에 프록시합니다. 루트 모듈을 구성하는 파일의 내용은 CTS 구성, 태스크의 모듈이 자동화 플레이북으로 사용할 정보, 서비스 정보와 같은 Consul의 정보에서 가져옵니다.
cts-example이라는 태스크 하나가 있는 작업 디렉터리는 Terraform 드라이버로 실행할 때 아래의 폴더 구조를 갖습니다.
$ tree sync-tasks/
sync-tasks/
└── cts-example/
├── main.tf
├── variables.tf
├── terraform.tfvars
└── terraform.tfvars.tmpl
각 태스크에 대해 루트 모듈의 다음 파일이 생성됩니다. CTS가 생성한 루트 모듈의 예시는 프로젝트 리포지토리에서 찾을 수 있습니다.
main.tf- 메인 파일에는 terraform 블록, provider 블록, 그리고 태스크에 대해 구성된 모듈을 호출하는 module 블록이 포함됩니다.terraform블록 - 구성 파일에서 태스크에 해당하는 공급자 소스와 버전이 루트 모듈을 위해 이 블록에 배치됩니다. 구성의 Terraform 백엔드도 여기에 템플릿화됩니다.provider블록 - 루트 모듈에 생성된 provider 블록은 CTS 구성의terraform_provider블록과 유사합니다. 동일한 인자를 가지며 공급자별로 생성된 중간 변수에서 설정됩니다.module블록 - module 블록은 태스크의 모듈이 자식 모듈(child module)로 호출되는 곳입니다. 자식 모듈에는 자동화의 핵심 로직이 포함됩니다. 필수 및 선택 입력 변수가 모듈에 인자로 전달됩니다.
variables.tf- 이 파일에는 세 가지 유형의 변수 선언이 포함됩니다.services입력 변수(필수)는 모듈의 Consul-Terraform-Sync 호환성을 결정합니다(자세한 내용은 호환 Terraform 모듈 참조).- CTS가 제공하는 추가 선택 입력 변수로 모듈이 사용할 수 있습니다.
- 공급자 구성에 사용되는 다양한 중간 변수. 중간 공급자 변수는 CTS 구성에 구성된 provider 블록과 인자에서 보간됩니다.
variables.module.tf- 태스크에 대해 구성된 변수가 있으면 생성되며 구성의 변수와 일치하는 보간된 변수 선언을 포함합니다. 이들은 module 블록에서 명시적 할당을 통해 구성된 변수를 모듈에 프록시하는 데 사용됩니다.providers.tfvars- 태스크에 대해 구성된 공급자와 정의된terraform_provider블록이 있으면 생성됩니다. 이 파일은 민감한 정보를 포함할 수 있습니다. 이 파일에서 민감한 정보를 생략하려면 환경 변수나 템플릿 사용을 통해 CTS용 Terraform 공급자를 안전하게 구성할 수 있습니다.terraform.tfvars- 변수 정의 파일로, services 입력 변수와 선택 CTS 입력 변수에 Consul의 값이 할당됩니다. 일반적으로 태스크 조건이 충족될 때 주기적으로 업데이트되어 Consul의 현재 상태를 반영합니다.terraform.tfvars.tmpl- 템플릿 파일은 HashiCorp 구성 및 템플릿 라이브러리(hashicorp/hcat)를 사용하여 Consul의 정보를 템플릿화하는 데 CTS가 사용합니다.
참고: 생성된 템플릿과 Terraform 구성 파일은 태스크 자동화에 중요합니다. 파일을 수동으로 변경하면 보존되지 않을 수 있으며 후속 업데이트로 덮어쓸 수 있습니다. 파일 형식에 대한 예상치 못한 수동 변경은 자동화 오류를 초래할 수 있습니다.