Navigator 가이드: 모듈식 인프라 구성

Navigator 가이드: 모듈식 인프라 구성

2022-06-01 last update

6 minutes reading Terraform Configuration Management Solutions Ansible
참고: Digital Ocean 솔루션 엔지니어가 제공하는 Navigator 안내서의 초기 버전입니다.이 책의 목표는 기업 고객이 인프라 수요를 기획하고 지속적인 업무 예시를 제공하며 기술적인 미세한 차이와 일부 결정을 다른 결정보다 우수하게 하는 원인을 포함하는 것이다.
이 책과 함께 제공되는 코드는 GitHub 저장소에서 공개됩니다.이것은 초기 버전이기 때문에 이 책은 아직 완성되지 않았고 저장소는 아직 공개되지 않았지만 계속 관심을 가져 주십시오!
이전 섹션에서는 Terraform 및 Ansible을 사용하여 용량 할당(Drops, 로드 밸런싱 및 부동 IP) 및 WordPress 응용 프로그램을 배포했습니다.
Terraform은 main.tf 파일을 사용하여 이러한 리소스를 생성합니다.현재 이 파일의 모든 자원은 단독으로 열거되어 있다.환경이 복잡할수록 필요한 자원이 많아지고 파일도 길어지고 복잡해집니다.이것은 당신의 설정을 더욱 장기적으로 관리하기 어렵게 할 것입니다.
이 보충 부분에서 우리는 지형 모듈과 단독 인프라 환경을 이용하여 이 배치를 간소화하는 몇 가지 방법을 토론할 것이다.이 절에는 실행할 코드도 없고 변경할 것도 없지만 실제 설정을 구축할 때 이러한 개념은 매우 중요하다.

지형 이해 모듈


Terraform 자체 모듈 설명 사용하기

Modules in Terraform are self-contained packages of Terraform configurations that are managed as a group. Modules are used to create reusable components in Terraform as well as for basic code organization.


모듈은 고급 프로그래밍 언어의 함수와 같이 입력을 받아들이고 출력을 제공할 수 있는 재사용 가능한 기초 구조 블록을 만든다.우리는 모듈을 만들어서 우리의 기초 구조의 유사한 부분에 대해 선택할 수 있는 입력 파라미터를 받아들일 수 있고 이 입력 파라미터에 대한 기본값을 설정할 수 있다.이것은 구성을 구성하고 간소화하는 데 도움이 됩니다.모듈에 대한 자세한 내용은 Terraform’s module documentation에서 확인할 수 있습니다.
전체 예제에 대해서는 main.tf 파일을 보십시오.마지막 섹션에서는 Terraform 모듈을 실제로 사용하고 있습니다.
module "sippin_db" {
  source           = "github.com/cmndrsp0ck/galera-tf-mod.git?ref=v1.0.6"
  ...
}
이 부분을 파일 맨 위에 있는 wp_node의 자원 블록과 비교할 수 있습니다. 이 자원 블록의 코드 줄이 더 많고 이해하기 어렵습니다.이 모듈은 원격git 저장소에서 호출되는 것을 알 수 있습니다.로컬 파일 경로를 사용할 수 있습니다. 이것은 빠른 개발과 테스트에 사용할 수 있지만, 원격gitrepo를 사용하면 환경을 더욱 격리할 수 있습니다.이것은 여러 인프라 환경(예를 들어 임시 저장과 생산)을 실행할 때 특히 유용하다.여러 인프라 환경에서 로컬 파일 경로를 사용할 때, 전송에만 영향을 주는 변경을 할 수 있지만, 프로토콜에서 apply를 실행하고 모듈 파일 경로를 공유하고 있다면, 일부 내용을 파괴할 수 있습니다.모든 환경에 전용 디렉터리가 있다면, 스크립트의 두 개 이상의 복사본을 유지해야 하며, 이전의 상태로 복구하는 것은 쉽지 않을 것입니다.
원격git 저장소를 사용하고 모듈에 버전 번호를 지정하면 이 문제를 피할 수 있습니다.앞에서 설명한 바와 같이 문제가 발생하면 알려진 작업 버전으로 쉽게 복구하여 이벤트 및 다운타임 관리 능력을 향상시킬 수 있습니다 (9장에서 자세히 설명하겠습니다).
이 모듈은 액체를 만드는 것만은 아니다.이것은 플러그 라벨, Galera 군집 노드, 부하 평형기 및 부동 IP를 생성합니다.terraform 모듈은 전체 서비스 구성 요소를 포장하거나 포장하는 좋은 방법이라고 생각할 수 있습니다.이것은 모듈에 더 많은 자원을 추가하거나 모듈 출력을 만들 수 있다는 것을 의미한다. 이 출력은 당신이 개발 중인 다른 모듈의 입력으로 사용할 수 있다.새 서비스 추가 또는 일부 지원 기능과 같은 새 모듈을 만드는 것이 의미가 있을 때 모듈에서 출력을 만들고 상태의 일부로 저장할 수 있습니다.원격 상태를 사용하고 있다면, 인프라스트럭처의 다양한 구성 요소 간에 읽기 전용 정보를 공유하거나 외부 서비스를 제공하여 필요한 정보를 검색하고자 할 때 모듈 출력이 매우 유용할 수 있습니다.
간단하게 말하면 지형도의 자원 부분을 레고 블록으로 간주하면 모듈은 미리 조립된 부분이 됩니다.여기저기 레고 블록을 추적하고 밟는 것보다 훨씬 낫다.이 모듈은 이러한 고통을 방지하는 데 도움이 될 뿐만 아니라 인프라 계획에 복잡성을 증가시킬 때 다른 모듈의 구성을 알리는 데도 사용할 수 있습니다.

인프라 환경 설정


대부분의 전문 프로젝트에서 당신은 세 가지 다른 환경을 사용할 것입니다. 그것이 바로 개발, 임시 저장과 생산입니다.
개발 환경은 일반적으로 로컬이며 작업할 때 독립적으로 수리하고 테스트할 수 있는 공간을 제공합니다.다른 한편, 임시 저장 및 생산 환경은 공유나 공공 공간에 위치하고 Terraform 같은 자동화 프로세스를 사용하여 조정됩니다.
심사숙고와 기획을 거친 배치 작업 흐름부터 골치 아픈 문제를 피하는 데 큰 도움이 될 것이다. 그 중 일부는 환경을 서로 격리시키는 것을 포함한다.Terraform의 작업 영역 기능은 terraform.tfstate개의 파일을 모든 환경에서 독립적으로 유지하지만, 자원을 설명하는 Terraform 파일에 대한 변경은 그렇지 않습니다.따라서 이 기능은 작은 변경, 테스트, 배치를 신속하게 하는 방법이 될 수 있지만, 더 큰 배치가 있으면 서비스를 다른 서비스와 관리 서비스의 팀과 격리해야 할 때 의존해서는 안 된다.
다음은 디렉터리 트리 예제입니다. 디렉터리를 사용하여 환경 격리를 설정하는 방법에 대해 설명합니다.
.
├── ansible.cfg
├── bin/
├── environments/
│   ├── config/
│   │   └── cloud-config.yaml
│   │
│   ├── dev/
│   ├── prod/
│   │   ├── config -> ../config
│   │   ├── group_vars
│   │   ├── host_vars
│   │   ├── main.tf
│   │   ├── terraform.tfvars
│   │   ├── terraform-inventory -> ../terraform-inventory
│   │   └── variables.tf
│   │
│   ├── staging/
│   │   ├── config -> ../config
│   │   ├── group_vars
│   │   ├── host_vars
│   │   ├── main.tf
│   │   ├── terraform.tfvars
│   │   ├── terraform-inventory -> ../terraform-inventory
│   │   └── variables.tf
│   │
│   └── terraform-inventory
│
├── site.yml
├── wordpress.yml
│
└── roles/
이 레이아웃의 핵심 논리는 유사한 구성 요소에 속하는 파일을 서로 다른 환경에서 격리시키는 것이다.
예를 들어 environments 디렉터리에서 우리는 필요한 세 가지 환경 중 하나에 하나의 하위 디렉터리를 가지고 있다. dev, stagingprod이다.이러한 격리는 잘못된 위치에서 Ansible 또는 Terraform 스크립트가 예기치 않게 실행되는 것을 방지하는 데 도움이 됩니다.한 걸음 더 나아가 다른 층 하위 디렉터리를 사용하여 환경 인프라마다 다른 부분의 파일을 저장할 수 있습니다.
인터넷에는 many great write-ups about this topic권이 있는데, 그 중 한 권은 사실상 예프지니 브리크만(Yevgeniy Brikman)의 《Terraform: Up & Running》이라는 책이 되었다.

환경에 모듈 버전 제어 사용


Terraform 모듈은 다른 환경에 영향을 주지 않고 변경할 수 있도록 도와줍니다.예를 들어 이 두 모듈을 보세요.
임시 환경(예: staging/main.tf):
module "sippin_db" {
  source           = "github.com/cmndrsp0ck/galera-tf-mod.git?ref=v1.0.8"
  project          = "${var.project}"
  region           = "${var.region}"
  keys             = "${var.keys}"
  private_key_path = "${var.private_key_path}"
  ssh_fingerprint  = "${var.ssh_fingerprint}"
  public_key       = "${var.public_key}"
  ansible_user     = "${var.ansible_user}"
}
운영 환경용 1개(예: prod/main.tf):
module "sippin_db" {
  source           = "github.com/cmndrsp0ck/galera-tf-mod.git?ref=v1.0.6"
  project          = "${var.project}"
  region           = "${var.region}"
  keys             = "${var.keys}"
  private_key_path = "${var.private_key_path}"
  ssh_fingerprint  = "${var.ssh_fingerprint}"
  public_key       = "${var.public_key}"
  ansible_user     = "${var.ansible_user}"
}
그들 사이의 유일한 차이점은 ref 줄 끝에 있는 source 키의 값입니다. 이 값은 배치할 버전을 지정합니다.무대에서는 v1.0.8, 제작에서는 v1.0.6이다.버전 제어를 사용하면 생산 환경에 배치하기 전에 임시 저장에서 변경 사항을 변경하고 테스트할 수 있습니다. 유사한 설정은 이 설정을 지원하는 설정을 간소화할 수 있습니다.
현재 이전 절의 실제 작업 설정은 원격 상태를 사용하지 않습니다.6장에서 우리는 원격 상태 백엔드 (예를 들어 concur) 를 어떻게 사용하는지 소개할 것이다. 이것은 팀에서 일할 때 매우 관건적이다.원격 상태 백엔드가 없으면 다른 팀 멤버와 인프라를 동시에 변경하여 상태 파일이 충돌하거나 중단되거나 손상될 수 있습니다.

다음은 무엇입니까?


모듈화를 통해 인프라 코드를 간소화하고 환경을 격리하여 더욱 안전한 개발과 배치를 실현하는 방법을 알게 되면 템플릿을 만들어서 배치 속도를 높이는 방법을 볼 수 있습니다.다음 장은 지속적인 개발 도구를 사용하여 작업 흐름을 자동화하는 방법을 소개할 것입니다. 이것은 당신이 안전하고 신속하게 새 코드를 배치하는 데 도움을 줄 것입니다.