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을 다운로드하고 홈 디렉터리에 배치합니다.
- curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_darwin_amd64.zip
Linux에서는 다음 명령을 사용합니다.
- curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_linux_amd64.zip
~/opt/terraform
디렉터리를 만듭니다.
- mkdir -p ~/opt/terraform
그런 다음 unzip
명령을 사용하여 Terraform을 ~/opt/terraform
에 압축 해제합니다. Ubuntu에서는 apt
를 사용하여 unzip
을 설치할 수 있습니다.
- sudo apt install unzip
다음을 실행하여 다운로드한 아카이브를 ~/opt/terraform
디렉토리에 추출하는 데 사용합니다.
- unzip ~/terraform.zip -d ~/opt/terraform
마지막으로 ~/opt/terraform
을 PATH
환경 변수에 추가하여 실행 파일의 전체 경로를 지정하지 않고 terraform
명령을 실행할 수 있습니다.
Linux에서는 새 셸이 열릴 때 실행되는 .bashrc
에서 PATH
를 재정의해야 합니다. 다음을 실행하여 편집용으로 엽니다.
- nano ~/.bashrc
참고: macOS에서는 Bash를 사용하는 경우 .bash_profile
파일에 경로를 추가하고 ZSH를 사용하는 경우 .zshrc
에 경로를 추가합니다.
Terraform의 경로를 PATH에 추가하려면 파일 끝에 다음 행을 추가하십시오.
export PATH=$PATH:~/opt/terraform
완료되면 파일을 저장하고 닫습니다.
이제 모든 새 셸 세션에서 terraform
명령을 찾을 수 있습니다. 새 PATH
를 현재 세션에 로드하려면 Linux 시스템에서 Bash를 사용하는 경우 다음 명령을 실행하십시오.
- . ~/.bashrc
macOS에서 Bash를 사용하는 경우 대신 다음 명령을 실행합니다.
- . .bash_profile
ZSH를 사용하는 경우 다음 명령을 실행합니다.
- . .zshrc
Terraform을 올바르게 설치했는지 확인하려면 인수 없이 terraform
명령을 실행하십시오.
- terraform
다음과 유사한 출력이 표시됩니다.
OutputUsage: 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
라는 환경 변수로 내보냅니다.
- export DO_PAT="your_personal_access_token"
이렇게 하면 후속 명령에서 더 쉽게 사용할 수 있고 코드와 별도로 유지할 수 있습니다.
참고: Terraform 및 DigitalOcean을 자주 사용하는 경우 이전 단계에서 PATH
환경 변수를 수정하는 데 사용한 것과 동일한 접근 방식을 사용하여 이 줄을 셸 구성 파일에 추가합니다.
다음 명령을 실행하여 인프라 구성을 저장할 디렉터리를 만듭니다.
- mkdir ~/loadbalance
새로 생성된 디렉터리로 이동합니다.
- cd ~/loadbalance
Terraform 구성은 .tf
파일 확장자로 끝나는 텍스트 파일입니다. 사람이 읽을 수 있으며 주석을 지원합니다. (Terraform은 JSON 형식 구성 파일도 지원하지만 여기에서는 다루지 않습니다.) Terraform은 작업 디렉터리의 모든 구성 파일을 선언적 방식으로 읽으므로 리소스 및 변수 정의의 순서는 중요하지 않습니다. 전체 인프라가 단일 구성 파일에 존재할 수 있지만 명확성을 유지하기 위해 리소스 유형별로 구성 파일을 구분해야 합니다.
Terraform으로 인프라를 구축하는 첫 번째 단계는 사용할 공급자를 정의하는 것입니다.
Terraform과 함께 DigitalOcean 공급자를 사용하려면 Terraform에 이에 대해 알리고 적절한 자격 증명 변수로 플러그인을 구성해야 합니다. 공급자에 대한 구성을 저장할 provider.tf
라는 파일을 만듭니다.
- 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이 수행하려는 작업에 대한 자세한 로깅이 활성화됩니다. 다음을 실행하여 설정할 수 있습니다.
- export TF_LOG=1
다음을 실행하여 프로젝트의 Terraform을 초기화합니다.
- terraform init
이렇게 하면 구성을 읽고 공급자에 대한 플러그인을 설치합니다. 출력에 로그인된 것을 볼 수 있습니다.
OutputInitializing 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 구성 파일을 만듭니다.
- 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 액세스 토큰 값과 개인 키 경로를 지정해야 합니다. 다음 명령을 실행하여 계획을 생성합니다.
- terraform plan \
- -var "do_token=${DO_PAT}" \
- -var "pvt_key=$HOME/.ssh/id_rsa"
경고: terraform plan
명령은 -out
매개변수를 지원하여 계획을 저장합니다. 그러나 계획은 API 키를 저장하며 Terraform은 이 데이터를 암호화하지 않습니다. 이 옵션을 사용하는 경우 이 파일을 다른 사람에게 보내거나 장기간 미사용 상태로 두려는 경우 이 파일을 암호화하는 방법을 살펴봐야 합니다.
다음과 유사한 출력이 표시됩니다.
OutputTerraform 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
명령을 실행하여 현재 계획을 실행합니다.
- terraform apply \
- -var "do_token=${DO_PAT}" \
- -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을 프로비저닝합니다.
Outputdigitalocean_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
를 업데이트합니다.
환경의 현재 상태를 보려면 다음 명령을 사용하십시오.
- terraform show terraform.tfstate
그러면 Droplet의 공개 IP 주소가 표시됩니다.
Outputresource "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 외부에서 수정된 경우 최신 상태로 가져오려면 상태 파일을 새로 고쳐야 합니다. 이 명령은 공급자로부터 업데이트된 리소스 정보를 가져옵니다.
- terraform refresh \
- -var "do_token=${DO_PAT}" \
- -var "pvt_key=$HOME/.ssh/id_rsa"
이 단계에서는 Terraform에서 설명한 Droplet을 배포했습니다. 이제 두 번째 항목을 만듭니다.
5단계 - 두 번째 Nginx 서버 생성
이제 Nginx 서버에 대해 설명했으므로 기존 서버의 구성 파일을 복사하고 Droplet 리소스의 이름과 호스트 이름을 교체하여 신속하게 두 번째 서버를 추가할 수 있습니다.
이 작업을 수동으로 수행할 수 있지만 sed
명령을 사용하여 www-1.tf
파일을 읽고 www-1
의 모든 인스턴스를 대체하는 것이 더 빠릅니다. code>를 www-2
로 변경하고 www-2.tf
라는 새 파일을 만듭니다. 이를 수행하는 sed
명령은 다음과 같습니다.
- sed 's/www-1/www-2/g' www-1.tf > www-2.tf
sed 사용을 방문하여 sed
에 대해 자세히 알아볼 수 있습니다.
terraform 계획
을 다시 실행하여 Terraform이 수행할 변경 사항을 미리 봅니다.
- terraform plan \
- -var "do_token=${DO_PAT}" \
- -var "pvt_key=$HOME/.ssh/id_rsa"
출력은 Terraform이 두 번째 서버인 www-2
를 생성함을 보여줍니다.
OutputTerraform 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을 만듭니다.
- terraform apply \
- -var "do_token=${DO_PAT}" \
- -var "pvt_key=$HOME/.ssh/id_rsa"
이전과 마찬가지로 Terraform은 계속 진행할 것인지 확인하는 메시지를 표시합니다. 계획을 다시 검토하고 yes
를 입력하여 계속합니다.
얼마 후 Terraform은 새 서버를 생성하고 결과를 표시합니다.
Outputdigitalocean_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 구성 파일을 만듭니다.
- 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
명령을 다시 실행하여 새 실행 계획을 검토합니다.
- terraform plan \
- -var "do_token=${DO_PAT}" \
- -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-1
및 www-2
Droplet이 이미 존재하고 Terraform이 www-lb
로드 밸런서를 생성함을 의미합니다.
terraform apply
를 실행하여 Load Balancer를 빌드합니다.
- terraform apply \
- -var "do_token=${DO_PAT}" \
- -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 주소를 찾습니다.
- 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를 설명하는 새 파일을 만듭니다.
- nano domain_root.tf
다음 도메인 리소스를 추가하고 your_domain
을 도메인 이름으로 바꿉니다.
resource "digitalocean_domain" "default" {
name = "your_domain"
ip_address = digitalocean_loadbalancer.www-lb.ip
}
완료되면 파일을 저장하고 닫습니다.
www.your_domain
이 your_domain
을 가리키는 CNAME 레코드를 추가할 수도 있습니다. CNAME 레코드에 대한 새 파일을 만듭니다.
- 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
를 사용하여 인프라를 파괴하는 실행 계획을 만듭니다.
- terraform plan -destroy -out=terraform.tfplan \
- -var "do_token=${DO_PAT}" \
- -var "pvt_key=$HOME/.ssh/id_rsa"
Terraform은 리소스가 빨간색으로 표시되고 빼기 기호가 접두사로 포함된 계획을 출력하여 인프라에서 리소스를 삭제할 것임을 나타냅니다.
그런 다음 terraform apply
를 사용하여 계획을 실행합니다.
- terraform apply terraform.tfplan
Terraform은 생성된 계획에 표시된 대로 리소스 파괴를 진행합니다.
결론
이 튜토리얼에서는 DigitalOcean 로드 밸런서 뒤에서 실행되는 2개의 Nginx 웹 서버와 함께 DigitalOcean에서 로드 밸런싱된 웹 인프라를 구축하기 위해 Terraform을 사용했습니다. 리소스를 만들고 삭제하고, 현재 상태를 보고, Terraform을 사용하여 DNS 항목을 구성하는 방법을 알고 있습니다.
이제 Terraform의 작동 방식을 이해했으므로 자체 프로젝트의 서버 인프라를 설명하는 구성 파일을 만들 수 있습니다. 이 자습서의 예제는 서버 배포를 자동화하는 방법을 보여 주는 좋은 출발점입니다. 프로비저닝 도구를 이미 사용하고 있는 경우 이 자습서에서 사용된 프로비저닝 방법을 사용하는 대신 Terraform과 통합하여 생성 프로세스의 일부로 서버를 구성할 수 있습니다.
Terraform에는 더 많은 기능이 있으며 다른 공급자와 협력할 수 있습니다. Terraform을 사용하여 자체 인프라를 개선하는 방법에 대해 자세히 알아보려면 공식 Terraform 문서를 확인하세요.
이 튜토리얼은 Terraform 시리즈로 인프라를 관리하는 방법의 일부입니다. 이 시리즈는 처음으로 Terraform을 설치하는 것부터 복잡한 프로젝트를 관리하는 것까지 다양한 Terraform 주제를 다룹니다.