Menghubungkan ke CloudSQL melalui Private Service Connect (Terraform)

1. Ringkasan

Ada beberapa opsi untuk terhubung ke instance pribadi Cloud SQL dari project atau VPC lain. Private Service Connect (PSC) memungkinkan produsen layanan mengekspos layanan mereka melalui lampiran layanan. Lampiran layanan ini dapat digunakan oleh konsumen untuk membuat endpoint PSC dan/atau backend PSC di lingkungan mereka dan terhubung ke layanan produsen ini melalui IP pribadi yang ditentukan.

Cloud SQL memiliki kemampuan untuk menggunakan lampiran layanan PSC guna mengizinkan koneksi pribadi. Di lab ini, Anda dapat mengonfigurasi dan menguji opsi tersebut.

Di lab ini, Anda akan membangun arsitektur sederhana yang menggambarkan penggunaan akses endpoint PSC dengan CloudSQL.

Gambar 1.

1893f48fe1298ea2.png

Untuk lab ini, Anda memerlukan dua project atau VPC terpisah dalam project yang sama.

Tujuan

Di lab ini, Anda akan mempelajari cara melakukan tugas berikut:

  • Buat instance Cloud SQL dengan lampiran layanan PSC.
  • Membuat alamat IP statis
  • Buat endpoint PSC di VPC konsumen untuk terhubung ke database CloudSQL
  • Verifikasi akses ke database SQL dari VM pengujian di jaringan konsumen melalui IP endpoint PSC.

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.

Dari Google Cloud Console, klik ikon Cloud Shell di toolbar kanan atas:

55efc1aaa7a4d3ad.png

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

7ffe5cbb04455448.png

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda dalam codelab ini dapat dilakukan di browser. Anda tidak perlu menginstal apa pun.

3. Tugas 1. Menyiapkan Lingkungan untuk project database dengan (Terraform)

Di project database, kita akan membuat VPC kustom dengan aturan Firewall dan subnet. Buka konsol cloud dan pilih project yang akan Anda gunakan untuk database.

  1. Buka Cloud Shell yang berada di bagian atas konsol Anda di sebelah kanan, pastikan Anda melihat Project ID database untuk project database di Cloud Shell, dan konfirmasi setiap perintah untuk mengizinkan akses. 4261e776f64ea978.png
  2. Buat folder bernama terraform-db dan pindahkan ke folder
mkdir terraform-db  && cd terraform-db
  1. Buat file main.tf, variable.tf, dan database.tf.
touch main.tf variable.tf database.tf 
  1. Beralihlah ke tampilan Cloud Shell Editor. Pilih editor, pastikan Anda mengizinkan perintah yang diperlukan agar antarmuka dapat dimuat.
  2. Setelah dimuat, buka File > Open Folder, lalu buka /home/your-user-name/terraform-db, dan pilih Ok untuk membuka folder di editor. 78f5eb9f2f82f1b0.png
  3. Pilih file variable.tf dan tambahkan kode berikut. Ganti teks your-database-project-id-here dengan ID project database Anda yang sebenarnya dalam tanda petik. Ganti teks your-consumer-project-id-here dengan ID project konsumen Anda yang sebenarnya dalam tanda petik.
variable "project_id" {
  type = string
  default = "your-database-project-id-here"
}

variable "project_id_consumer" {
  type = set(string)
  default = ["your-consumer-project-id-here"]
}

variable "network_id" {
  type = string
  default = "database-net"
}

variable "region_id" {
  type = string
  default = "us-east1"
}

variable "db_password" {
  type = string
  default = "cloudsql24"
}
  1. Selanjutnya, buka file main.tf. Kita akan menambahkan beberapa kode terraform untuk melakukan berbagai tindakan seperti yang dijelaskan di bawah.

Mengaktifkan API

resource "google_project_service" "default"

Buat VPC

resource "google_compute_network" "default"

Menambahkan aturan Firewall

resource "google_compute_firewall" "allow_icmp"

  1. Salin dan tempel kode berikut ke dalam file main .tf.
resource "google_project_service" "default" {
  for_each = toset([
    "compute.googleapis.com",
    "sqladmin.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = true
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-icmp"]
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}

resource "google_compute_firewall" "allow_sql" {
  name    = "allow-sql-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["3306"]
  }

  source_ranges = ["0.0.0.0/0"]
 }

resource "google_compute_firewall" "allow_internal" {
  name    = "allow-internal-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
    }


  allow {
    protocol = "tcp"
    ports    = ["0-65535"]
  }
  allow {
    protocol = "udp"
    ports    = ["0-65535"]
  }

  source_ranges = ["10.128.0.0/9"]
 }
  1. Beralih kembali ke terminal Cloud Shell, pastikan Anda berada di direktori terraform-db cd terraform-db, lalu jalankan perintah berikut

terraform init

Menginisialisasi direktori kerja. Langkah ini mendownload penyedia yang diperlukan untuk konfigurasi tertentu.

terraform plan

Membuat rencana eksekusi, yang menunjukkan tindakan yang akan dilakukan Terraform untuk men-deploy infrastruktur Anda.

  1. Sekarang untuk membuat resource, jalankan perintah terraform apply dan ketik yes untuk menjalankan.

4. Tugas 2. Membuat instance Cloud SQL dengan lampiran PSC (Terraform)

Mari kita gunakan Terraform untuk membuat instance CloudSQL, dengan opsi PSC untuk mengizinkan konektivitas. Selesaikan konfigurasi ini di project database.

  1. Beralihlah ke tampilan Cloud Shell Editor. Pastikan Anda berada di folder terraform-db. Pilih file database.tf dan tambahkan berikut ini.
resource "google_sql_database_instance" "default" {
  name             = "psc-sql-db"
  region           = var.region_id
  database_version = "MYSQL_8_0"
  settings {
    tier              = "db-f1-micro"
    availability_type = "REGIONAL"
    backup_configuration {
      enabled            = true
      binary_log_enabled = true
    }
    ip_configuration {
      psc_config {
        psc_enabled               = true
        allowed_consumer_projects = var.project_id_consumer
      }
      ipv4_enabled = false
    }
  }
  deletion_protection = false 
}

resource "google_sql_user" "users" {
  name     = "testsql"
  instance = google_sql_database_instance.default.name
  password = var.db_password 
}
  1. Beralih kembali ke terminal Cloud Shell, pastikan Anda berada di direktori terraform-db. Sekarang untuk membuat resource, jalankan perintah terraform apply dan ketik yes untuk menjalankan. Membuat instance CloudSQL dengan lampiran PSC dapat memakan waktu hingga 5+ menit.

Memverifikasi database

  1. Setelah selesai, buka SQL di konsol, lalu pilih instance database psc-sql-db yang baru dibuat.
  2. Di sisi kiri, perluas slide-out opsi SQL, lalu pilih Koneksi
  3. Di tab ringkasan, Anda dapat melihat informasi tentang koneksi.
  4. Salin Service attachment address dan simpan di suatu tempat di sistem Anda.
  5. Anda akan memerlukannya untuk menyelesaikan langkah 8 tugas 3.

Cloud SQL dengan lampiran PSC

  1. Di sisi kiri, luaskan panel samping opsi SQL, lalu pilih Pengguna.
  2. Anda akan melihat pengguna bernama testsql dengan sandi cloudsql24 (Sandi ini akan digunakan untuk mengakses db nanti)

5. Tugas 3. Menyiapkan Lingkungan untuk project konsumen (Terraform)

Di project konsumen, kita akan membuat VPC kustom dengan aturan Firewall dan subnet. Buka konsol cloud dan pilih project yang akan Anda gunakan.

  1. Di bagian atas konsol Anda di sebelah kanan di samping ikon Google Cloud, klik dropdown, lalu pilih tab all.

project barproject bar 2

  1. Dari project yang tercantum, pilih ID project konsumen Anda untuk melanjutkan.
  2. Buka Cloud Shell yang berada di bagian atas konsol Anda di sebelah kanan, pastikan Anda melihat project ID konsumen di Cloud Shell, dan konfirmasi perintah apa pun untuk mengizinkan akses.
  3. Buat folder bernama terraform-consumer dan pindahkan ke folder
mkdir terraform-consumer  && cd terraform-consumer
  1. Buat file main.tf, variable.tf, dan psc.tf.
touch main.tf variable.tf psc.tf 
  1. Beralihlah ke tampilan Cloud Shell editor untuk ID project konsumen. Pilih editor, pastikan Anda mengizinkan perintah yang diperlukan agar antarmuka dapat dimuat.
  2. Setelah dimuat, buka File > Open Folder, lalu buka /home/your-user-name/terraform-consumer, lalu pilih Ok untuk membuka folder di editor. 78f5eb9f2f82f1b0.png
  3. Pilih file variable.tf dan tambahkan kode berikut. Ganti teks your-consumer-project-id-here dengan project ID konsumen Anda yang sebenarnya dalam tanda petik. Ganti teks your-psc-attachment-id-here dengan alamat lampiran psc Anda dalam tanda petik. Ini adalah ID yang Anda salin di bagian tugas 2-5 d7ac9629a59abfc6.png
variable "project_id" {
  type = string
  default = "your-consumer-project-id-here"
}

variable "psc_attachment_id" {
  type = string
  default = "your-psc-attachment-id-here"
}

variable "network_id" {
  type = string
  default = "psc-endpoint-net"
}

variable "region_id" {
  type = string
  default = "us-east1"
}

variable "region_id2" {
  type = string
  default = "us-central1"
}
  1. Selanjutnya, buka file main.tf. Kita akan menambahkan beberapa kode terraform untuk melakukan berbagai tindakan seperti yang dijelaskan di bawah.

Mengaktifkan API

resource "google_project_service"

Buat VPC

resource "google_compute_network"

Buat gateway NAT

resource "google_compute_router"
resource "google_compute_router_nat"

Menambahkan aturan Firewall

resource "google_compute_firewall"

  1. Salin dan tempel kode berikut ke dalam file main .tf.
resource "google_project_service" "default" {
  for_each = toset([
    "compute.googleapis.com",
    "cloudresourcemanager.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = false
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_subnetwork" "vm_subnet" {
  name          = "vm-subnet"
  ip_cidr_range = "192.168.50.0/24"
  region        = var.region_id2
  network       = google_compute_network.default.name
  project       = var.project_id
}

resource "google_compute_subnetwork" "psc_subnet" {
  name          = "psc-subnet"
  ip_cidr_range = "192.168.90.0/24"
  region        = var.region_id
  network       = google_compute_network.default.name
  project       = var.project_id
}

resource "google_compute_router" "default" {
  name    = "outbound-nat"
  region  = var.region_id2
  network = google_compute_network.default.id

 bgp {
  asn = 64514
  }
}

resource "google_compute_router_nat" "default" {
  name = "outbound-nat-gw"
  router = google_compute_router.default.name
  region = google_compute_router.default.region
  nat_ip_allocate_option = "AUTO_ONLY"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"

  log_config {
    enable = true
    filter = "ERRORS_ONLY"
  }
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}


resource "google_compute_firewall" "allow_internal" {
  name    = "allow-internal-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
    }


  allow {
    protocol = "tcp"
    ports    = ["0-65535"]
  }
  allow {
    protocol = "udp"
    ports    = ["0-65535"]
  }

  source_ranges = ["192.168.0.0/16"]
 }
  1. Beralih kembali ke terminal Cloud Shell, pastikan Anda berada di direktori terraform-consumer cd terraform-consumer di project konsumen, lalu jalankan perintah berikut

terraform init

Menginisialisasi direktori kerja. Langkah ini mendownload penyedia yang diperlukan untuk konfigurasi tertentu.

terraform plan

Membuat rencana eksekusi, yang menunjukkan tindakan yang akan dilakukan Terraform untuk men-deploy infrastruktur Anda.

  1. Sekarang untuk membuat resource, jalankan perintah terraform apply dan ketik yes untuk menjalankan.

6. Tugas 4. Buat lampiran endpoint PSC ke SQL DB di project konsumen dan VM pengujian (Terraform)

Selesaikan konfigurasi ini di project konsumen.

  1. Beralih kembali ke Cloud Shell editor, buka direktori terraform-consumer, lalu pilih file psc.tf. Tambahkan kode Terraform berikut ke file. Tindakan ini akan membuat IP internal statis, endpoint PSC, dan VM pengujian dengan MariaDB yang diinstal.
resource "google_compute_address" "default" {
  name = "psc-ip"
  region = var.region_id
  address_type = "INTERNAL"
  subnetwork = google_compute_subnetwork.psc_subnet.name
  address = "192.168.90.100" 
}

resource "google_compute_forwarding_rule" "default" {
  name = "psc-sql-endpoint"
  region = var.region_id
  network = google_compute_network.default.name
  ip_address = google_compute_address.default.self_link
  load_balancing_scheme = ""
  target = var.psc_attachment_id
}


resource "google_compute_instance" "sql_test_vm" {
  name         = "sql-test-vm"
  machine_type = "e2-medium"
  zone         = "${var.region_id2}-b"
  project      = var.project_id

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

  network_interface {
    subnetwork = google_compute_subnetwork.vm_subnet.name
  }

  # No external IP address
  network_performance_config {
    total_egress_bandwidth_tier = "DEFAULT"
  }

  tags = ["allow-icmp", "allow-ssh", "allow-internal", "allow-health-check"]

  # Install MariaDB at startup
  metadata_startup_script = <<EOF
#!/bin/bash
apt-get update
apt-get install -y mariadb-server
systemctl enable mariadb
EOF
}
  1. Beralih kembali ke terminal Cloud Shell, pastikan Anda berada di direktori terraform-consumer cd terraform-consumer di project konsumen, lalu jalankan perintah berikut

terraform plan

Membuat rencana eksekusi, yang menunjukkan tindakan yang akan dilakukan Terraform untuk men-deploy infrastruktur Anda.

  1. Sekarang untuk membuat resource, jalankan perintah terraform apply dan ketik yes untuk menjalankan
  2. Karena VM dan endpoint berada di region yang berbeda, kita perlu mengaktifkan Akses Global di endpoint PSC. Kita melakukannya melalui konsol
  3. Di konsol project konsumen, buka Private Service Connect. Di tab Connected Endpoint, lihat di bagian Endpoint dan pilih psc-sql-endpoint
  4. Sekarang pilih EDIT, lalu klik kotak centang di samping opsi Aktifkan akses global dan Simpan. 7eeb5a4162f5f79d.png
  5. Lanjutkan ke langkah berikutnya untuk memverifikasi konektivitas

7. Tugas 5. Memverifikasi konektivitas endpoint dari VM melalui alamat IP PSC

Selesaikan ini di project konsumen

  1. Buka VM Instance. Pilih sql-test-vm
  2. Pilih opsi SSH untuk terhubung ke VM.
  3. Hubungkan ke DB melalui endpoint dengan:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. Setelah koneksi dibuat, buat database dengan psc-sql-db berikut.
CREATE DATABASE remotesqldb;
  1. Setelah selesai, ketik exit untuk keluar dari koneksi.

8. Tugas 6. Memverifikasi entri database

Selesaikan verifikasi ini di project database

  1. Di bagian atas konsol Anda di sebelah kanan di samping ikon Google Cloud, klik dropdown, lalu pilih tab all.

project barproject bar 2

  1. Dari project yang tercantum, pilih project ID database Anda untuk melanjutkan.
  2. Buka SQL, pilih database psc-sql-db, luaskan opsi SQL, lalu pilih Databases. Anda akan melihat database yang baru saja Anda buat bernama remotesqldb dari VM project konsumen**.**

cloud sql db

9. Pembersihan

Selesaikan ini di project Database

  1. Pilih project ID database
  2. Buka Cloud Shell dan pastikan Anda melihat project ID database
  3. Buka direktori terraform-db cd terraform-db dan jalankan perintah terraform destroy berikut, lalu ketik yes semua resource yang Anda buat di project db dengan Terraform akan dihapus.

Selesaikan langkah ini di project Konsumen

  1. Pilih project ID konsumen
  2. Buka Cloud Shell dan pastikan Anda melihat project ID konsumen
  3. Buka direktori terraform-consumer cd terraform-consumer dan jalankan perintah berikut terraform destroy dan ketik yes semua resource yang Anda buat di project db dengan Terraform akan dihapus.

10. Selamat

Selamat, Anda telah berhasil mengonfigurasi instance Cloud SQL dengan lampiran PSC dan membuat endpoint Private Service Connect di VPC lain. Anda telah berhasil terhubung dari VM jarak jauh melalui endpoint PSC ke database.

Pelajari lebih lanjut

Anda dapat membaca selengkapnya tentang Private Service Connect dan Cloud SQL