웹사이트 검색

Terraform을 함께 사용하는 방법


소개

Terraform은 조직화된 방식으로 인프라를 구축하고 관리하기 위한 도구입니다. 이를 사용하여 다른 공급자가 제공하는 다양한 서비스 외에도 DigitalOcean Droplets, 로드 밸런서 및 DNS 항목을 관리할 수 있습니다. Terraform은 명령줄 인터페이스를 사용하며 데스크톱 또는 원격 서버에서 실행할 수 있습니다.

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

이 튜토리얼에서는 Terraform을 설치하고 이를 사용하여 DigitalOcean 로드 밸런서에 의해 로드 밸런싱되는 두 개의 Nginx 서버로 구성된 DigitalOcean에 인프라를 생성합니다. 그런 다음 Terraform을 사용하여 Load Balancer를 가리키는 DigitalOcean에 DNS 항목을 추가합니다. 이를 통해 Terraform 사용을 시작하는 데 도움이 되며 이를 사용하여 자신의 필요에 맞는 DigitalOcean 기반 인프라를 관리하고 배포하는 방법에 대한 아이디어를 얻을 수 있습니다.

참고: 이 자습서는 Terraform 1.1.3에서 테스트되었습니다.

전제 조건

이 자습서를 완료하려면 다음이 필요합니다.

  • DigitalOcean 계정. 계정이 없으면 새 계정에 가입하세요.
  • DigitalOcean 제어판을 통해 생성할 수 있는 DigitalOcean 개인 액세스 토큰. 이에 대한 지침은 개인 액세스 토큰을 만드는 방법에서 찾을 수 있습니다.
  • DigitalOcean 계정에 암호가 없는 SSH 키가 추가되었습니다. 이 키는 DigitalOcean Droplets와 함께 SSH 키를 사용하는 방법에 따라 생성할 수 있습니다. 계정에 키를 추가할 때 이 자습서에서 필요하므로 지정한 이름을 기억하십시오. (Terraform이 키 이름을 수락하려면 문자 또는 밑줄로 시작해야 하며 문자, 숫자, 밑줄 및 대시만 포함할 수 있습니다.)
  • 개인 도메인은 DigitalOcean의 이름 서버를 가리키며, 공통 도메인 등록 기관에서 DigitalOcean 이름 서버를 가리키는 방법 자습서를 따라 수행할 수 있습니다.

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/terraformPATH 환경 변수에 추가하여 실행 파일의 전체 경로를 지정하지 않고 terraform 명령을 실행할 수 있습니다.

Linux에서는 새 셸이 열릴 때 실행되는 .bashrc에서 PATH를 재정의해야 합니다. 다음을 실행하여 편집용으로 엽니다.

  1. nano ~/.bashrc

참고: macOS에서는 Bash를 사용하는 경우 .bash_profile 파일에 경로를 추가하고 ZSH를 사용하는 경우 .zshrc에 경로를 추가합니다.

Terraform의 경로를 PATH에 추가하려면 파일 끝에 다음 행을 추가하십시오.

export PATH=$PATH:~/opt/terraform

완료되면 파일을 저장하고 닫습니다.

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

  1. . ~/.bashrc

macOS에서 Bash를 사용하는 경우 대신 다음 명령을 실행합니다.

  1. . .bash_profile

ZSH를 사용하는 경우 다음 명령을 실행합니다.

  1. . .zshrc

Terraform을 올바르게 설치했는지 확인하려면 인수 없이 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.

Terraform이 수락하는 명령입니다. 출력은 간단한 설명을 제공하며 이 자습서 전체에서 이에 대해 자세히 알아볼 것입니다.

이제 Terraform이 설치되었으므로 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"

이렇게 하면 후속 명령에서 더 쉽게 사용할 수 있고 코드와 별도로 유지할 수 있습니다.

참고: Terraform 및 DigitalOcean을 자주 사용하는 경우 이전 단계에서 PATH 환경 변수를 수정하는 데 사용한 것과 동일한 접근 방식을 사용하여 이 줄을 셸 구성 파일에 추가합니다.

다음 명령을 실행하여 인프라 구성을 저장할 디렉터리를 만듭니다.

  1. mkdir ~/loadbalance

새로 생성된 디렉터리로 이동합니다.

  1. cd ~/loadbalance

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

Terraform으로 인프라를 구축하는 첫 번째 단계는 사용할 공급자를 정의하는 것입니다.

Terraform과 함께 DigitalOcean 공급자를 사용하려면 Terraform에 이에 대해 알리고 적절한 자격 증명 변수로 플러그인을 구성해야 합니다. 공급자에 대한 구성을 저장할 provider.tf라는 파일을 만듭니다.

  1. nano provider.tf

파일에 다음 줄을 추가하여 Terraform에 DigitalOcean 공급자를 사용하고 싶다고 알려주고 Terraform에 공급자를 찾을 위치를 지시합니다.

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

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

  • do_token: DigitalOcean 개인 액세스 토큰.
  • pvt_key: 개인 키 위치이므로 Terraform에서 이를 사용하여 새 Droplet에 로그인하고 Nginx를 설치할 수 있습니다.

여기에서 값을 하드 코딩하지 않고 실행할 때 이러한 변수의 값을 Terraform으로 전달합니다. 이렇게 하면 구성의 이식성이 향상됩니다.

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

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

그런 다음 다음 줄을 추가하여 DigitalOcean 공급자를 구성하고 공급자의 token 인수에 do_token을 할당하여 DigitalOcean 계정에 대한 자격 증명을 지정합니다.

...
provider "digitalocean" {
  token = var.do_token
}

마지막으로 Terraform이 생성한 새 Droplet에 SSH 키를 자동으로 추가하도록 할 수 있습니다. SSH 키를 DigitalOcean에 추가할 때 이름을 지정했습니다. Terraform은 이 이름을 사용하여 공개 키를 검색할 수 있습니다. 다음 줄을 추가하고 terraform을 DigitalOcean 계정에 제공한 키 이름으로 바꿉니다.

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

완료된 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이 회전하면 소프트웨어를 설치할 수 있습니다. 이 단계에서는 단일 Ubuntu 20.04 Droplet을 프로비저닝하고 Terraform을 사용하여 Nginx 웹 서버를 설치합니다.

Droplet에 대한 구성을 보유할 www-1.tf라는 새 Terraform 구성 파일을 만듭니다.

  1. nano www-1.tf

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

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의 속성을 지정합니다. 이 경우 s-1vcpu-1gb를 사용하고 있으며, 이는 하나의 CPU와 1GB의 RAM으로 Droplet을 생성합니다. (이 크기 슬러그 차트를 방문하여 사용할 수 있는 슬러그를 확인하십시오.)

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

DigitalOcean API에 대해 Terraform을 실행하면 공개 및 비공개 IP 주소와 같은 Droplet에 대한 다양한 정보가 수집됩니다. 이 정보는 구성의 다른 리소스에서 사용할 수 있습니다.

Droplet 리소스에 대해 어떤 인수가 필수 또는 선택 사항인지 궁금하면 공식 Terraform 설명서: DigitalOcean Droplet 사양을 참조하십시오.

Terraform이 SSH를 통해 서버에 연결하는 데 사용할 수 있는 연결을 설정하려면 파일 끝에 다음 줄을 추가합니다.

...
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 프로비저너를 구성합니다. 이를 위해 구성에 다음 줄을 추가합니다.

...
provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # install nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

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

완성된 파일은 다음과 같습니다.

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",
      # install nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

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

4단계 - Terraform을 사용하여 Nginx 서버 생성

현재 Terraform 구성은 단일 Nginx 서버를 설명합니다. 이제 Droplet을 정의된 대로 정확하게 배포합니다.

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

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

경고: terraform plan 명령은 -out 매개변수를 지원하여 계획을 저장합니다. 그러나 계획은 API 키를 저장하며 Terraform은 이 데이터를 암호화하지 않습니다. 이 옵션을 사용하는 경우 이 파일을 다른 사람에게 보내거나 장기간 미사용 상태로 두려는 경우 이 파일을 암호화하는 방법을 살펴봐야 합니다.

다음과 유사한 출력이 표시됩니다.

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 will be created + 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.

+ resource \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...

약간의 시간이 지나면 remote-exec 프로비저너로 Nginx를 설치하는 Terraform이 표시되고 프로세스가 완료됩니다.

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 시작 화면이 표시됩니다. 공인 IP는 Droplet이 생성될 때 표시되지만 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에서 설명한 Droplet을 배포했습니다. 이제 두 번째 항목을 만듭니다.

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

이제 Nginx 서버에 대해 설명했으므로 기존 서버의 구성 파일을 복사하고 Droplet 리소스의 이름과 호스트 이름을 교체하여 신속하게 두 번째 서버를 추가할 수 있습니다.

이 작업을 수동으로 수행할 수 있지만 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 계획을 다시 실행하여 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 will be created + 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를 다시 실행하여 두 번째 Droplet을 만듭니다.

  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를 실행하는 두 개의 Droplet이 있으므로 로드 밸런서를 정의하고 배포하여 그들 간에 트래픽을 분할합니다.

6단계 - 로드 밸런서 생성

공식 Terraform 공급자가 지원하는 DigitalOcean Load Balancer를 사용하여 두 웹 서버 간에 트래픽을 라우팅합니다.

loadbalancer.tf라는 새 Terraform 구성 파일을 만듭니다.

  1. nano 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 ]
}

Load Balancer 정의는 해당 이름, 위치할 데이터 센터, 트래픽 균형을 유지하기 위해 수신 대기해야 하는 포트, 상태 확인을 위한 구성, 균형을 유지해야 하는 Droplet의 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 will be created + 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 Droplet이 이미 존재하고 Terraform이 www-lb 로드 밸런서를 생성함을 의미합니다.

terraform apply를 실행하여 Load Balancer를 빌드합니다.

  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

www-lb 항목 아래에서 IP를 찾을 수 있습니다.

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로 이동하면 Load Balancer가 두 Nginx 서버 중 하나로 트래픽을 전송하기 때문에 Nginx 시작 화면이 표시됩니다.

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

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

Droplet 및 Load Balancer 외에도 Terraform은 DNS 도메인 및 레코드 도메인을 생성할 수 있습니다. 예를 들어 도메인이 Load Balancer를 가리키도록 하려면 해당 관계를 설명하는 구성을 작성할 수 있습니다.

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

DNS를 설명하는 새 파일을 만듭니다.

  1. nano domain_root.tf

다음 도메인 리소스를 추가하고 your_domain을 도메인 이름으로 바꿉니다.

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

파일에 다음 줄을 추가합니다.

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 로드 밸런서 뒤에서 실행되는 2개의 Nginx 웹 서버와 함께 DigitalOcean에서 로드 밸런싱된 웹 인프라를 구축하기 위해 Terraform을 사용했습니다. 리소스를 만들고 삭제하고, 현재 상태를 보고, Terraform을 사용하여 DNS 항목을 구성하는 방법을 알고 있습니다.

이제 Terraform의 작동 방식을 이해했으므로 자체 프로젝트의 서버 인프라를 설명하는 구성 파일을 만들 수 있습니다. 이 자습서의 예제는 서버 배포를 자동화하는 방법을 보여 주는 좋은 출발점입니다. 프로비저닝 도구를 이미 사용하고 있는 경우 이 자습서에서 사용된 프로비저닝 방법을 사용하는 대신 Terraform과 통합하여 생성 프로세스의 일부로 서버를 구성할 수 있습니다.

Terraform에는 더 많은 기능이 있으며 다른 공급자와 협력할 수 있습니다. Terraform을 사용하여 자체 인프라를 개선하는 방법에 대해 자세히 알아보려면 공식 Terraform 문서를 확인하세요.

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