Halo semua! Melanjutkan artikel pertama mengenai Private Service Connect, kali ini saya akan membahas bagaimana membuat Private Service Connect dengan cara yang lebih mudah, singkat, dan reusable. Yaitu dengan menggunakan IaC (Infrastructure as Code).

Infrastructure as Code adalah konsep yang dapat kita gunakan untuk mengelola infrastruktur dengan menggunakan kode sebagai representasi dari infrastruktur yang akan kita buat. Pada kali ini, kita akan menggunakan Terraform sebagai IaC untuk membuat komponen-komponen pada Private Service Connect.

Penjelasan lebih lanjut mengenai Terraform sendiri cukup panjang, namun untuk mempersiapkan development environment untuk menggunakan Terraform pada infrastruktur di Google Cloud dapat mengikuti step yang tertulis pada dokumentasi hashicorp. Pada artikel ini, perlu diketahui beberapa command yang digunakan pada Terraform:

  • terraform init: berfungsi untuk menginisialisasi direktori kerja yang berisi konfigurasi Terraform. Ini adalah perintah pertama yang harus dijalankan setelah menulis konfigurasi Terraform baru.
  • terraform plan: memungkinkan kita untuk melihat pratinjau perubahan yang akan dilakukan oleh Terraform pada infrastruktur kita.
  • terraform apply: menjalankan perubahan pada Infrastruktur sesuai konfigurasi yang dituliskan pada Terraform.

Membuat Private Service Connect (IaC)

Masih ingat step yang kita butuhkan untuk membuat Private Service Connect? Berikut adalah step-step yang dibutuhkan:

  • Membuat Subnet
  • Membuat published service pada VPC Producer.
  • Mengakses published service pada VPC Consumer.

Kita akan mencoba membuat komponen-komponen diatas menggunakan Terraform. Yuk kita mulai!

  1. Membuat Subnet untuk PSC

Membuat subnet yang dibutuhkan PSC menggunakan terraform cukup mudah. Pertama kita akan membuat subnet yang akan digunakan untuk mem-publish sebuah service. Maka subnet yang kita butuhkan yaitu subnet yang akan digunakan oleh Internal Load Balancer dan service attachment. Kita bisa menggunakan Terraform modul yang telah disediakan oleh terraform-google-module. Berikut contoh penggunaannya:

module "vpc" {
source = "terraform-google-modules/network/google//modules/subnets-beta"
version = "~> 2.0.0"

project_id = "<PROJECT ID>"
network_name = "<VPC Name>"

subnets = [
{
subnet_name = "subnet-for-ilb"
subnet_ip = "10.0.0.0/24"
subnet_region = "asia-southeast1"
},
{
subnet_name = "subnet-for-service-attachment"
subnet_ip = "10.10.0.0/29"
subnet_region = "asia-southeast1"
subnet_private_access = "false"
subnet_flow_logs = false
description = "Subnet for Service Attachment"
purpose = "PRIVATE_SERVICE_CONNECT"
role = "ACTIVE"
}
]
}

Setelah itu, kita bisa menggunakan command terraform plan untuk mengecek plan subnet yang akan dibuat. Jika sudah sesuai, kita bisa melanjutkan dengan menjalankan terraform apply.

2. Membuat publish service

Seperti yang telah dibahas di part 1, mem-publish sebuah service menggunakan PSC harus melalui sebuah Internal Load Balancer. Untuk itu kita akan membuat sebuah HTTP Internal Load Balancer menggunakan Terraform. Kita juga bisa menggunakan modul yang telah disediakan di terraform-google-module. Berikut contoh penggunaannya:

module "gce-ilb" {
source = "GoogleCloudPlatform/lb-internal/google"
version = "~> 2.0"
region = "asia-southeast1"

name = "psc-ilb"
endpoint_protocol = "HTTP"
port_name = "http"

# Set TCP or UDP
ip_protocol = "TCP"

# Set null to auto allocate
ip_address = ""

health_check = {
type = "tcp"
check_interval_sec = 5
healthy_threshold = 4
timeout_sec = 5
unhealthy_threshold = 2
response = ""
proxy_header = "NONE"
port = 80
port_name = "tcp"
request = ""
host = ""
enable_log = false
}

network = "<network name>"
network_project = "<project name>"
subnetwork = "subnet-for-ilb"

global_access = false

source_tags = null
target_tags = null

backends = [
{ group = "<instance groups self link>", description = "", failover = false, balancing_mode = "UTILIZATION", capacity_scaler = 1 },
]
}

Kemudian kita bisa menggunakan command terraform plan untuk mengecek plan ILB yang akan dibuat. Jika sudah sesuai, kita bisa melanjutkan dengan menjalankan terraform apply.

Setelah kita membuat ILB, kita akan memiliki forwarding rule yang akan kita pakai sebagai target dari service attachment. Untuk membuat service attachment menggunakan terraform, kita membutuhkan selfLink dari forwarding rule Load Balancer yang telah kita buat. Untuk mengecek selfLink, kita bisa mengakses GCP Console > Load Balancing > Frontends.

Pilih forwarding rule dari nama Load Balancer yang telah kita buat, kemudian pilih EQUIVALENT REST untuk mengakses detail-detail yang ada pada frowarding rule.

Kita bisa melihat detail-detail forwarding rule dalam bentuk REST response termasuk selfLink yang akan kita gunakan pada service attachment.

Setelah itu, kita akan membuat Terraform file untuk membuat service attachment. Untuk service attachment belum tersedia modulnya pada terraform-google-module. Namun, kita bisa membuat terraform configuration file sendiri seperti:

resource "google_compute_service_attachment" "ilb_service_attachment" {
name = "psc-producer"
region = "asia-southeast1"
description = "A service attachment configured with Terraform"

enable_proxy_protocol = true
connection_preference = "ACCEPT_MANUAL"
nat_subnets = ["projects/<project-name>/regions/asia-southeast1/subnetworks/<subnetwork-name>"]
target_service = "projects/<project-name>/regions/asia-southeast1/forwardingRules/<forwarding-rule-name>"

# Akan kita isi setelah service attachment diakses oleh consumer
consumer_accept_lists = {}
}

Jalankan terraform plan. Jika plan eksekusi sudah sesuai, jalankan terraform apply. Voila! Kita sudah membuat service attachment dan mempublishnya menggunakan Terraform.

3. Mengakses publish service

Seperti yang telah kita bahas di Part 1, mengakses sebuah publish service membutuhkan selfLink service attachment yang ingin kita akses. SelfLink ini bisa kita lihat melalui GCP Console > Private Service Connect > Published Services.

Pada dasarnya, mengakses PSC Producer melalui Private Service Connect Endpoint seperti membuat sebuah forwarding rule. Kita bisa membuat terraform configuration file menggunakan google_compute_forwarding_rule seperti ini.

resource "google_compute_forwarding_rule" "default" {
# provider = google-beta
name = "psc-consumer"
project = <consumer project id>
region = "asia-southeast1"
load_balancing_scheme = ""
target = "projects/<project id>/regions/asia-southeast1/serviceAttachments/<name>"
network = "projects/<project-name>/regions/asia-southeast1/subnetworks/<subnetwork-name>"
ip_address = google_compute_address.consumer_address.id
}

resource "google_compute_address" "consumer_address" {
name = "psc-consumer-ip"
project = <consumer project id>
region = "asia-southeast1"
subnetwork = "projects/<project-name>/regions/asia-southeast1/subnetworks/<subnetwork-name>"
address_type = "INTERNAL"
}

Setelah membuat PSC Endpoint, hal terakhir yang perlu dilakukan adalah menerima request connection dari PSC Consumer pada PSC Producer. Dapat kita lakukan dengan menggunakan terraform service attachment yang sebelumnya telah kita buat.

resource "google_compute_service_attachment" "ilb_service_attachment" {
name = "psc-producer"
region = "asia-southeast1"
description = "A service attachment configured with Terraform"

enable_proxy_protocol = true
connection_preference = "ACCEPT_MANUAL"
nat_subnets = ["projects/<project-name>/regions/asia-southeast1/subnetworks/<subnetwork-name>"]
target_service = "projects/<project-name>/regions/asia-southeast1/forwardingRules/<forwarding-rule-name>"

# Akan kita isi setelah service attachment diakses oleh consumer
consumer_accept_lists = {
<project id> = {
limit = 6 --> karena subnet yang digunakan hanya memiliki 6 ip range yang dapat digunakan
}
}
}

Jika koneksinya berhasil, maka akan terlihat pada bagian “Connected Projects” koneksi dari project lain yang sudah ter-accept.

Selesai! Kita baru saja melakukan setup Private Service Connect menggunakan terraform.

Semoga bermanfaat :)

--

--

Qassandra Chaidir
Google Cloud Indonesia

I use keyboard a lot and spend most of my time in the Cloud for a living☁️