October 23, 2021

Dùng Terraform để xây dựng cơ sở hạ tầng (build infrastructure) trên GCP

Trước tiên chúng ta cần biết Terraform là một công cụ nguồn mở giúp thực hiện xây dựng cơ sở hạ tầng bằng cách chạy một script (Ví dụ:

main.tf : file này chứa các đoạn mã để tạo tài nguyên theo mong muốn ), khởi xướng bởi Hashicorp. Trong bài này mình cùng các bạn khởi tạo nguồn tài nguyên là một VM thông qua Terraform script nhé.

Thật may là Terraform đã được cài sẵn trên Cloud Shell rồi, chúng ta mở Cloud Shell lên và chạy thử lệnh sau để đảm bảo check verion nhé: terraform -v

Trước tiên bạn tạo file script main.tf có nội dung dưới đây: ( vi main.tf rồi copy paste nội dung dưới, tiếp theo :wq)

resource "random_id" "network_id" {
  byte_length = 8
}

resource "google_project_service" "compute" {
  service = "compute.googleapis.com"
}

# Create the network
module "vpc" {
  source  = "terraform-google-modules/network/google"
  version = "~> 0.4.0"

  # Give the network a name and project
  project_id   = "${google_project_service.compute.project}"
  network_name = "my-custom-vpc-${random_id.network_id.hex}"

  subnets = [
    {
      # Creates your first subnet in us-west1 and defines a range for it
      subnet_name   = "my-first-subnet"
      subnet_ip     = "10.10.10.0/24"
      subnet_region = "us-west1"
    },
    {
      # Creates a dedicated subnet for GKE
      subnet_name   = "my-gke-subnet"
      subnet_ip     = "10.10.20.0/24"
      subnet_region = "us-west1"
    },
  ]

  # Define secondary ranges for each of your subnets
  secondary_ranges = {
    my-first-subnet = []

    my-gke-subnet = [
      {
        # Define a secondary range for Kubernetes pods to use
        range_name    = "my-gke-pods-range"
        ip_cidr_range = "192.168.64.0/24"
      },
    ]
  }
}

resource "random_id" "instance_id" {
  byte_length = 8
}

# Launch a VM on it
resource "google_compute_instance" "default" {
  name         = "vm-${random_id.instance_id.hex}"
  project      = "${google_project_service.compute.project}"
  machine_type = "f1-micro"
  zone         = "us-west1-a"

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

  network_interface {
    subnetwork         = "${module.vpc.subnets_names[0]}"
    subnetwork_project = "${google_project_service.compute.project}"

    access_config {
      # Include this section to give the VM an external ip address
    }
  }

  # Apply the firewall rule to allow external IPs to ping this instance
  tags = ["allow-ping"]
}

# Allow traffic to the VM
resource "google_compute_firewall" "allow-ping" {
  name    = "default-ping"
  network = "${module.vpc.network_name}"
  project = "${google_project_service.compute.project}"

  allow {
    protocol = "icmp"
  }

  # Allow traffic from everywhere to instances with an http-server tag
  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ping"]
}

output "ip" {
  value = "${google_compute_instance.default.network_interface.0.access_config.0.nat_ip}"
}

Cấu trúc của file main.tf có nhiều thành phần trong đó ta nên chú ý ở 2 điểm, tạo hệ thống network mạng riêng ảo vpc:

# Create the network
module "vpc" {
  source  = "terraform-google-modules/network/google"
  version = "~> 0.4.0"
...

Tạo VM:

resource "google_compute_instance" "default" {
  name         = "vm-${random_id.instance_id.hex}"
  machine_type = "f1-micro"
  zone         = "us-west1-a"

Tại Cloud Shell ta chạy 3 lệnh sau để chạy Terraform script để tạo ra cơ sở hạ tầng mong muốn.

terraform init
terraform plan
terraform apply

Kết quả chạy 3 lệnh trên giống như hình dưới phải không nào.

Vậy là terraform đã tạo xong infra cho chúng ta rồi, thử test bằng 2 lệnh sau từ Cloud Shell: gcloud compute instances listgcloud compute networks list xem kết quả có giống hình dưới không nào.

Khi thực hành có chỗ nào chưa hiểu, cần support, các bạn hãy liên hệ với các chuyên gia Cloud Ace , hoặc comment ở form comment bên dưới, để nhận được hỗ trợ tốt hơn.