Build Infrastructure - Terraform GCP Example

 

Terraform을 설치하고 인프라를 생성합니다.
이 문서에서는 Google Cloud Platform(GCP)에 인프라를 구축합니다.

Terraform을 사용하여 GCP 인프라를 프로비저닝하고 업데이트 및 삭제합니다. 예제는 네트워크 및 Linux 가상 머신을 프로비저닝합니다. 또한 원격 백엔드, 입력 및 출력 변수, 리소스 종속성을 구성하는 방법에 대해 설명합니다.

주의 : 이 문서에서 프로비저닝된 모든 것은 GCP의 프리티어에 속해야 하며 프리티어 외부에 리소스를 프로비저닝하면 요금이 부과될 수 있습니다.

terraform init , terraform validate , terraform plan, terraform apply 순으로 실행한다.

 

✔ Prerequisites

Google Cloud Platform 계정이 있어야 합니다.
Terraform 0.15.3 이상이 로컬에 설치되어야 합니다.

 

Google Cloud Shell

이 문서는 Google Cloud Shell 내에서 수행하는 형태로 설명합니다. 

 

✔ Set up GCP

GCP 콘솔에 로그인한 후 다음 리소스를 생성합니다.

1. Project 생성 :  프로젝트를 생성합니다. "리소스 관리"에서 프로젝트를 생성할 수 있습니다.(예시, 프로젝트명 pjt-terraform)

2. Compute Engine API : 프로젝트를 선택하고 Compute  Engine의 "VM 인스턴스"메뉴를 클릭합니다. 오른쪽 화면에 Google Compute Engine API "사용" 버튼을 클릭합니다.

3. service account key: Terraform이 GCP 계정에 액세스할 수 있도록 서비스계정과 서비스 계정 키를 만듭니다. 키를 생성할 때 다음 설정을 사용합니다.

  • 생성한 프로젝트를 선택
  • "IAM 및 관리자" 의 하위 메뉴인 "서비스 계정"을 클릭
  • 서비스 계정 만들기를 클릭
  • 원하는 이름을 지정하고 [만들고 계속하기]를 클릭(예시, terraform-account)
  • 역할선택에서 "편집자" 선택하고 [계속] 버튼 클릭
  • "서비스 계정 관리자 역할" 텍스트 박스에 GCP 계정 입력(예시, ypjeong@gmail.com)
  • [완료] 버튼 클릭

서비스 계정을 만든 후 서비스 계정키를 다운로드합니다.

  • 서비스 계정을 클릭(예시,  terraform-account@pjt-terraform.iam.gserviceaccount.com)
  • 상단의 "키" tab 선택.
  • "키 추가" drop-down 메뉴에서 "새 키 만들기" 선택
  • "키 유형"을 JSON 으로 지정
  • [만들기]를 클릭하고 키 파일을 저장(예시, pjt-terraform.json)

Warning: 서비스 계정 키 파일은 GCP 프로젝트에 대한 액세스를 제공합니다. 다른 비밀 자격 증명처럼 취급해야 합니다. 특히 소스 제어에 체크인해서는 안 됩니다.

 

Enable the Google Cloud APIs

Google Cloud 콘솔에서 Terraform용 API를 활성화해야 합니다.

  • Cloud Resource Manager API
  • Compute Engine API
  • Cloud Storage API

다른 조직에서 작업하는 경우 다음 2가지 API도 활성화해야 합니다.

  • Identity and Access Management (IAM) API
  • Cloud Billing API

이제 API를 활성화하려면 GCP 서비스에서 '사용 설정된 API 및 서비스'를 클릭합니다.

 

 

Write configuration

Terraform에서 인프라스트럭처를 설명하는 데 사용되는 파일셋을 Terraform 구성(Terraform configuration)이라고 합니다. 네트워크를 만들기 위한 첫 번째 구성을 작성합니다.

Terraform 구성을 위한 디렉터리를 만듭니다.

$ mkdir learn-terraform-gcp

디렉토리로 이동합니다.
$ cd learn-terraform-gcp

Terraform은 작업 디렉토리에서 .tf 또는 .tf.json으로 끝나는 모든 파일을 로드합니다. 

아래는 terraform 구성에 대한 main.tf 파일을 만듭니다.

$ touch main.tf
 

텍스트 편집기(vi, vim, nano 등)로 main.tf를 열고 아래 내용을 붙여넣습니다. <NAME>을 다운로드한 서비스 계정 키 파일의 경로로, <PROJECT_ID>를 프로젝트 ID로 교체하고 파일을 저장해야 합니다. region과 zone 내용도 자신의 환경에 맞도록 변경해 줍니다. 

(예시, <NAME> : /home/admin/learn-terraform-gcp/pjt-terraform.json, <PROJECT_ID> : pjt-terraform)

terraform {
  required_providers {
    google = {
      source = "hashicorp/google"
      version = "3.5.0"
    }
  }
}

provider "google" {
  credentials = file("<NAME>")

  project = "<PROJECT_ID>"
  region  = "asia-northeast3"
  zone    = "asia-northeast3-a"
}

resource "google_compute_network" "vpc_network" {
  name = "terraform-network"
}
 

 

Comments

Terraform 언어는 주석에 대해 세 가지 구문을 지원합니다.

  • #  : 한 줄 주석
  • // : 한 줄 주석
  • /* and */ : 여러 줄에 걸쳐 있을 수 있는 주석의 시작 및 끝 기호

»Terraform Block

Terraform {} 블록에는 Terraform이 인프라를 프로비저닝하는 데 사용할 필수 공급자와 Terraform 설정이 포함되어 있습니다. 각 공급자에 대해 source 속성은 호스트 이름, 네임스페이스 및 공급자 유형을 정의합니다. Terraform은 기본적으로 Terraform 레지스트리에서 공급자를 설치합니다. 이 예제 구성에서 Google 공급자 소스는 Registry.terraform.io/hashicorp/google의 약어인 hashcorp/google로 정의됩니다.

또한 required_providers 블록에서 각 공급자에 대한 버전 제약 조건을 정의할 수 있습니다. 버전 속성은 선택 사항이지만 공급자 버전을 적용하는 데 사용하는 것이 좋습니다. 이것이 없으면 Terraform은 항상 최신 버전의 공급자를 사용하므로 주요 변경 사항이 발생할 수 있습니다.

Providers

provider 블록은 지정된 제공자를 구성합니다(본 문서에서는 google). 공급자는 Terraform이 리소스를 생성하고 관리하는 데 사용하는 플러그인입니다. Terraform 구성에서 여러 공급자 블록을 정의하여 다른 공급자의 리소스를 관리할 수 있습니다.

»Resource

리소스 블록을 사용하여 인프라의 구성 요소를 정의합니다. 리소스는 서버와 같은 물리적 구성 요소일 수도 있고 Heroku 애플리케이션과 같은 논리적 리소스일 수도 있습니다.

리소스 블록에는 블록 앞에 리소스 유형과 리소스 이름이라는 두 개의 문자열이 있습니다. 이 예에서 리소스 유형은 google_compute_network이고 이름은 vpc_network입니다. 유형의 접두사는 공급자 이름에 매핑됩니다. 예제 구성에서 Terraform은 google 공급자를 통해 google_compute_network 리소스를 관리합니다. 리소스 유형과 리소스 이름은 함께 리소스의 고유 ID를 형성합니다. 예를 들어 네트워크의 ID는 google_compute_network.vpc_network입니다.

리소스 블록에는 리소스를 구성하는 데 사용하는 인수가 포함되어 있습니다. 인수에는 머신 크기, 디스크 이미지 이름 또는 VPC ID와 같은 항목이 포함될 수 있습니다. 

 

Initialize the directory

새 구성을 생성하거나 버전 제어에서 기존 구성을 체크아웃할 때 terraform init를 사용하여 디렉토리를 초기화해야 합니다. 이 단계에서는 구성에 정의된 공급자를 다운로드합니다.

디렉토리를 초기화합니다.

$ terraform init

Terraform은 google 공급자를 다운로드하여 현재 작업 디렉토리의 숨겨진 하위 디렉토리인 .terraform에 설치합니다. Terraform init 명령은 설치된 제공자 버전 Terraform을 출력합니다. 또한 Terraform은 .terraform.lock.hcl이라는 잠금 파일을 생성합니다. 이 파일은 모든 Terraform 실행의 일관성을 보장하는 데 사용되는 정확한 공급자 버전을 지정합니다. 이를 통해 구성에 사용된 공급자를 업그레이드하려는 시기를 제어할 수도 있습니다.

 

Format and validate the configuration

모든 구성 파일에서 일관된 형식을 사용하는 것이 좋습니다. terraform fmt 명령은 가독성과 일관성을 위해 현재 디렉토리의 구성을 자동으로 업데이트합니다.
구성을 포맷합니다. 수정 사항이 있는 경우 Terraform은 수정한 파일의 이름을 인쇄합니다.

terraform fmt

terraform validate 명령을 사용하여 구성이 구문적으로 유효하고 내부적으로 일관성이 있는지 확인할 수 있습니다.
구성을 확인합니다. 위에 제공된 예시 구성은 유효하므로 Terraform은 성공 메시지를 반환합니다.

terraform validate

Success! The configuration is valid.

 

Create infrastructure

terraform apply 명령을 사용하여 구성을 적용합니다.

$ terraform apply

### 오류 발생

google_compute_network.vpc_network: Creating...

│ Error: Error creating Network: googleapi: Error 403: Required 'compute.networks.create' permission for 'projects/pjt-terraform/global/networks/terraform-network', forbidden

### 오류 해결

IAM 에서 주구성원에 서비스 계정을 추가한다. 또는 서비스계정의 주구성원에 GCP 계정을 추가한다.

 

terraform apply 명령어를 다시 수행하니 성공적으로 수행됐다.

google_compute_network.vpc_network: Creating...
google_compute_network.vpc_network: Still creating... [10s elapsed]
google_compute_network.vpc_network: Still creating... [20s elapsed]
google_compute_network.vpc_network: Still creating... [30s elapsed]
google_compute_network.vpc_network: Creation complete after 39s [id=projects/pjt-terraform/global/networks/terraform-network]

 

 

Terraform은 어떤 인프라 변경을 계획하고 있는지 표시하고 변경하기 전에 승인을 요청합니다.

이 출력은 구성과 일치하는 인프라를 생성하기 위해 Terraform이 수행할 작업을 설명하는 실행 계획을 보여줍니다. 출력 형식은 Git과 같은 도구에서 생성된 diff 형식과 유사합니다. 출력에는 "google_compute_network" "vpc_network" 리소스 옆에 +가 표시됩니다. 이는 Terraform이 이 리소스를 생성함을 의미합니다. 그 아래에는 설정할 속성이 표시됩니다. 표시된 값이 "적용 후 알려짐"인 경우 리소스가 생성될 때까지 값을 알 수 없음을 의미합니다.

이제 Terraform이 일시 중지되고 계속 진행하기 전에 승인을 기다립니다. 계획의 내용이 올바르지 않거나 위험해 보이는 경우 인프라를 변경하지 않고 여기에서 중단하는 것이 안전합니다.
이 경우 계획이 허용 가능한 것 같으므로 확인 프롬프트에서 yes를 입력하여 계속 진행합니다. Terraform이 네트워크를 프로비저닝합니다.

 

이제 Terraform을 사용하여 인프라를 만들었습니다. GCP 콘솔에 접속하여 프로비저닝한 VPC 네트워크를 확인합니다.

main.tf에 region과 zone을 지정했는데 모든 region에 subnet이 생성되었다. 이게 맞는건지 아닌지 확인 필요. 이렇게 생성되는 게맞음. 그럼 하나의 리전에만 생성하려면?  vpc resource 영역에 auto_create_subnetworks = false 옵션 추가

 

Inspect state

구성을 적용할 때 Terraform은 terraform.tfstate라는 파일에 데이터를 기록했습니다. Terraform은 관리하는 리소스의 ID와 속성을 이 파일에 저장하므로 앞으로 해당 리소스를 업데이트하거나 삭제할 수 있습니다.

Terraform 상태 파일은 Terraform이 관리하는 리소스를 추적할 수 있는 유일한 방법이며 종종 민감한 정보를 포함하므로 상태 파일을 안전하게 저장하고 인프라를 관리해야 하는 신뢰할 수 있는 팀원에게만 배포해야 합니다. 프로덕션 환경에서는 Terraform Cloud 또는 Terraform Enterprise를 사용하여 원격으로 상태를 저장하는 것이 좋습니다. Terraform은 상태를 저장하고 관리하는 데 사용할 수 있는 다른 여러 원격 백엔드도 지원합니다.

Terraform show를 사용하여 현재 상태를 검사합니다.

$ terraform show

# google_compute_network.vpc_network:
resource "google_compute_network" "vpc_network" {
    auto_create_subnetworks         = true
    delete_default_routes_on_create = false
    id                              = "projects/pjt-terraform/global/networks/terraform-network"
    name                            = "terraform-network"
    project                         = "pjt-terraform"
    routing_mode                    = "REGIONAL"
    self_link                       = "https://www.googleapis.com/compute/v1/projects/pjt-terraform/global/networks/terraform-network"
}

 

Terraform이 이 네트워크를 만들 때 Google 공급자로부터 메타데이터도 수집하여 상태 파일에 기록합니다. 이 컬렉션의 뒷부분에서 이러한 값을 참조하여 다른 리소스 또는 출력을 구성하도록 구성을 수정합니다.

 

Change Infrastructure

위에서 Terraform을 사용하여 VPC 네트워크 인프라를 생성했습니다. 여기서는 terraform 구성을 수정하고 Terraform 프로젝트에 변경 사항을 적용하는 법을 설명합니다.
Terraform 구성을 업데이트하면 Terraform은 원하는 상태에 도달하는 데 필요한 항목만 수정하는 실행 계획을 빌드합니다.
프로덕션에서 Terraform을 사용할 때 버전 제어 시스템을 사용하여 구성 파일을 관리하고 Terraform Cloud 또는 Terraform Enterprise와 같은 원격 백엔드에 상태를 저장하는 것이 좋습니다.

 

Create a new resource

terraform apply를 실행하여 새 리소스를 생성할 수 있습니다.
Google 컴퓨팅 인스턴스 리소스에 대한 구성을 main.tf에 추가합니다.

resource "google_compute_instance" "vm_instance" {
  name         = "terraform-instance"
  machine_type = "f1-micro"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    network = google_compute_network.vpc_network.name
    access_config {
    }
  }
}

이름과 머신 유형은 단순한 문자열이지만 boot_disk 및 network_interface는 복잡한 블록입니다. 리소스에 대해 지원되는 모든 인수는 GCP 문서에서 확인할 수 있습니다.

 

컴퓨팅 인스턴스는 Debian 운영 체제를 사용하며 이전에 생성한 VPC 네트워크에 연결됩니다. 이 구성이 google_compute_network.vpc_network.name을 사용하여 네트워크의 이름 속성을 참조하는 방법에 주목하세요. 이렇게 하면 두 리소스 간의 종속성이 설정됩니다. Terraform은 적절한 순서로 생성되도록 관리하는 리소스의 종속성 그래프를 작성합니다.

인수가 없어도 access_config 블록이 있으면 VM에 외부 IP 주소가 제공되어 인터넷을 통해 액세스할 수 있습니다.

 

팁: 다른 인스턴스에서 오는 경우를 포함하여 인스턴스에 대한 모든 트래픽은 허용하도록 방화벽 규칙이 생성되지 않는 한 방화벽에 의해 차단됩니다. 트래픽이 인스턴스에 액세스할 수 있도록 google_compute_firewall 리소스를 추가합니다.

 

이제 Terraform apply를 실행하여 컴퓨팅 인스턴스를 생성합니다. Terraform은 작업을 확인하라는 메시지를 표시합니다.

$ terraform apply

vm_instance라는 google_compute_instance 리소스를 구성에 추가하고 Terraform이 GCP에서 리소스를 생성합니다.

vm 인스턴스 생성 시 google resource에 정의한 region과 zone에 생성합니다.

Modify configuration

Terraform은 리소스 생성 외에도 이러한 리소스를 변경할 수 있습니다.
vm_instance 리소스 블록에 네트워크 tags, labels 인수를 추가합니다.

 

 resource "google_compute_instance" "vm_instance" {
   name         = "terraform-instance"
   machine_type = "f1-micro"
   tags         = ["web", "dev"]
   labels       = {"project"="terraform", "name"="terraform"}
   ## ...
 }

 

Introduce destructive changes

파괴적인 변경은 공급자가 기존 리소스를 업데이트하는 대신 교체해야 하는 변경입니다. 이는 일반적으로 클라우드 공급자가 구성에 설명된 방식으로 리소스 업데이트를 지원하지 않기 때문에 발생합니다.

인스턴스의 디스크 이미지를 변경하는 것은 파괴적인 변경의 한 예입니다. 구성 파일의 vm_instance 리소스 내 boot_disk 블록을 편집하여 다음과 같이 이미지 매개변수를 변경합니다.

위에서 정의한 image = "debian-cloud/debian-9" 를  image = "cos-cloud/cos-stable" 로 변경합니다.

   boot_disk {
     initialize_params {
     image = "cos-cloud/cos-stable"
     }
   }

이 수정은 부팅 디스크를 Debian 9 이미지에서 Google의 Container-Optimized OS로 변경합니다.

terraform apply 다시 실행합니다. Google Cloud Platform은 실행 중인 인스턴스에서 부팅 디스크 이미지 교체를 지원하지 않기 때문에 Terraform은 인스턴스를 교체합니다.

$ terraform apply

Terraform은 먼저 기존 인스턴스를 파괴한 다음 새 인스턴스를 생성합니다. terraform show를 사용하여 이 인스턴스와 연결된 새 값을 확인할 수 있습니다.

 

Destroy Infrastructure

Terraform을 사용하여 인프라를 만들고 수정했습니다. 이제 Terraform 관리 인프라를 파괴하는 방법을 알아봅니다.

인프라가 더 이상 필요하지 않으면 보안 노출과 비용을 줄이기 위해 이를 파괴할 수 있습니다. 예를 들어 서비스에서 프로덕션 환경을 제거하거나 빌드 또는 테스트 시스템과 같은 단기 환경을 관리할 수 있습니다. 인프라를 구축하고 수정하는 것 외에도 Terraform은 관리하는 리소스를 파괴하거나 재생성할 수 있습니다.

 

Destroy

Terraform destroy 명령은 Terraform 프로젝트에서 관리하는 리소스를 종료합니다. 이 명령은 Terraform 상태에 지정된 모든 리소스를 종료한다는 점에서 terraform apply의 반대입니다. 현재 Terraform 프로젝트에서 관리하지 않는 다른 곳에서 실행 중인 리소스는 파괴하지 않습니다.

$ terraform destroy

 

Terraform apply와 마찬가지로 Terraform은 리소스를 파괴해야 하는 순서를 결정합니다. GCP는 VPC 네트워크에 다른 리소스가 아직 남아 있는 경우 VPC 네트워크를 제거하지 않으므로 Terraform은 인스턴스가 먼저 제거될 때까지 기다립니다. 작업을 수행할 때 Terraform은 올바른 작업 순서를 결정하기 위해 종속성 그래프를 생성합니다. 여러 리소스가 있는 더 복잡한 경우 Terraform은 안전한 경우 병렬로 작업을 수행합니다.

 

Define Input Variables

지금까지의 예제에서는 하드 코딩된 값을 사용했습니다. Terraform 구성에는 구성을 보다 동적이고 유연하게 만드는 변수를 사용할 수 있습니다.

 

Define input variables

Learn-terraform-gcp 디렉토리에서 다음 변수 정의를 사용하여 variables.tf라는 새 파일을 만듭니다.

- variables.tf 파일

variable "project" { }

variable "credentials_file" { }

variable "region" {
  default = "asia-northeast3"
}

variable "zone" {
  default = "asia-northeast3-a"
}

팁: Terraform은 작업 디렉토리에서 .tf로 끝나는 모든 파일을 로드하므로 원하는 대로 구성 파일의 이름을 지정할 수 있습니다. 구성을 보다 쉽게 ​​구성하고 이해할 수 있도록 자체 파일에 변수를 정의하는 것이 좋습니다.

 

이 파일은 Terraform 구성 내에서 4개의 변수를 정의합니다. 프로젝트 및 credentials_file 변수에 빈 블록({ })이 있습니다. 지역 및 영역 변수는 기본값을 설정합니다. 기본값이 설정되어 있으면 변수는 선택 사항입니다. 그렇지 않으면 변수가 필요합니다. 지금 terraform 계획을 실행하면 Terraform은 project 및 credentials_file에 대한 값을 묻는 메시지를 표시합니다.

 

Use variables in configuration

새 변수를 사용하도록 main.tf에서 GCP 제공자 구성을 업데이트합니다.

terraform {
  required_providers {
    google = {
      source = "hashicorp/google"
    }
  }
}

provider "google" {
  version = "3.5.0"

// credentials = file("<NAME>.json")
  credentials = file(var.credentials_file)

// project = "<PROJECT_ID>"
// region  = "asia-northeast3"
// zone    = "asia-northeast3-a"
  project = var.project
  region  = var.region
  zone    = var.zone
}

변수는 var. 접두사로 참조됩니다.

 

 

Assign values to your variables.

파일의 값을 사용하여 변수를 설정할 수 있습니다. Terraform은 작업을 실행할 때 작업 디렉토리에서 terraform.tfvars 또는 *.auto.tfvars 라는 파일을 자동으로 로드합니다.

terraform.tfvars라는 파일을 만들고 아래 값을 복사하여 붙여넣습니다. <PROJECT_ID> 및 <FILE>을 GCP 프로젝트 ID와 키 파일 경로로 바꿔야 합니다.

project                  = "<PROJECT_ID>"
credentials_file         = "<FILE>"

 

Apply configuration

terraform apply를 실행합니다.

$ terraform apply

지역 및 구역 입력 변수는 기본값으로 설정되어 있으므로 설정할 필요가 없습니다. 변수 파일에 설정한 값은 원래 구성과 일치하므로 Terraform은 인프라를 변경할 필요가 없습니다.


Query Data with Output Variables

위에서는 입력 변수를 사용하여 Terraform 구성을 매개변수화했습니다. 여기에서는 출력 값을 사용하여 Terraform 사용자에게 쉽게 쿼리하고 표시할 데이터를 구성합니다.

복잡한 인프라를 구축할 때 Terraform은 모든 리소스에 대해 수백 또는 수천 개의 속성 값을 저장합니다. Terraform 사용자는 몇 가지 중요한 가치에만 관심이 있을 수 있습니다. 출력은 표시할 데이터를 지정합니다. 이 데이터는 apply가 호출될 때 출력되며, terraform output 명령어를 사용하여 조회할 수 있습니다.

Define outputs

Terraform이 프로비저닝하는 인스턴스의 IP 주소에 대한 출력을 정의합니다. 다음 내용으로 output.tf라는 파일을 만듭니다.

output "ip" {
  value = google_compute_instance.vm_instance.network_interface.0.network_ip
}

"ip"라는 이름의 출력 변수를 정의합니다. 변수 이름은 다른 모듈에 대한 입력으로 사용되는 경우 Terraform 변수 명명 규칙을 따라야 합니다. 값 필드는 컴퓨팅 인스턴스의 첫 번째 네트워크 인터페이스 속성의 network_ip 값을 지정합니다.

다중 출력 블록을 정의하여 다중 출력 변수를 지정할 수 있습니다.

 

Inspect outputs

이러한 출력 값을 사용하려면 먼저 이 구성을 적용해야 합니다. 

$ terraform apply

Terraform output 명령으로 출력을 쿼리합니다.

$ terraform output

Terraform 출력을 사용하여 Terraform 프로젝트를 인프라의 다른 부분 또는 다른 Terraform 프로젝트와 연결할 수 있습니다. 

 

Destroy your infrastructure

$ terraform destroy

Next steps

Terraform 구성 언어에 대한 더 많은 실습 경험을 원하거나 Terraform의 빌딩 블록에 대해 자세히 알아보려면 아래 문서를 참조합니다.

  • Configuration Language  - 보다 정교한 Terraform 구성을 작성하기 위해 변수, 출력, 종속성, 메타 인수 및 기타 언어 기능에 더 익숙해집니다.
  • Modules  - 모듈로 Terraform 구성을 구성하고 재사용합니다.
  • Provision - Packer 또는 Cloud-init를 사용하여 AWS의 Terraform에서 생성한 Linux VM에 SSH 키와 웹 서버를 자동으로 프로비저닝합니다.
  • Import - 기존 인프라를 Terraform으로 가져옵니다.

Learn more about Terraform Cloud

Terraform Cloud는 로컬 시스템에서 Terraform 실행을 지원하기 위해 표준 원격 백엔드로 작동할 수 있지만 원격 실행 환경에서는 훨씬 더 잘 작동합니다. Terraform 실행을 수행하기 위한 두 가지 주요 워크플로를 지원합니다.

  • 구성의 VCS 리포지토리에 변경 사항이 커밋될 때마다 계획을 자동으로 대기열에 넣는 VCS 기반 워크플로.
  • CI 파이프라인 또는 기타 자동화 도구가 구성을 직접 업로드할 수 있는 API 기반 워크플로.

* 첨부파일 *

main.tf
0.00MB
terraform.tfvars
0.00MB
variables.tf
0.00MB

 

* 참고문서 *

https://learn.hashicorp.com/tutorials/terraform/google-cloud-platform-change?in=terraform/gcp-get-started

https://acloudguru.com/hands-on-labs/using-terraform-to-create-a-new-vpc-and-public-subnet-in-gcp

https://linuxtechlab.com/use-terraform-for-google-cloud-gcp-create-a-vpc/

 

 

 

 

 

 

 

 

 

 

'Terraform' 카테고리의 다른 글

테라폼  (0) 2022.03.28

Infrstructure as Code 도구 테라폼Terraform

테라폼Terraform은 하시코프Hashicorp에서 오픈소스로 개발중인 인프라스트럭처 관리 도구입니다. 서비스 실행에 필요한 환경을 구축하는 도구라는 점에서 셰프Chef나 앤서블Ansible 같은 설정 관리 도구와 더불어 프로비저닝 도구로 분류됩니다. 테라폼은 코드로서의 인프라스트럭처Infrstructure as Code를 지향하고 있는 도구로서, GUI나 웹 콘솔을 사용해 서비스 실행에 필요한 리소스를 관리하는 대신 필요한 리소스들을 선언적인 코드로 작성해 관리할 수 있도록 해줍니다.

 

이 글에서는 테라폼의 기본적인 개념들을 소개하고, 테라폼으로 아마존 웹 서비스Amazon Web Serivce(이하 AWS)에서 간단한 웹 애플리케이션을 배포하기 위한 인프라스트럭처를 프로비저닝해보겠습니다.

 

테라폼 설치

테라폼을 사용하려면 먼저 설치를 해야 합니다.

Linux 는 OS에 따라 패키지를 설치해서 사용할 수 있습니다. 본 문서에서는 Debina/Ubuntu 기준으로 설명합니다.

시스템이 최신 상태이고 gnupg, software-properties-common 및 curl 패키지가 설치되어 있어야 합니다. 이 패키지를 사용하여 HashiCorp의 GPG 서명을 확인하고 HashiCorp의 Debian 패키지 저장소를 설치합니다.

sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl

 

HashiCorp GPG key 추가합니다.

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -

 

공식 HashiCorp Linux 저장소를 추가합니다.
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
 
apt-add-repository 명령어가 없다는 오류 메시지가 발생하면 아래 명령어를 수행합니다.
sudo apt install software-properties-common 
 

저장소를 추가하기 위해 업데이트하고 Terraform CLI를 설치합니다.

sudo apt-get update && sudo apt-get install terraform
 

설치가 잘 되었는지 아래 명령어로 확인합니다.

terraform -version

## Result
Terraform v1.1.7
on linux_amd64

 

Enable tab completion

Enable tab completion 이란 tab 키로 명령어나 파일명을 자동 완성하는 기능입니다.

Bash 또는 Zsh를 사용하는 경우 Terraform 명령에 대해 탭 완성을 활성화할 수 있습니다. 

자동 완성 패키지를 설치합니다.

terraform -install-autocomplete

자동 완성 기능이 설치되면  자동완성 기능을 사용하기 위해서는 셸을 다시 시작해야 합니다.

 

Quick start 

이제 Terraform을 설치했으므로 Mac, Windows 또는 Linux에서 Docker를 사용하여 NGINX 서버를 프로비저닝할 수 있습니다. 

이 문서의 내용을 실행하려면 Docker 엔진이 설치되어 있어야 합니다.
Learn-terraform-docker-container라는 디렉터리를 만들고 디렉터리로 이동합니다.

mkdir learn-terraform-docker-container
cd learn-terraform-docker-container

다음 내용을 Terraform 구성을 main.tf 파일로 저장합니다.

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 2.13.0"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}

Terraform이 Docker와 상호 작용할 수 있도록 프로젝트를 초기화합니다.

terraform init

apply 사용하여 NGINX 서버 컨테이너를 프로비저닝합니다.

Terraform에서 확인을 요청하면 yes를 입력하고 Enter 키를 누릅니다.

terraform apply

웹 브라우저에서 localhost:8000을 입력하거나 docker ps를 실행하여 컨테이너를 확인하여 NGINX 컨테이너를 확인합니다.

 

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS
      NAMES
3771450c61e3   f2f70adc5d89   "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   0.0.0.0:8000->80/tcp   tutorial

컨테이너를 중지하려면 terraform destroy를 실행합니다.

terraform destroy
 

 

'Terraform' 카테고리의 다른 글

테라폼 - GCP  (0) 2022.03.28

+ Recent posts