GCP에서 Terraform 써보기

sh5·2024년 12월 17일
0

목표

Terraform으로 GCP에 인프라를 구성해 보자. 방화벽 규칙과 2개의 VM인스턴스를 가진 자동 모드 네트워크 1개를 배포한다.

작업환경

Terraform

GCP는 Cloudh Shell에서 terraform을 바로 사용할 수 있다.
다음의 명령어로 확인해 볼 수 있다.

$ terraform --version

Terraform v1.5.7
on linux_amd64
+ provider registry.terraform.io/hashicorp/google v6.14.0

Your version of Terraform is out of date! The latest version
is 1.10.2. You can update by downloading from https://www.terraform.io/downloads.html

목표 폴더,파일 구성

다음과 같은 폴더 및 파일을 구성할 예정이다.

tfinfra
├── instance
│   ├── main.tf
│   └── variables.tf
├── mynetwork.tf
├── provider.tf
└── terraform.tfstate

Terraform 초기화

다음과 같이 폴더를 만들고 들어간다.

$ mkdir tfinfra
$ cd tfinfra

provider.tf 파일을 만든다.
인프라 제공업체인 구글을 쓰기 때문에 provider는 google이 된다.

# provider.tf

provider "google" {}

terraform을 초기화 한다.

$ terraform init

* provider.google: version = "~> 4.43.0"
Terraform has been successfully initialized!

Terraform 스크립트 작성

자동모드 네트워크

자동모드 네트워크는 각 리전에 서브네트워크를 자동으로 만들어 준다.
mynetwork.tf 파일을 만든다.

# mynetwork.tf

# Create the mynetwork network
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# RESOURCE properties go here
# auto_create_subnetworks은 각 리전에 서브네트워크를 자동으로 만들어 주는 옵션
auto_create_subnetworks = "true" 
}

방화벽 규칙

mynetwork.tf파일에 내용을 추가한다.

# mynetwork.tf
...
# Add a firewall rule to allow HTTP, SSH, RDP and ICMP traffic on mynetwork
resource "google_compute_firewall" "mynetwork-allow-http-ssh-rdp-icmp" {
name = "mynetwork-allow-http-ssh-rdp-icmp"
# RESOURCE properties go here
network = google_compute_network.mynetwork.self_link
allow {
    protocol = "tcp"
    ports    = ["22", "80", "3389"]
    }
allow {
    protocol = "icmp"
    }
source_ranges = ["0.0.0.0/0"]
}

VM인스턴스

VM인스턴스용 스크립트들은 instance라는 폴더에 추가한다.

$ mkdir instance
$ touch main.tf
$ touch variables.tf

main.tf에 다음의 내용을 넣는다.
${var.*} 변수를 사용하면 변수를 인스턴스가 정의된 정보를 참조해서 쓸 수 있다.

# instance/main.tf

resource "google_compute_instance" "vm_instance" {
  # 인스턴스에 명시된 값을 변수로 가져온다
  name         = "${var.instance_name}"
  zone         = "${var.instance_zone}"
  machine_type = "${var.instance_type}"
  #부팅 디스크가 Debian 11 OS 이미지를 사용하도록 정의합니다
  boot_disk { 
    initialize_params {
      image = "debian-cloud/debian-11"
      }
  }
  network_interface {
    network = "${var.instance_network}"
    access_config {
      # Allocate a one-to-one NAT IP to the instance
      # 액세스 구성을 비워 두면 임시 외부 IP 주소가 생성된다. 
      # 내부 IP 주소만으로 인스턴스를 만들려면 access_config 섹션을 삭제해야 한다.
    }
  }
}

main.tf가 사용할 변수에 대한 파일variables.tf를 작성한다.

#  instance/variables.tf

variable "instance_name" {}
variable "instance_zone" {}
variable "instance_type" {
  default = "e2-micro"
  }
variable "instance_network" {}

이제 mynetwork.tf에 VM인스턴스 정보를 추가한다.

# mynetwork.tf
...
# Create the mynet-us-vm instance
module "mynet-us-vm" {
  source           = "./instance"
  instance_name    = "mynet-us-vm"
  instance_zone    = "Zone"
  instance_network = google_compute_network.mynetwork.self_link
}

# Create the mynet-eu-vm" instance
module "mynet-eu-vm" {
  source           = "./instance"
  instance_name    = "mynet-eu-vm"
  instance_zone    = "Zone 2"
  instance_network = google_compute_network.mynetwork.self_link
}

최종적으로 mynetwork.tf는 다음과 같아야 한다.

# Create the mynetwork network
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# RESOURCE properties go here
auto_create_subnetworks = "true"
}
# Add a firewall rule to allow HTTP, SSH, RDP and ICMP traffic on mynetwork
resource "google_compute_firewall" "mynetwork-allow-http-ssh-rdp-icmp" {
name = "mynetwork-allow-http-ssh-rdp-icmp"
# RESOURCE properties go here
network = google_compute_network.mynetwork.self_link
allow {
    protocol = "tcp"
    ports    = ["22", "80", "3389"]
    }
allow {
    protocol = "icmp"
    }
source_ranges = ["0.0.0.0/0"]
}
# Create the mynet-us-vm instance
module "mynet-us-vm" {
  source           = "./instance"
  instance_name    = "mynet-us-vm"
  instance_zone    = "Zone"
  instance_network = google_compute_network.mynetwork.self_link
}
# Create the mynet-eu-vm" instance
module "mynet-eu-vm" {
  source           = "./instance"
  instance_name    = "mynet-eu-vm"
  instance_zone    = "Zone 2"
  instance_network = google_compute_network.mynetwork.self_link
}

리소스 생성

mynetwork 구성

$ cd tfinfra
$ terraform fmt

terraform 초기화

# 초기화
$ terraform init

Initializing modules...
- mynet-eu-vm in instance
- mynet-us-vm in instance
...
* provider.google: version = "~> 4.43.0"

Terraform has been successfully initialized!
# 계획생성
$ terraform plan

...
Plan: 4 to add, 0 to change, 0 to destroy.
...
# 적용
$ terraform apply
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

리소스 확인

Cloud Console에서 네트워크 확인

  1. Cloud Console의 탐색 메뉴(탐색 메뉴 아이콘)에서 VPC 네트워크 > VPC 네트워크를 클릭합니다.
  2. mynetwork VPC 네트워크와 모든 리전의 서브네트워크를 확인합니다.
  3. 탐색 메뉴에서 VPC 네트워크 > 방화벽을 클릭합니다.
  4. 네트워크를 기준으로 방화벽 규칙을 정렬합니다.
  5. mynetwork에 대한 mynetwork-allow-http-ssh-rdp-icmp 방화벽 규칙을 확인합니다.

Cloud Console에서 VM 인스턴스 확인

  1. 탐색 메뉴(탐색 메뉴 아이콘)에서 Compute Engine > VM 인스턴스를 클릭합니다.
  2. mynet-us-vm 및 mynet-eu-vm 인스턴스를 확인합니다.
  3. mynet-eu-vm의 내부 IP 주소를 확인합니다.
  4. mynet-us-vm에서 SSH를 클릭하여 터미널 및 연결을 실행합니다.
  5. mynet-eu-vm의 내부 IP 주소에 대한 연결을 테스트하려면 SSH 터미널에서 mynet-eu-vm의 내부 IP 주소를 앞서 언급한 값으로 변경하여 다음 명령어를 실행합니다.

0개의 댓글