Terraform으로 GCP에 인프라를 구성해 보자. 방화벽 규칙과 2개의 VM인스턴스를 가진 자동 모드 네트워크 1개를 배포한다.
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
다음과 같이 폴더를 만들고 들어간다.
$ 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!
자동모드 네트워크는 각 리전에 서브네트워크를 자동으로 만들어 준다.
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인스턴스용 스크립트들은 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
}
$ cd tfinfra
$ terraform fmt
# 초기화
$ 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.