✔️ Overview
Terraform을 사용하면 인프라스트럭처를 안전하고 예측 가능하게 작성, 변경 및 개선할 수 있다.
API를 선언형 구성 파일로 코드화하여 코드로 취급하고 편집, 리뷰 및 버전화할 수 있는 오픈소스 툴이다.
✔️ 실습 목표
- Google Cloud에서 Terraform을 시작하기
- 바이너리 설치 파일로 Terraform을 설치하기
- Terraform을 사용하여 VM 인스턴스 인프라를 생성하기
✔️ Terraform이란?
Terraform은 인프라를 안전하고 효율적으로 구축, 변경 및 버전화하기 위한 도구이다.
Terraform은 기존의 인기 있는 서비스 프로바이더와 커스텀 사내 솔루션을 관리할 수 있다.
구성 파일은 단일 애플리케이션 또는 데이터 센터 전체를 실행하는 데 필요한 구성 요소를 Terraform에 설명한다.
Terraform은 원하는 상태에 도달하기 위해 수행할 작업을 설명하는 실행 계획을 생성한 후 이를 실행하여 기술된 인프라를 구축한다.
구성이 변경되면 Terraform은 변경된 사항을 확인하고 적용할 수 있는 증분 실행 계획을 작성할 수 있다.
Terraform이 관리할 수 있는 인프라스트럭처에는 컴퓨팅 인스턴스, 스토리지 및 네트워킹과 같은 낮은 수준의 컴포넌트와 DNS 엔트리 및 SaaS 기능과 같은 높은 수준의 컴포넌트가 모두 포함된다.
Key features
- IaC(코드로서의 인프라스트럭처)
인프라스트럭처는 hight-level configuration syntax을 사용해 기술된다. 데이터 센터의 청사진을 다른 코드와 동일하게 버전화하고 다룰 수 있게 할 수 있다. 또한 인프라스트럭처를 공유하여 재사용할 수 있다. - Execution plans
Terraform에는 실행 계획을 생성하는 계획 단계가 있다. 실행 계획에는 apply 명령을 실행할 때 Terraform이 수행할 작업이 나와 있다. 이를 통해 Terraform이 인프라스트럭처를 조작할 때 예기치 않은 일이 발생하지 않도록 할 수 있다. - Resource graph
Terraform은 모든 리소스에 대한 그래프를 작성하고 종속되지 않은 리소스의 생성과 수정을 병렬화한다.
이 때문에, Terraform은 가능한 한 효율적으로 인프라스트럭처를 구축해, 운용자는 인프라스트럭처의 의존성을 파악할 수 있다. - Change automation
복잡한 변경 세트를 최소한의 사용자 조작으로 인프라스트럭처에 적용할 수 있다. 앞에서 설명한 실행 계획 및 리소스 그래프를 통해 Terraform이 어떤 순서로 변경되는지 정확하게 알 수 있으므로 많은 인적 오류를 방지할 수 있다.
✔️ Verifying Terraform installation
Cloud Shell tab을 열고 Terraform이 사용 가능한지 확인하기
terraform
✔️ Build infrastructure
Terraform이 설치되어 있으면 몇 가지 인프라스트럭처의 작성을 즉시 시작할 수 있다.
✔️ Configuration
Terraform에서 인프라를 설명하는 데 사용되는 파일 세트를 Terraform configuration이라고 한다.
이 섹션에서는 단일 VM 인스턴스를 시작하는 첫 번째 구성을 작성한다.
구성 파일의 포맷에 대해서는, 여기를 참조하기 구성 파일 작성에는 JSON을 사용할 것을 권장한다.
1. Cloud Shell에서 다음 명령을 사용하여 instance.tf이라는 이름의 빈 구성 파일을 만든다.
touch instance.tf
2. Cloud Shell 툴바에서 Open Editor를 클릭한다.
Cloud Shell과 코드 에디터 간에 전환하려면 필요에 따라 Open Editor 또는 Open Terminal을 클릭하거나 새 창에서 Open을 클릭하여 Editor를 별도의 탭에서 열어둔다.
3. instance.tf 파일을 클릭하여 다음 내용을 추가하여 <PROJECT_ID> 를 바꾼다.
resource "google_compute_instance" "terraform" {
project = "<PROJECT_ID>"
name = "terraform"
machine_type = "n1-standard-1"
zone = "us-central1-a"
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
network_interface {
network = "default"
access_config {
}
}
}
이것은 Terraform이 적용할 수 있는 완전한 구성이다. 일반적인 구조는 직관적이고 직설적이어야 한다.
instance.tf 파일의 "resource" 블록은 인프라 내에 존재하는 리소스를 정의한다.
리소스는 VM 인스턴스와 같은 물리적 구성 요소일 수 있다.
리소스 블록에는 블록을 열기 전에 resource type과 resource name이라는 두 가지 문자열이 있다.
이 랩의 리소스 유형은 google_compute_instance이고 이름은 terraform이다.
타입의 접두사 google_compute_instance는 자동으로 Terraform에 Google 공급자에 의해 관리되고 있는 것이다.
리소스 블록 자체에는 리소스에 필요한 구성이 있다.
4. Cloud Shell에서 Terraform이 모든 파일을 로드하므로 새 파일이 추가되었는지 디렉터리에 다른 *.tf 파일이 없는지 확인한다.
ls
✔️ Initialization
새 Configuration에 대해 또는 버전 컨트롤에서 기존 Configuration을 체크 아웃한 후 실행하는 첫 번째 명령어는 terraform init이다. 그러면 후속 명령에 사용되는 다양한 로컬 설정 및 데이터가 초기화된다.
Terraform은 플러그인 기반 아키텍처를 사용하여 이용 가능한 수많은 인프라 및 서비스 공급자를 지원한다.
각 "공급자"는 Terraform 자체와 별도로 배포되는 자체 캡슐화된 binary이다. terraform init 명령어는 프로바이더가 설정 내에서 사용하는 프로바이더 바이너리를 자동으로 다운로드하여 설치한다. 이 실습에서 프로바이더는 Google 프로바이더일 뿐이다.
1. 프로바이더 바이너리를 다운로드하여 설치한다.
terraform init
Google 공급자 플러그인은 다른 다양한 장부 보관 파일과 함께 현재 작업 디렉토리의 하위 디렉토리에 다운로드되어 설치된다. "Initializing provider plugins" 메시지가 나타난다.
Terraform은 사용자가 Google 프로젝트에서 실행 중임을 알고 Google 리소스를 얻고 있다.
Installing hashicorp/google v3.77.0...
출력은 설치되는 플러그인의 버전을 지정하고 terraform init이 호환되는 버전을 설치하도록 하기 위해 향후 구성 파일에 이 버전을 지정할 것을 권장한다.
2. 실행 계획 생성하기
terraform plan
Terraform은 명시적으로 비활성화된 경우를 제외하고 새로 고침을 수행한 다음 구성 파일에 지정된 원하는 상태를 달성하기 위해 필요한 작업을 결정한다. 이 명령어는 실제 리소스나 상태를 변경하지 않고 일련의 변경 실행 계획이 예상과 일치하는지 여부를 확인할 수 있는 편리한 방법이다. 예를 들어 버전 제어 변경을 커밋하기 전에 이 명령을 실행하여 예상대로 동작하는지 확신할 수 있다.
참고 : 옵션 -out 인수는 생성된 계획을 나중에 terraform apply로 실행할 수 있도록 파일에 저장하는 데 사용할 수 있다.
✔️ Apply changes
1. 생성한 instance.tf 파일과 동일한 디렉터리에서 다음 명령을 실행한다.
terraform apply
이 출력은 구성과 일치하도록 실제 인프라를 변경하기 위해 Terraform이 취할 조치를 설명하는 실행 계획을 보여준다. 출력 형식은 Git과 같은 도구에서 생성된 diff 형식과 유사하다.
google_compute_instance.terraform 옆에 +가 있으며 이는 Terraform이 이 리소스를 생성한다는 의미이다.
다음은 설정할 속성이다. 표시된 값이 <computed>이면 리소스가 생성될 때까지 값을 알 수 없음을 의미한다.
출력 예시
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# google_compute_instance.default will be created
+ resource "google_compute_instance" "default" {
+ can_ip_forward = false
+ cpu_platform = (known after apply)
+ deletion_protection = false
+ guest_accelerator = (known after apply)
+ id = (known after apply)
+ instance_id = (known after apply)
+ label_fingerprint = (known after apply)
+ machine_type = "n1-standard-1"
+ metadata_fingerprint = (known after apply)
+ name = "terraform"
+ project = "qwiklabs-gcp-42390cc9da8a4c4b"
+ self_link = (known after apply)
+ tags_fingerprint = (known after apply)
+ zone = "us-central1-a"
+ boot_disk {
+ auto_delete = true
+ device_name = (known after apply)
+ disk_encryption_key_sha256 = (known after apply)
+ kms_key_self_link = (known after apply)
+ source = (known after apply)
+ initialize_params {
+ image = "debian-cloud/debian-9"
+ labels = (known after apply)
+ size = (known after apply)
+ type = (known after apply)
}
}
+ network_interface {
+ address = (known after apply)
+ name = (known after apply)
+ network = "default"
+ network_ip = (known after apply)
+ subnetwork = (known after apply)
+ subnetwork_project = (known after apply)
+ access_config {
+ assigned_nat_ip = (known after apply)
+ nat_ip = (known after apply)
+ network_tier = (known after apply)
}
}
+ scheduling {
+ automatic_restart = (known after apply)
+ on_host_maintenance = (known after apply)
+ preemptible = (known after apply)
+ node_affinities {
+ key = (known after apply)
+ operator = (known after apply)
+ values = (known after apply)
}
}
}
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:
계획이 성공적으로 생성되면 이제 Terraform이 일시 중지되고 계속 진행하기 전에 승인을 기다린다.
프로덕션 환경에서 실행 계획의 내용이 올바르지 않거나 위험해 보이는 경우 여기에서 취소하는 것이 안전하다.
인프라스트럭처가 변경되지 않는다.
2. 이 경우 계획이 허용 가능한 것 같으므로 확인 프롬프트에서 yes를 입력하여 계속 진행한다.
Terraform은 VM 인스턴스를 사용할 수 있을 때까지 기다리기 때문에 계획을 실행하는 데 몇 분이 걸린다.
이렇게 하면 Terraform이 모두 완료된다 !!
3. Google Cloud Console의 탐색 메뉴에서 Compute Engine > VM 인스턴스를 클릭하여 생성된 VM 인스턴스를 확인한다.
Terraform은 일부 데이터를 terraform.tfstate 파일에 기록했다. 이 상태 파일은 매우 중요한데 생성된 리소스의 ID를 추적하여 Terraform이 관리 대상을 알 수 있도록 한다.
4. Cloud Shell에서 현재 상태를 검사한다.
terraform show
출력 예시:
# google_compute_instance.default:
resource "google_compute_instance" "default" {
can_ip_forward = false
cpu_platform = "Intel Haswell"
deletion_protection = false
guest_accelerator = []
id = "terraform"
instance_id = "3408292216444307052"
label_fingerprint = "42WmSpB8rSM="
machine_type = "n1-standard-1"
metadata_fingerprint = "s6I5s2tjfKw="
name = "terraform"
project = "qwiklabs-gcp-42390cc9da8a4c4b"
self_link = "https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-42390cc9da8a4c4b/zones/us-central1-a/instances/terraform"
tags_fingerprint = "42WmSpB8rSM="
zone = "us-central1-a"
boot_disk {
auto_delete = true
device_name = "persistent-disk-0"
source = "https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-42390cc9da8a4c4b/zones/us-central1-a/disks/terraform"
....
이 리소스를 생성하여 관련 정보도 많이 수집했음을 알 수 있다.
이러한 값을 참조하여 추가 리소스 또는 출력을 구성할 수 있다.
Terraform으로 첫 번째 인프라를 구축했다. 구성 구문과 기본 실행 계획의 예를 보고 상태 파일을 이해해 보았다.
'Study > Study Jam' 카테고리의 다른 글
[Study Jam] Interact with Terraform Modules (0) | 2022.03.27 |
---|---|
[Study Jam] Infrastructure as Code with Terraform (0) | 2022.03.27 |
[Study Jam] Continuous Delivery with Jenkins in Kubernetes Engine - 2 (0) | 2022.03.25 |
[Study Jam] Continuous Delivery with Jenkins in Kubernetes Engine - 1 (0) | 2022.03.25 |
[Study Jam] Managing Deployments Using Kubernetes Engine - 2 (0) | 2022.03.24 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!