디지털오션에서 Terraform 사용하는 방법

소개

Terraform은 구조화된 방식으로 인프라를 구축하고 관리하는 도구입니다. 디지털오션 도로플릿, 로드 밸런서, 심지어 다른 제공업체가 제공하는 다양한 서비스까지 관리할 수 있습니다. Terraform은 명령 줄 인터페이스를 사용하며 데스크톱이나 원격 서버에서 실행할 수 있습니다.

Terraform은 애플리케이션 환경이나 데이터 센터를 구성하는 구성 파일을 읽어들여 작동합니다. 구성에 따라 원하는 상태에 도달하기 위해 수행할 작업을 설명하는 실행 계획을 생성합니다. 그런 다음 Terraform을 사용하여 이 계획을 실행하여 인프라를 구축합니다. 구성 변경이 발생하면 Terraform은 기존 인프라를 새로 설명된 상태로 업데이트하기 위해 증분 계획을 생성하고 실행할 수 있습니다.

이 튜토리얼에서는 Terraform을 설치하고, 두 개의 Nginx 서버로 구성된 디지털오션 인프라를 만들어 로드 밸런서로 균형을 조절한 다음, 디지털오션에 DNS 항목을 추가하여 로드 밸런서로 연결합니다. 이를 통해 Terraform을 사용하여 자신의 요구 사항에 맞는 디지털오션 기반 인프라를 관리하고 배포하는 방법에 대한 개요를 얻을 수 있습니다.

참고:이 튜토리얼은 Terraform 1.1.3에서 테스트되었습니다.

필수 조건

이 튜토리얼을 완료하려면 다음이 필요합니다:

단계 1 — Terraform 설치

Terraform은 데스크톱이나 원격 서버에서 실행하는 명령줄 도구입니다. 설치하려면 해당 패키지를 다운로드하고 PATH에 배치하여 작업 중인 디렉터리에서 실행할 수 있도록합니다.

먼저, OS 및 아키텍처에 맞는 패키지를 공식 다운로드 페이지에서 다운로드합니다. macOS 또는 Linux를 사용하는 경우 curl을 사용하여 Terraform을 다운로드 할 수 있습니다.

macOS에서는 다음 명령을 사용하여 Terraform을 다운로드하고 홈 디렉터리에 배치합니다:

  1. curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_darwin_amd64.zip

Linux에서는 다음 명령을 사용합니다:

  1. curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_linux_amd64.zip

~/opt/terraform 디렉토리를 만듭니다:

  1. mkdir -p ~/opt/terraform

그런 다음 unzip 명령을 사용하여 Terraform을 ~/opt/terraform에 푸는 것입니다. Ubuntu에서는 apt를 사용하여 unzip을 설치할 수 있습니다:

  1. sudo apt install unzip

다음을 실행하여 다운로드 된 아카이브를 ~/opt/terraform 디렉터리로 추출합니다:

  1. unzip ~/terraform.zip -d ~/opt/terraform

마지막으로 ~/opt/terraform을(를) PATH 환경 변수에 추가하여 실행 파일의 전체 경로를 지정하지 않고도 terraform 명령을 실행할 수 있습니다.

리눅스에서는 새 셸이 열릴 때 실행되는 .bashrc에서 PATH를 재정의해야 합니다. 다음 명령을 실행하여 편집합니다:

  1. nano ~/.bashrc

참고: macOS에서는 Bash를 사용하고 있다면 파일 .bash_profile에 경로를 추가하거나 ZSH를 사용하고 있다면 .zshrc에 추가하십시오.

테라폼 경로를 PATH에 추가하려면 파일 끝에 다음 줄을 추가하십시오:

.bashrc
export PATH=$PATH:~/opt/terraform

완료되면 파일을 저장하고 닫으십시오.

이제 모든 새로운 셸 세션에서 terraform 명령을 찾을 수 있게 됩니다. 현재 세션에 새로운 PATH를 로드하려면 리눅스 시스템에서 Bash를 사용하는 경우 다음 명령을 실행하십시오:

  1. . ~/.bashrc

macOS에서 Bash를 사용하는 경우 대신 다음 명령을 실행하십시오:

  1. . .bash_profile

ZSH를 사용하는 경우 다음 명령을 실행하십시오:

  1. . .zshrc

테라폼이 올바르게 설치되었는지 확인하려면 인수 없이 terraform 명령을 실행하십시오:

  1. terraform

다음과 비슷한 출력이 표시됩니다:

Output
Usage: terraform [global options] <subcommand> [args] The available commands for execution are listed below. The primary workflow commands are given first, followed by less common or more advanced commands. Main commands: init Prepare your working directory for other commands validate Check whether the configuration is valid plan Show changes required by the current configuration apply Create or update infrastructure destroy Destroy previously-created infrastructure All other commands: console Try Terraform expressions at an interactive command prompt fmt Reformat your configuration in the standard style force-unlock Release a stuck lock on the current workspace get Install or upgrade remote Terraform modules graph Generate a Graphviz graph of the steps in an operation import Associate existing infrastructure with a Terraform resource login Obtain and save credentials for a remote host logout Remove locally-stored credentials for a remote host output Show output values from your root module providers Show the providers required for this configuration refresh Update the state to match remote systems show Show the current state or a saved plan state Advanced state management taint Mark a resource instance as not fully functional test Experimental support for module integration testing untaint Remove the 'tainted' state from a resource instance version Show the current Terraform version workspace Workspace management Global options (use these before the subcommand, if any): -chdir=DIR Switch to a different working directory before executing the given subcommand. -help Show this help output, or the help for a specified subcommand. -version An alias for the "version" subcommand.

이 명령들은 테라폼이 허용하는 명령입니다. 출력에서 간단한 설명을 확인할 수 있으며, 이 튜토리얼에서 이에 대해 자세히 알아볼 것입니다.

이제 테라폼이 설치되었으니, DigitalOcean의 리소스와 작동하도록 구성해 봅시다.

단계 2 — DigitalOcean을 위한 Terraform 구성

Terraform은 설치할 수 있는 다양한 서비스 제공업체를 통해 제공자를 지원합니다. 각 제공자는 일반적으로 해당 서비스 제공업체의 API에 매핑되는 고유한 사양을 갖습니다.

DigitalOcean 제공자는 Terraform이 인프라를 구축하기 위해 DigitalOcean API와 상호 작용할 수 있게 해줍니다. 이 제공자는 다음을 포함한 다양한 DigitalOcean 리소스를 생성하는 것을 지원합니다:

  • digitalocean_droplet: 드롭렛(서버)
  • digitalocean_loadbalancer: 로드 밸런서
  • digitalocean_domain: DNS 도메인 항목
  • digitalocean_record: DNS 레코드

Terraform은 DigitalOcean 개인 액세스 토큰을 사용하여 DigitalOcean API와 통신하고 계정의 리소스를 관리합니다. 이 키를 다른 사람과 공유하지 마시고, 스크립트 및 버전 관리에서 이를 제외하십시오. 다음 명령을 실행하여 DigitalOcean 개인 액세스 토큰을 DO_PAT이라는 환경 변수로 내보내십시오:

  1. export DO_PAT="your_personal_access_token"

이렇게 하면 후속 명령에서 사용이 쉬워지고 코드에서 분리되어 유지됩니다.

참고: 테라폼과 디지털오션을 자주 사용할 것이라면 이전 단계에서 PATH 환경 변수를 수정한 것과 같은 방법을 사용하여 셸 구성 파일에 이 줄을 추가하세요.

다음 명령을 실행하여 인프라 구성을 저장할 디렉터리를 생성하세요:

  1. mkdir ~/loadbalance

새로 생성된 디렉터리로 이동하세요:

  1. cd ~/loadbalance

테라폼 구성은 확장자가 .tf인 텍스트 파일입니다. 이들은 사람이 읽을 수 있으며 주석을 지원합니다. (테라폼은 JSON 형식의 구성 파일도 지원하지만 이에 대해서는 다루지 않습니다.) 테라폼은 선언적인 방식으로 작업 디렉터리의 모든 구성 파일을 읽으므로 자원 및 변수 정의의 순서는 중요하지 않습니다. 전체 인프라를 단일 구성 파일에 두는 것이 가능하지만, 명확성을 유지하기 위해 자원 유형별로 구성 파일을 분리하는 것이 좋습니다.

테라폼으로 인프라를 구축하는 첫 번째 단계는 사용할 프로바이더를 정의하는 것입니다.

테라폼에서 디지털오션 프로바이더를 사용하려면 테라폼에게 해당 프로바이더에 대해 알려주고 적절한 자격 증명 변수로 플러그인을 구성해야 합니다. 프로바이더 구성을 저장할 provider.tf라는 파일을 생성하세요:

  1. nano provider.tf

다음 줄을 파일에 추가하여 테라폼에게 디지털오션 프로바이더를 사용하고 어디에서 찾을지 알려주세요:

~/loadbalance/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

그런 다음 파일에 다음 변수를 정의하여 나머지 구성 파일에서 이를 참조할 수 있도록 합니다:

  • do_token: 귀하의 DigitalOcean 개인 액세스 토큰입니다.
  • pvt_key: 개인 키 위치, 이를 통해 Terraform이 새로운 Droplets에 로그인하고 Nginx를 설치할 수 있습니다.

이러한 변수의 값을 Terraform 실행 시에 전달하고, 여기에 값을 하드 코딩하는 대신에 더 이동성이 있는 구성을 만듭니다.

이러한 변수를 정의하려면 파일에 다음 라인을 추가하십시오:

~/loadbalance/provider.tf
...
variable "do_token" {}
variable "pvt_key" {}

그런 다음, DigitalOcean 프로바이더를 구성하고 귀하의 DigitalOcean 계정 자격 증명을 지정하려면 do_token을 프로바이더의 token 인수에 할당하십시오:

~/loadbalance/provider.tf
...
provider "digitalocean" {
  token = var.do_token
}

마지막으로, Terraform이 새로 생성하는 모든 Droplets에 SSH 키를 자동으로 추가하도록하려면 원격 키를 DigitalOcean에 추가 할 때 이름을 지정했습니다. Terraform은 이 이름을 사용하여 공개 키를 검색할 수 있습니다. 다음 라인을 추가하십시오. 귀하의 DigitalOcean 계정에서 제공한 키 이름으로 terraform을 바꿉니다:

~/loadbalance/provider.tf
...
data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

완성된 provider.tf 파일은 다음과 같이 보일 것입니다:

~/loadbalance/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

variable "do_token" {}
variable "pvt_key" {}

provider "digitalocean" {
  token = var.do_token
}

data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

작업이 완료되면 파일을 저장하고 닫으십시오.

참고: TF_LOG 환경 변수를 1로 설정하면 Terraform이 수행하려는 작업의 자세한 로깅을 활성화합니다. 다음을 실행하여 설정할 수 있습니다:

  1. export TF_LOG=1

프로젝트에 대해 Terraform을 초기화하려면 다음을 실행하십시오:

  1. terraform init

이렇게하면 구성이 읽히고 프로바이더에 대한 플러그인이 설치됩니다. 출력에 로그인된 것을 볼 수 있습니다:

Output
Initializing the backend... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.16.0... - Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.

만약 Terraform이 예상대로 작동하지 않고 꼼짝없다면, terraform.tfstate 파일을 삭제하고 수동으로 생성된 리소스(예: 제어판을 통해)를 제거하여 다시 시작할 수 있습니다.

Terraform은 이제 구성되어 있으며 DigitalOcean 계정에 연결할 수 있습니다. 다음 단계에서는 Terraform을 사용하여 Nginx 서버를 실행할 Droplet을 정의합니다.

단계 3 — 첫 번째 Nginx 서버 정의

Terraform을 사용하여 DigitalOcean Droplet을 생성하고 Droplet이 시작되면 Droplet에 소프트웨어를 설치할 수 있습니다. 이 단계에서는 Terraform을 사용하여 단일 Ubuntu 20.04 Droplet을 프로비저닝하고 Nginx 웹 서버를 설치합니다.

www-1.tf라는 새 Terraform 구성 파일을 생성하고, Droplet의 구성을 유지할 것입니다:

  1. nano www-1.tf

다음 줄을 삽입하여 Droplet 리소스를 정의합니다:

~/loadbalance/www-1.tf
resource "digitalocean_droplet" "www-1" {
    image = "ubuntu-20-04-x64"
    name = "www-1"
    region = "nyc3"
    size = "s-1vcpu-1gb"
    ssh_keys = [
      data.digitalocean_ssh_key.terraform.id
    ]

앞선 구성에서 첫 번째 줄은 www-1이라는 이름의 digitalocean_droplet 리소스를 정의합니다. 나머지 줄은 Droplet의 속성을 지정합니다. 이 중에는 Droplet이 위치할 데이터 센터와 Droplet의 크기를 식별하는 슬러그도 포함됩니다. 이 경우에는 s-1vcpu-1gb를 사용하며, 이는 하나의 CPU와 1GB의 RAM이 있는 Droplet을 생성합니다. (사용 가능한 슬러그를 확인하려면 이 크기 슬러그 차트를 방문하세요.)

ssh_keys 섹션은 Droplet에 추가하려는 공개 키 목록을 지정합니다. 이 경우에는 provider.tf에서 정의한 키를 지정하고 있습니다. 여기에 지정한 이름이 provider.tf에서 지정한 이름과 일치하는지 확인하십시오.

Terraform을 DigitalOcean API에 대해 실행하면 Droplet에 대한 다양한 정보를 수집합니다. 이 정보는 구성에서 다른 리소스에서 사용할 수 있습니다.

Droplet 리소스에 필요한 인수 또는 선택적 인수가 무엇인지 궁금하다면 공식 Terraform 문서를 참조하십시오: DigitalOcean Droplet Specification.

Terraform이 SSH를 통해 서버에 연결할 수 있는 connection을 설정하려면 다음 줄을 파일 끝에 추가하십시오:

~/loadbalance/www-1.tf
...
connection {
    host = self.ipv4_address
    user = "root"
    type = "ssh"
    private_key = file(var.pvt_key)
    timeout = "2m"
  }

이러한 줄은 Terraform이 서버에 연결하는 방법을 설명합니다. 따라서 Terraform은 SSH를 통해 Nginx를 설치하기 위해 서버에 연결할 수 있습니다. var.pvt_key 변수를 사용하는 것에 유의하십시오 – Terraform을 실행할 때 해당 값이 전달됩니다.

이제 연결을 설정했으므로 Nginx를 설치하는 데 사용할 remote-exec 프로비저너를 구성하십시오. 다음 줄을 구성에 추가하여 작업을 수행하십시오:

~/loadbalance/www-1.tf
...
provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # nginx 설치
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

root 사용자가 Nginx를 설치하기 위해 실행할 명령은 inline 배열의 문자열입니다.

완료된 파일은 다음과 같습니다:

~/loadbalance/www-1.tf
resource "digitalocean_droplet" "www-1" {
  image = "ubuntu-20-04-x64"
  name = "www-1"
  region = "nyc3"
  size = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.terraform.id
  ]
  
  connection {
    host = self.ipv4_address
    user = "root"
    type = "ssh"
    private_key = file(var.pvt_key)
    timeout = "2m"
  }
  
  provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # nginx 설치
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

파일을 저장하고 편집기를 종료합니다. 서버를 정의했으며, 이제 배포할 준비가 되었습니다.

단계 4 — 테라폼을 사용하여 Nginx 서버 만들기

현재의 테라폼 구성은 단일 Nginx 서버를 설명합니다. 이제 드롭렛을 정확히 정의된 대로 배포할 것입니다.

terraform plan 명령을 실행하여 실행 계획 또는 Terraform이 설명한 인프라를 구축하기 위해 시도할 작업을 확인합니다. 디지털오션 액세스 토큰과 개인 키 경로의 값을 지정해야 합니다. 구성에서 이 정보를 사용하여 Nginx를 설치하기 위해 드롭렛에 액세스합니다. 다음 명령을 실행하여 계획을 생성합니다:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

경고: terraform plan 명령은 계획을 저장하기 위한 -out 매개변수를 지원합니다. 그러나 계획은 API 키를 저장하며, 테라폼은 이 데이터를 암호화하지 않습니다. 이 옵션을 사용할 때 다른 사람에게 전송하거나 장기간 보관할 계획이라면 이 파일을 암호화하는 것을 고려해야 합니다.

다음과 같은 출력이 표시됩니다:

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.www-1이 생성됩니다 + resource "digitalocean_droplet" "www-1" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "www-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "nyc3" + resize_disk = true + size = "s-1vcpu-1gb" + ssh_keys = [ + "...", ] + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ─────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

+ 리소스 "digitalocean_droplet" "www-1" 라인은 Terraform이 세부 사항이 뒤따르는 www-1이라는 새로운 Droplet 리소스를 생성할 것을 의미합니다. 이것이 바로 발생해야 할 일입니다. 따라서 현재 계획을 실행하려면 terraform apply 명령을 실행하십시오:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

이전과 동일한 출력을 받게 될 것입니다. 그러나 이번에는 Terraform이 진행할지 여부를 묻습니다:

Output
... Plan: 1 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes

yes를 입력하고 ENTER를 누릅니다. Terraform이 Droplet을 프로비저닝합니다:

Output
digitalocean_droplet.www-1: Creating...

잠시 후, Terraform이 remote-exec 프로비저너를 사용하여 Nginx를 설치하고 프로세스가 완료됩니다:

Output
digitalocean_droplet.www-1: Provisioning with 'remote-exec'... .... digitalocean_droplet.www-1: Creation complete after 1m54s [id=your_www-1_droplet_id] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. ...

Terraform이 www-1이라는 새로운 Droplet을 생성하고 Nginx를 설치했습니다. 새로운 Droplet의 공용 IP 주소를 방문하면 Nginx 환영 화면이 표시됩니다. Droplet이 생성될 때 공용 IP가 표시되었지만 Terraform의 현재 상태를 확인하여 언제든지 볼 수 있습니다. Terraform은 계획을 실행하거나 상태를 새로 고칠 때마다 상태 파일 terraform.tfstate를 업데이트합니다.

환경의 현재 상태를 보려면 다음 명령을 사용하십시오:

  1. terraform show terraform.tfstate

이렇게 하면 Droplet의 공용 IP 주소가 표시됩니다.

Output
resource "digitalocean_droplet" "www-1" { backups = false created_at = "..." disk = 25 id = "your_www-1_droplet_id" image = "ubuntu-20-04-x64" ipv4_address = "your_www-1_server_ip" ipv4_address_private = "10.128.0.2" ...

브라우저에서 http://your_www-1_server_ip로 이동하여 Nginx 서버가 실행 중인지 확인합니다.

주의: Terraform 외부에서 인프라를 수정하면 상태 파일이 오래될 수 있습니다. Terraform 외부에서 리소스가 수정되면 상태 파일을 최신 상태로 업데이트하기 위해 상태 파일을 새로 고쳐야 합니다. 이 명령은 공급자에서 업데이트된 리소스 정보를 가져올 것입니다:

  1. terraform refresh \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

이 단계에서는 Terraform으로 설명한 드롭렛을 배포했습니다. 이제 두 번째 것을 만들겠습니다.

단계 5 — 두 번째 Nginx 서버 생성

이미 Nginx 서버를 설명했으므로 기존 서버의 구성 파일을 복사하고 드롭렛 리소스의 이름과 호스트 이름을 대체하여 빠르게 두 번째 서버를 추가할 수 있습니다.

이를 수동으로 수행할 수 있지만 sed 명령을 사용하여 www-1.tf 파일을 읽고 모든 www-1 인스턴스를 www-2로 대체하고 www-2.tf라는 새 파일을 만드는 것이 더 빠릅니다. 다음은 그 작업을 수행하는 sed 명령입니다:

  1. sed 's/www-1/www-2/g' www-1.tf > www-2.tf

sed에 대해 더 알아보려면 sed 사용하기를 방문하십시오.

terraform plan을 다시 실행하여 Terraform이 수행할 변경 사항을 미리 보십시오:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

출력에서 Terraform이 두 번째 서버인 www-2를 만들 것임을 보여줍니다:

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.www-2가 생성됩니다 + resource "digitalocean_droplet" "www-2" { + backups = false + created_at = (known after apply) + disk = (known after apply) + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "www-2" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = true + region = "nyc3" + resize_disk = true + size = "s-1vcpu-1gb" + ssh_keys = [ + "...", ] + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

terraform apply를 다시 실행하여 두 번째 드롭렛을 생성합니다:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

이전과 마찬가지로, Terraform은 진행하길 원하는지 확인하도록 요청할 것입니다. 계획을 다시 검토하고 계속 진행하려면 yes를 입력하세요.

잠시 후에 Terraform은 새로운 서버를 생성하고 결과를 표시합니다:

Output
digitalocean_droplet.www-2: Creation complete after 1m47s [id=your_www-2_droplet_id] ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Terraform은 새로운 서버를 생성하면서 기존 서버를 변경하지 않았습니다. 추가적인 Nginx 서버를 추가하려면 이 단계를 반복할 수 있습니다.

이제 Nginx를 실행하는 두 개의 드롭렛이 있으므로 트래픽을 분할하는 로드 밸런서를 정의하고 배포할 것입니다.

단계 6 — 로드 밸런서 생성

두 웹 서버 간의 트래픽을 라우팅하기 위해 공식 Terraform 제공자가 지원하는 DigitalOcean 로드 밸런서를 사용할 것입니다.

loadbalancer.tf라는 새로운 Terraform 구성 파일을 생성합니다:

  1. nano loadbalancer.tf

다음 라인을 추가하여 로드 밸런서를 정의합니다:

~/loadbalance/loadbalancer.tf
resource "digitalocean_loadbalancer" "www-lb" {
  name = "www-lb"
  region = "nyc3"

  forwarding_rule {
    entry_port = 80
    entry_protocol = "http"

    target_port = 80
    target_protocol = "http"
  }

  healthcheck {
    port = 22
    protocol = "tcp"
  }

  droplet_ids = [digitalocean_droplet.www-1.id, digitalocean_droplet.www-2.id ]
}

로드 밸런서 정의는 이름, 위치하는 데이터 센터, 트래픽을 균형 잡기 위해 수신 대기할 포트, 헬스 체크를 위한 구성, 및 균형을 맞출 드롭렛의 ID를 지정합니다. Terraform 변수를 사용하여 이들을 가져옵니다. 파일을 저장하고 닫습니다.

terraform plan 명령을 다시 실행하여 새로운 실행 계획을 검토합니다:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

다음과 같은 여러 줄의 출력을 볼 수 있습니다:

Output
... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_loadbalancer.www-lb가 생성될 것입니다 + resource "digitalocean_loadbalancer" "www-lb" { + algorithm = "round_robin" + disable_lets_encrypt_dns_records = false + droplet_ids = [ + ..., + ..., ] + enable_backend_keepalive = false + enable_proxy_protocol = false + id = (known after apply) + ip = (known after apply) + name = "www-lb" + redirect_http_to_https = false + region = "nyc3" + size_unit = (known after apply) + status = (known after apply) + urn = (known after apply) + vpc_uuid = (known after apply) + forwarding_rule { + certificate_id = (known after apply) + certificate_name = (known after apply) + entry_port = 80 + entry_protocol = "http" + target_port = 80 + target_protocol = "http" + tls_passthrough = false } + healthcheck { + check_interval_seconds = 10 + healthy_threshold = 5 + port = 22 + protocol = "tcp" + response_timeout_seconds = 5 + unhealthy_threshold = 3 } + sticky_sessions { + cookie_name = (known after apply) + cookie_ttl_seconds = (known after apply) + type = (known after apply) } } Plan: 1 to add, 0 to change, 0 to destroy. ...

이는 www-1www-2 드롭렛이 이미 존재하며 Terraform이 www-lb 로드 밸런서를 생성할 것임을 의미합니다.

로드 밸런서를 구축하려면 terraform apply를 실행하십시오:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

다시 한번, Terraform은 계획을 검토하도록 요청할 것입니다. 계획을 승인하려면 yes를 입력하여 계속하십시오.

그렇게 하면 다음 줄을 포함한 출력이 표시됩니다(간결함을 위해 일부 내용이 줄어듭니다):

Output
... digitalocean_loadbalancer.www-lb: Creating... ... digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id] ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed. ...

terraform show terraform.tfstate를 사용하여 로드 밸런서의 IP 주소를 찾습니다:

  1. terraform show terraform.tfstate

IP는 www-lb 항목 하위에 있습니다:

Output
... # digitalocean_loadbalancer.www-lb: resource "digitalocean_loadbalancer" "www-lb" { algorithm = "round_robin" disable_lets_encrypt_dns_records = false droplet_ids = [ your_www-1_droplet_id, your_www-2_droplet_id, ] enable_backend_keepalive = false enable_proxy_protocol = false id = "your_load_balancer_id" ip = "your_load_balancer_ip" name = "www-lb" ...

브라우저에서 http://your_load_balancer_ip로 이동하면 로드 밸런서가 두 Nginx 서버 중 하나로 트래픽을 보내기 때문에 Nginx 환영 화면이 표시됩니다.

이제 Terraform을 사용하여 DigitalOcean 계정의 DNS를 구성하는 방법을 배웁니다.

단계 7 — DNS 도메인 및 레코드 생성

Droplets 및 로드 밸런서 외에도 Terraform은 DNS 도메인 및 레코드 도메인을 생성할 수 있습니다. 예를 들어, 도메인을 로드 밸런서로 지정하려면 해당 관계를 설명하는 구성을 작성할 수 있습니다.

참고: 고유한 도메인 이름을 사용하거나 Terraform이 DNS 리소스를 배포할 수 없습니다. 도메인이 DigitalOcean 네임 서버를 가리키는지 확인하십시오.

새 파일을 만들어 DNS를 설명하세요:

  1. nano domain_root.tf

다음 도메인 리소스를 추가하고, your_domain을(를) 사용자의 도메인 이름으로 바꿉니다:

~/loadbalance/domain_root.tf
resource "digitalocean_domain" "default" {
   name = "your_domain"
   ip_address = digitalocean_loadbalancer.www-lb.ip
}

작업을 완료하면 파일을 저장하고 닫으십시오.

www.your_domainyour_domain에 지정하는 CNAME 레코드를 추가할 수도 있습니다. CNAME 레코드용 새 파일을 만드세요:

  1. nano domain_cname.tf

다음 줄을 파일에 추가하십시오:

domain_cname.tf
resource "digitalocean_record" "CNAME-www" {
  domain = digitalocean_domain.default.name
  type = "CNAME"
  name = "www"
  value = "@"
}

작업을 완료하면 파일을 저장하고 닫으십시오.

DNS 항목을 추가하려면 다른 리소스와 마찬가지로 terraform plan을 실행한 다음 terraform apply를 실행하십시오.

도메인 이름으로 이동하면 로드 밸런서로 트래픽을 보내는 도메인 때문에 Nginx 환영 화면이 표시됩니다. 이 로드 밸런서는 두 개의 Nginx 서버 중 하나로 트래픽을 보냅니다.

단계 8 — 인프라 파괴

비록 프로덕션 환경에서는 일반적으로 사용되지 않지만, Terraform은 생성한 인프라를 파괴할 수도 있습니다. 이것은 주로 여러 번 배포되고 파괴되는 개발 환경에서 유용합니다.

먼저, terraform plan -destroy를 사용하여 인프라를 파괴하기 위한 실행 계획을 생성하십시오:

  1. terraform plan -destroy -out=terraform.tfplan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

Terraform은 자원이 빨간색으로 표시된 계획을 출력하고, 앞에 마이너스 부호가 붙어 해당 자원을 인프라에서 삭제할 것임을 나타냅니다.

그런 다음 계획을 실행하려면 terraform apply를 사용하십시오:

  1. terraform apply terraform.tfplan

Terraform은 생성된 계획에 따라 자원을 파괴하기 시작합니다.

결론

이 튜토리얼에서는 DigitalOcean에서 로드 밸런스된 웹 인프라를 두 개의 Nginx 웹 서버가 DigitalOcean 로드 밸런서 뒤에서 실행되도록 Terraform을 사용하여 구축했습니다. 현재 상태를 보고 Terraform을 사용하여 DNS 항목을 구성하는 방법을 알게 되었습니다.

이제 Terraform이 작동하는 방식을 이해했으므로 자신의 프로젝트를 위한 서버 인프라를 설명하는 구성 파일을 만들 수 있습니다. 이 튜토리얼의 예제는 서버 배포를 자동화하는 방법을 보여주는 좋은 시작점입니다. 이미 프로비저닝 도구를 사용하고 있다면 이를 Terraform과 통합하여 프로비저닝 방법 대신 서버를 구성하는 데 사용할 수 있습니다.

Terraform에는 더 많은 기능이 있으며 다른 공급업체와 함께 작동할 수 있습니다. 자신의 인프라를 개선하는 데 Terraform을 사용하는 방법에 대해 알아보려면 공식 Terraform 문서를 확인하십시오.

이 자습서는 Terraform으로 인프라 관리하는 방법 시리즈의 일부입니다. 이 시리즈는 처음으로 Terraform을 설치하는 것부터 복잡한 프로젝트를 관리하는 것까지 다양한 Terraform 주제를 다룹니다.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean