작가는 자유 및 오픈 소스 기금을 기부 대상으로 선택하여 기부를 위해 쓰기 프로그램의 일환으로 기부하였습니다.
소개
여러 사람이 서로 다른 위치에서 동시에 동일한 Terraform 프로젝트에서 작업할 때 인프라 코드와 프로젝트 상태를 올바르게 처리하여 덮어쓰기 오류를 피하는 것이 중요합니다. 해결책은 로컬이 아닌 원격으로 상태를 저장하는 것입니다. 원격 시스템은 팀의 모든 구성원이 사용할 수 있으며 작업하는 동안 상태를 잠금 처리할 수 있습니다.
이러한 원격 백엔드 중 하나는 상태를 PostgreSQL 데이터베이스에 저장하는 pg
입니다. 이 자습서 과정에서는 데이터 가용성을 보장하기 위해 디지털오션 관리 데이터베이스와 함께 사용합니다.
Terraform은 또한 Hashicorp가 제공하는 공식적이고 관리되는 클라우드 오퍼링인 Terraform 클라우드를 지원합니다. 이는 팀의 작업을 한 곳에 동기화하고 구성 및 관리를 위한 사용자 인터페이스를 제공하는 프로프리어터리 앱입니다.
이 튜토리얼에서는 Terraform Cloud에서 조직을 생성하고 프로젝트를 연결합니다. 그런 다음 조직을 사용하여 워크스페이스와 리소스를 설정합니다. 상태를 관리되는 클라우드에 저장하여 항상 사용할 수 있도록 합니다. 또한 관리되는 PostgreSQL 데이터베이스와 함께 pg
백엔드를 설정합니다.
전제 조건
- A DigitalOcean Personal Access Token, which you can create via the DigitalOcean Control Panel. You can find instructions in the DigitalOcean product documents, How to Create a Personal Access Token.
- 로컬 머신에 Terraform이 설치되어 있어야 합니다. Step 1의 DigitalOcean과 Terraform 사용 방법 튜토리얼을 완료해야 합니다.
pg
백엔드를 사용하려면 관리되는 PostgreSQL 데이터베이스 클러스터가 생성되어 있고 접근 가능해야 합니다. 자세한 정보는 빠른 시작 가이드를 참조하십시오. 이 튜토리얼에는 별도의 데이터베이스를 사용할 수 있습니다.- Hashicorp의 관리 클라우드를 사용하려면 Terraform Cloud 계정이 필요합니다. 가입 페이지에서 계정을 생성할 수 있습니다.
참고: 이 튜토리얼은 특별히 Terraform 1.1.3
을 사용하여 테스트했습니다.
관리되는 PostgreSQL 데이터베이스에 상태 저장하기
이 섹션에서는 Droplet을 배포하고 pg
공급업체를 사용하여 DigitalOcean 관리되는 PostgreSQL 데이터베이스에 상태를 저장하는 프로젝트를 설정합니다. 이 공급업체는 상태 잠금을 지원하므로 상태가 동시에 두 개 이상의 변경으로 인해 덮어쓰여지지 않습니다.
먼저 프로젝트를 저장할 terraform-team-pg
라는 디렉토리를 만듭니다:
이동합니다:
먼저 공급업체를 정의하고 데이터베이스에 대한 연결 문자열과 digitalocean
모듈을 전달합니다. 편집을 위해 provider.tf
를 만들고 엽니다:
다음 줄을 추가합니다:
여기서는 digitalocean
공급업체가 필요하며 연결 문자열을 수락하는 pg
백엔드를 정의합니다. 그런 다음 do_token
변수를 정의하고 digitalocean
공급업체의 인스턴스에 전달합니다.
기존의 코드에 있는 your_db_connection_string
을(를) DigitalOcean 제어판에서 관리되는 데이터베이스의 연결 문자열로 교체하세요. 이는 작업을 누르고 연결 세부 정보를 선택한 다음 드롭다운 메뉴에서 연결 문자열을 선택하여 찾을 수 있습니다. 그런 다음 파일을 저장하고 닫으세요.
경고: 계속하려면 데이터베이스의 설정에서 Terraform을 실행하는 기계의 IP 주소가 허용 목록에 있는지 확인하세요.
다음 명령을 실행하여 프로젝트를 초기화하세요:
출력은 다음과 비슷할 것입니다:
OutputInitializing the backend...
Successfully configured the backend "pg"! Terraform will automatically
use this backend unless the backend configuration changes.
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!
...
Terraform이 백엔드에 성공적으로 초기화되었습니다. 이는 데이터베이스에 연결된 것입니다.
그다음, droplets.tf
라는 파일에 드롭렛을 정의하세요. 다음 명령을 실행하여 파일을 만들고 편집하세요:
다음 라인을 추가하세요:
이 코드는 fra1
지역에서 Ubuntu 20.04를 실행하는 1GB RAM과 한 개의 CPU 코어를 사용하여 web-1
이라는 드롭렛을 배포합니다. 이것으로 정의할 것이 모두입니다. 파일을 저장하고 닫으세요.
환경 변수에 DigitalOcean 토큰이 필요합니다. 토큰을 사용하여 새로운 환경 변수를 만드세요. your_do_token
을(를) 교체하세요:
데이터베이스 연결이 작동하는지 확인하려면 구성을 계획해 보세요:
출력은 다음과 비슷할 것입니다:
테라폼은 오류 없이 작업을 계획하고 평소처럼 동작을 예상했습니다. PostgreSQL 데이터베이스에 성공적으로 연결되었으며 상태를 저장했습니다. 이제 여러 사람이 프로젝트를 동시에 작업할 수 있고 프로젝트는 동기화된 상태를 유지할 수 있습니다.
테라폼 클라우드에서 상태 저장
이 단계에서는 드롭렛을 배포하고 테라폼 클라우드를 cloud
프로바이더로 사용하는 프로젝트를 만듭니다. 이에는 테라폼 클라우드에서 조직 및 워크스페이스를 생성하고 인프라 코드를 작성하고 계획하는 것이 포함됩니다.
조직 생성
테라폼 클라우드를 사용하면 여러 조직을 가질 수 있으며 이는 워크스페이스 및 모듈을 보유합니다. 유료 요금제 조직은 액세스 수준 제어 기능을 갖는 여러 팀을 가질 수 있지만 무료 요금제로 사용할 조직은 조직 당 한 팀만 제공합니다. 팀 멤버를 조직에 초대할 수 있습니다.
시작하려면 Terraform Cloud로 이동하여 로그인하세요. 아직 조직을 만들지 않은 경우 조직을 만들라는 메시지가 표시됩니다.
원하는 이름의 조직 이름을 입력하고 Terraform Cloud의 모든 이름 중에서 고유해야 함을 기억하세요. 이름이 이미 있는 경우 오류가 발생합니다. 이메일 주소는 이미 계정의 주소로 입력되어 있어야 합니다. 작업을 마치면 조직 만들기 버튼을 클릭하여 계속하세요.
그런 다음 작업 공간의 유형을 선택하라는 메시지가 나타납니다.
명령줄을 사용하여 Terraform Cloud와 상호 작용할 예정이므로 CLI 주도 워크플로우 옵션을 클릭하세요. 그런 다음 작업 공간에 이름을 입력하고 설명란을 비워 둡니다.
원하는 작업 공간 이름을 입력하십시오(여기서는 sammy
라고 하겠습니다) 그런 다음 작업 공간 만들기를 클릭하여 조직 생성 프로세스를 완료하세요. 그런 다음 작업 공간 설정 페이지로 이동됩니다.
이제 작업 공간을 생성했습니다. 이는 조직의 일부입니다. 방금 만들었기 때문에 작업 공간에는 인프라 코드가 없습니다. 인터페이스의 중앙 부분에는 Terraform Cloud가이 작업 공간에 연결하는 시작 지침이 표시됩니다.
연결하기 전에 클라우드에서 명령을 실행하는 데 사용할 Terraform의 버전을 구성해야 합니다. 설정하려면 개요 옆의 설정 드롭다운을 클릭하고 목록에서 일반을 선택하세요. 페이지가 열리면 Terraform 버전 드롭다운으로 이동하고 1.1.3
(이 튜토리얼용)을 선택하세요.
그런 다음 변경 사항을 저장하려면 설정 저장 버튼을 클릭하십시오.
프로젝트를 조직 및 작업 공간에 연결하려면 먼저 명령 줄을 사용하여 로그인해야 합니다. 명령을 실행하기 전에 토큰 페이지로 이동하여 서버에 대한 새 액세스 토큰을 만들어야 합니다. 이 토큰은 계정에 액세스할 수 있도록 제공됩니다. API 토큰을 생성하라는 프롬프트가 표시됩니다.
기본 설명이 적당하므로 API 토큰 생성을 클릭하여 만드십시오.
토큰 값 또는 그 후에 있는 아이콘을 클릭하여 API 토큰을 복사하십시오. 이 토큰을 사용하여 프로젝트를 Terraform Cloud 계정에 연결할 것입니다.
명령 줄에서 다음 명령을 실행하십시오:
다음 출력을 받게 됩니다:
OutputTerraform will request an API token for app.terraform.io using your browser.
If login is successful, Terraform will store the token in plain text in
the following file for use by subsequent commands:
/home/sammy/.terraform.d/credentials.tfrc.json
Do you want to proceed?
Only 'yes' will be accepted to confirm.
...
Terraform은 토큰이 로컬에 저장될 것임을 경고합니다. 프롬프트가 나타나면 yes
를 입력하십시오:
Output---------------------------------------------------------------------------------
Open the following URL to access the tokens page for app.terraform.io:
https://app.terraform.io/app/settings/tokens?source=terraform-login
---------------------------------------------------------------------------------
Generate a token using your browser, and copy-paste it into this prompt.
Terraform will store the token in plain text in the following file
for use by subsequent commands:
/home/sammy/.terraform.d/credentials.tfrc.json
Token for app.terraform.io:
Enter a value:
복사한 토큰을 붙여 넣고 ENTER
를 눌러 확인하십시오. Terraform은 성공 메시지를 표시할 것입니다:
Output...
-
----- -
--------- --
--------- - -----
--------- ------ -------
------- --------- ----------
---- ---------- ----------
-- ---------- ----------
Welcome to Terraform Cloud! - ---------- -------
--- ----- ---
Documentation: terraform.io/docs/cloud -------- -
----------
----------
---------
-----
-
New to TFC? Follow these steps to instantly apply an example configuration:
$ git clone https://github.com/hashicorp/tfc-getting-started.git
$ cd tfc-getting-started
$ scripts/setup.sh
로컬 Terraform 설치를 Terraform Cloud 계정에 액세스할 수 있도록 구성했습니다. 이제 드롭렛을 배포하는 프로젝트를 생성하고 상태를 저장하기 위해 Terraform Cloud를 사용하도록 구성하겠습니다.
프로젝트 설정하기
먼저 프로젝트를 저장할 terraform-team-cloud
라는 디렉터리를 만듭니다:
해당 디렉터리로 이동합니다:
프로젝트를 설정하려면 다음을 수행해야 합니다:
cloud
제공 업체를 정의하고 구성합니다. 이 업체는 Terraform Cloud와 상호 작용합니다.digitalocean
리소스를 배포할 수 있도록digitalocean
제공 업체가 필요합니다.- 사용할 변수를 정의하고 초기화합니다.
제공 업체 및 모듈 요구 사양을 provider.tf
라는 파일에 저장합니다. 다음 명령을 실행하여 파일을 만들고 엽니다:
다음 라인을 추가합니다:
여기서 먼저 Terraform 버전을 지정합니다. 그런 다음 필요한 digitalocean
제공 업체를 지정하고 백엔드를 cloud
로 설정합니다. organization
및 workspaces.name
에 대한 하이라이트된 값을 지정한 이름으로 바꿉니다.
다음으로, do_token
이라는 변수를 정의하고 이를 뒤따르는 digitalocean
제공 업체에 전달합니다. 이제 프로젝트를 조직에 연결하도록 구성했습니다. 파일을 저장하고 닫습니다.
다음 명령을 사용하여 프로젝트를 초기화합니다:
출력은 다음과 유사할 것입니다:
OutputInitializing Terraform Cloud...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.18.0...
- Installed digitalocean/digitalocean v2.18.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 Cloud has been successfully initialized!
...
이전 프로젝트와 동일한 Droplet 정의가 있으므로 다음을 실행하여 복사할 수 있습니다:
마지막으로 변수 값을 정의합니다. cloud
공급자는 명령 줄을 통해 변수에 값을 전달하는 것을 지원하지 않으므로 변수 파일을 사용하거나 Terraform Cloud에서 설정해야 합니다. Terraform은 파일 이름이 .auto.tfvars
로 끝나는 파일에서 변수 값을 읽어옵니다. 편집할 파일인 vars.auto.tfvars
를 만들고 엽니다. 여기에 do_token
변수를 정의합니다:
다음 줄을 추가하고, your_do_token
을(를) 자신의 DigitalOcean API 토큰으로 바꿉니다:
작업을 마치면 파일을 저장하고 닫으십시오. Terraform은 계획 작업 시 이 파일을 자동으로 읽습니다.
프로젝트가 이제 완료되어 Terraform Cloud를 백엔드로 사용할 수 있도록 설정되었습니다. 이제 Droplet을 계획하고 적용하고 그것이 Cloud 앱에 어떻게 반영되는지 검토하겠습니다.
구성 적용하기
이 자습서의 단계 1에서는 terraform plan
명령을 사용하여 프로젝트를 계획했습니다. Terraform Cloud 프로젝트에 동일한 리소스가 정의되어 있으므로 다시 계획할 필요 없이 직접 Terraform Cloud에 적용할 수 있습니다.
다음 명령을 실행하여 프로젝트를 적용하여 업데이트합니다:
당신은 로컬을 백엔드로 사용할 때 출력이 다른 것을 알 수 있을 것입니다:
클라우드 백엔드인 cloud
를 사용할 때, Terraform은 로컬 머신에서 구성을 계획하거나 적용하지 않습니다. 대신, 이러한 작업을 Terraform Cloud에 위임하고 콘솔로 출력을 실시간으로 스트리밍합니다.
프롬프트에서 yes
를 입력하십시오. Terraform은 곧 구성을 적용하는 작업을 완료할 것이며, Terraform Cloud 웹 사이트에서 작업 공간으로 이동하여 새로운 동작이 적용되었음을 확인할 수 있습니다.
다음을 실행하여 배포된 리소스를 제거할 수 있습니다:
이 섹션에서 프로젝트를 Terraform Cloud에 연결하여 프로젝트의 상태를 팀이 중앙 위치에서 액세스할 수 있도록 했습니다. 이렇게 하면 프로젝트에 액세스할 수 있는 모든 사람에게 상태가 공유되고 동기화되어 더 원활한 경험을 제공할 수 있습니다.
결론
이 튜토리얼에서는 두 가지 다른 백엔드를 사용했습니다. Hashicorp의 Terraform용 관리 클라우드 오퍼링인 Terraform Cloud와 프로젝트 상태를 PostgreSQL 데이터베이스에 저장할 수 있는 pg
입니다. DigitalOcean의 관리형 PostgreSQL 데이터베이스를 사용하여 몇 분 안에 Terraform으로 프로비저닝하고 사용할 수 있었습니다.
Terraform Cloud의 기능에 대한 자세한 정보는 공식 문서를 참조하십시오.
이 자습서는 Terraform으로 인프라 관리하는 방법 시리즈의 일부입니다. 이 시리즈는 처음으로 Terraform을 설치하는 것부터 복잡한 프로젝트를 관리하는 것까지 다양한 Terraform 주제를 다룹니다.
Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-within-your-team