חיבור ל-CloudSQL דרך Private Service Connect (Terraform)

1. סקירה כללית

יש כמה אפשרויות להתחברות למופע פרטי של Cloud SQL מפרויקט אחר או מרשתות VPC. ‫Private Service Connect (PSC) מאפשר לבעלים של שירות מנוהל לחשוף את השירותים שלהם באמצעות קבצים מצורפים עם שירות. צרכנים יכולים להשתמש בצירופי השירות האלה כדי ליצור נקודות קצה (endpoints) של PSC או בק-אנדים של PSC בסביבה שלהם ולהתחבר לשירותים המנוהלים האלה באמצעות כתובת IP פרטית שצוינה.

ל-Cloud SQL יש אפשרות להשתמש בצירוף שירות PSC כדי לאפשר חיבור פרטי. בשיעור ה-Lab הזה תוכלו להגדיר את האפשרות ולבדוק אותה.

בשיעור ה-Lab הזה תבנו ארכיטקטורה פשוטה שממחישה את השימוש בגישה לנקודת קצה (endpoint) של PSC עם CloudSQL.

איור 1.

1893f48fe1298ea2.png

לשיעור ה-Lab הזה תצטרכו שני פרויקטים או שתי רשתות VPC נפרדות באותו פרויקט.

מטרות

בשיעור ה-Lab הזה תלמדו איך לבצע את המשימה הבאה:

  • יצירת מכונה של CloudSQL עם קובץ מצורף של שירות PSC.
  • יצירת כתובת IP סטטית
  • יצירת נקודת קצה (endpoint) מסוג PSC ב-VPC של הלקוח כדי להתחבר למסד הנתונים של CloudSQL
  • מאמתים את הגישה למסד הנתונים של SQL ממכונה וירטואלית לבדיקה ברשת הצרכן באמצעות כתובת ה-IP של נקודת הקצה של PSC.

2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

fbef9caa1602edd0.pnga99b7ace416376c4.png5e3ff691252acf41.png

  • שם הפרויקט הוא השם המוצג למשתתפים בפרויקט. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. תמיד אפשר לעדכן את המיקום.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שהוא מוגדר. מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית. בדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל מסומן כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא נשארת לאורך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על שלושת הערכים האלה מופיע במאמרי העזרה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. השלמת ה-codelab הזה לא תעלה לכם הרבה, אם בכלל. כדי להשבית את המשאבים ולמנוע חיובים נוספים אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

מפעילים את Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-Codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

ב-מסוף Google Cloud, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:

55efc1aaa7a4d3ad.png

הקצאת המשאבים והחיבור לסביבה יימשכו רק כמה רגעים. בסיום התהליך, אמור להופיע משהו כזה:

7ffe5cbb04455448.png

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את כל העבודה ב-codelab הזה בדפדפן. לא צריך להתקין שום דבר.

3. משימה 1: הגדרת סביבה לפרויקט מסד נתונים באמצעות (Terraform)

בפרויקט מסד הנתונים,ניצור VPC עם כללי חומת אש ותת-רשת בהתאמה אישית. פותחים את מסוף Cloud ובוחרים את הפרויקט שבו ישמש מסד הנתונים.

  1. פותחים את Cloud Shell בפינה השמאלית העליונה של המסוף, מוודאים שמוצג מזהה הפרויקט של מסד הנתונים ב-Cloud Shell ומאשרים את ההנחיות שמופיעות כדי לאפשר גישה. 4261e776f64ea978.png
  2. יוצרים תיקייה בשם terraform-db ועוברים לתיקייה
mkdir terraform-db  && cd terraform-db
  1. יוצרים קובץ main.tf, ‏ variable.tf וקובץ database.tf.
touch main.tf variable.tf database.tf 
  1. עוברים לתצוגה של Cloud Shell Editor. בוחרים באפשרות עורך ומוודאים שמאשרים את כל ההנחיות הנדרשות כדי שהממשק ייטען.
  2. אחרי הטעינה, עוברים אל File > Open Folder (קובץ > פתיחת תיקייה), אל ‎/home/your-user-name/terraform-db ולוחצים על Ok (אישור) כדי לפתוח את התיקייה בעורך. 78f5eb9f2f82f1b0.png
  3. בוחרים את הקובץ variable.tf ומוסיפים את הקוד הבא. מחליפים את הטקסט your-database-project-id-here במזהה פרויקט מסד הנתונים בפועל, בתוך מרכאות. מחליפים את הטקסט your-consumer-project-id-here במזהה פרויקט הצרכן בפועל שלכם בתוך מרכאות.
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. לאחר מכן פותחים את הקובץ main.tf. אנחנו נוסיף קוד Terraform כדי לבצע פעולות שונות, כמו שמוסבר בהמשך.

הפעלת ממשקי API

resource "google_project_service" "default"

יצירת VPC

resource "google_compute_network" "default"

הוספת כללים לחומת האש

resource "google_compute_firewall" "allow_icmp"

  1. מעתיקים את הקוד הבא ומדביקים אותו בקובץ 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. חוזרים אל הטרמינל של Cloud Shell, מוודאים שאתם בספרייה terraform-db cd terraform-db ומריצים את הפקודות הבאות:

terraform init

מאתחלת את ספריית העבודה. בשלב הזה מתבצעת הורדה של הספקים שנדרשים להגדרה הנתונה.

terraform plan

יוצרת תוכנית הרצה שמראה אילו פעולות Terraform תבצע כדי לפרוס את התשתית.

  1. כדי ליצור את המשאבים, מריצים את הפקודה terraform apply ומקלידים yes כדי להריץ.

4. משימה 2: יצירת מכונה של Cloud SQL עם צירוף של PSC‏ (Terraform)

נשתמש ב-Terraform כדי ליצור מכונת CloudSQL עם האפשרות PSC כדי לאפשר קישוריות. משלימים את ההגדרה בפרויקט מסד הנתונים.

  1. עוברים לתצוגה של Cloud Shell Editor. מוודאים שאתם נמצאים בתיקייה terraform-db. בוחרים את הקובץ database.tf ומוסיפים את השורות הבאות.
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. חוזרים אל הטרמינל של Cloud Shell ומוודאים שאתם נמצאים בספרייה terraform-db. כדי ליצור את המשאבים, מריצים את הפקודה terraform apply ומקלידים yes כדי להריץ. יצירת מכונת CloudSQL עם קובץ מצורף של PSC עשויה להימשך יותר מ-5 דקות.

אימות מסד הנתונים

  1. אחרי שהפעולה מסתיימת, עוברים אל SQL במסוף ובוחרים את מופע מסד הנתונים psc-sql-db שנוצר.
  2. בצד ימין, מרחיבים את האפשרויות של SQL ובוחרים באפשרות חיבורים.
  3. בכרטיסיית הסיכום אפשר לראות מידע על החיבור.
  4. מעתיקים את הכתובת של קובץ השירות ושומרים אותה במקום כלשהו במערכת.
  5. תצטרכו את זה כדי להשלים את שלב 8 במשימה 3.

Cloud sql with psc attachment

  1. בצד ימין, מרחיבים את החלונית הנפתחת של אפשרויות ה-SQL ובוחרים באפשרות משתמשים.
  2. אמור להופיע משתמש בשם testsql עם הסיסמה cloudsql24 (הסיסמה הזו תשמש לגישה למסד הנתונים בהמשך)

5. משימה 3: הגדרת סביבה לפרויקט צרכן (Terraform)

בפרויקט הצרכן, ניצור VPC מותאם אישית עם כללי חומת אש ותת-רשת. פותחים את Cloud Console ובוחרים את הפרויקט שבו רוצים להשתמש.

  1. בחלק העליון של המסוף, בצד שמאל לצד סמל Google Cloud, לוחצים על התפריט הנפתח ואז בוחרים בכרטיסייה all.

סרגל הפרויקט סרגל הפרויקט 2

  1. מהרשימה של הפרויקטים, בוחרים את מזהה הפרויקט לצרכן כדי להמשיך.
  2. פותחים את Cloud Shell בפינה הימנית העליונה של המסוף, מוודאים שמופיע מזהה פרויקט הצרכן ב-Cloud Shell ומאשרים את כל ההנחיות למתן גישה.
  3. יוצרים תיקייה בשם terraform-consumer ועוברים לתיקייה.
mkdir terraform-consumer  && cd terraform-consumer
  1. יוצרים קובץ main.tf, variable.tf וקובץ psc.tf.
touch main.tf variable.tf psc.tf 
  1. עוברים לתצוגה של העורך של Cloud Shell בשביל מזהה פרויקט הצרכן. בוחרים באפשרות עורך ומוודאים שמאשרים את כל ההנחיות הנדרשות כדי שהממשק ייטען.
  2. אחרי שהקובץ נטען, עוברים אל File > Open Folder (קובץ > פתיחת תיקייה), אל /home/your-user-name/terraform-consumer ולוחצים על Ok (אישור) כדי לפתוח את התיקייה בעורך. 78f5eb9f2f82f1b0.png
  3. בוחרים את הקובץ variable.tf ומוסיפים את הקוד הבא. מחליפים את הטקסט your-consumer-project-id-here במזהה הפרויקט בפועל של הצרכן במירכאות. מחליפים את הטקסט your-psc-attachment-id-here בכתובת הקובץ המצורף של ה-PSC במירכאות. זהו המזהה שהעתקתם במשימה 2, קטע 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. לאחר מכן פותחים את הקובץ main.tf. אנחנו נוסיף קוד Terraform כדי לבצע פעולות שונות, כמו שמוסבר בהמשך.

הפעלת ממשקי API

resource "google_project_service"

יצירת VPC

resource "google_compute_network"

יצירת שער NAT

resource "google_compute_router"
resource "google_compute_router_nat"

הוספת כללים לחומת האש

resource "google_compute_firewall"

  1. מעתיקים את הקוד הבא ומדביקים אותו בקובץ 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. חוזרים אל הטרמינל של Cloud Shell, מוודאים שאתם בספרייה terraform-consumer cd terraform-consumer בפרויקט הצרכן ומריצים את הפקודות הבאות:

terraform init

מאתחלת את ספריית העבודה. בשלב הזה מתבצעת הורדה של הספקים שנדרשים להגדרה הנתונה.

terraform plan

יוצרת תוכנית הרצה שמראה אילו פעולות Terraform תבצע כדי לפרוס את התשתית.

  1. כדי ליצור את המשאבים, מריצים את הפקודה terraform apply ומקלידים yes כדי להריץ.

6. משימה 4: יצירת נקודת הקצה של PSC לצירוף למסד נתונים של SQL במכונה הווירטואלית לבדיקה בפרויקט הצרכן (Terraform)

משלימים את ההגדרה בפרויקט הצרכן.

  1. חוזרים אל Cloud Shell Editor, פותחים את הספרייה terraform-consumer ובוחרים את הקובץ psc.tf. מוסיפים את קוד Terraform הבא לקובץ. הפעולה הזו יוצרת כתובת IP פנימית סטטית, נקודת קצה (endpoint) של PSC ומכונה וירטואלית לבדיקה עם Maria DB מותקן.
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. חוזרים אל הטרמינל של Cloud Shell, מוודאים שאתם בספרייה terraform-consumer cd terraform-consumer בפרויקט הצרכן ומריצים את הפקודות הבאות:

terraform plan

יוצרת תוכנית הרצה שמראה אילו פעולות Terraform תבצע כדי לפרוס את התשתית.

  1. כדי ליצור את המשאבים, מריצים את הפקודה terraform apply ומקלידים yes כדי להריץ
  2. מכיוון שהמכונה הווירטואלית ונקודת הקצה שלנו נמצאות באזורים שונים, אנחנו צריכים להפעיל גישה גלובלית בנקודת הקצה של PSC. אנחנו עושים את זה דרך המסוף
  3. במסוף של פרויקט הצרכן, עוברים אל Private Service Connect. בכרטיסייה Connected Endpoint (נקודת קצה מקושרת), בקטע Endpoint (נקודת קצה), בוחרים באפשרות psc-sql-endpoint.
  4. לוחצים על עריכה,מסמנים את תיבת הסימון לצד האפשרות הפעלת גישה גלובלית ולוחצים על שמירה. 7eeb5a4162f5f79d.png
  5. כדי לאמת את הקישוריות, ממשיכים לשלב הבא

7. משימה 5: אימות הקישוריות של נקודת הקצה מ-VM באמצעות כתובת ה-IP של PSC

צריך לבצע את הפעולה הזו בפרויקט של הצרכן

  1. עוברים אל VM Instance. בוחרים באפשרות sql-test-vm.
  2. בוחרים באפשרות SSH כדי להתחבר למכונה הווירטואלית.
  3. מתחברים למסד הנתונים דרך נקודת הקצה באמצעות הפקודה הבאה:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. אחרי שנוצר החיבור, יוצרים מסד נתונים עם השם psc-sql-db.
CREATE DATABASE remotesqldb;
  1. בסיום, מקלידים exit כדי לצאת מהחיבור.

8. משימה 6: אימות של רשומה במסד נתונים

משלימים את האימות הזה בפרויקט מסד הנתונים

  1. בחלק העליון של המסוף, בצד שמאל לצד סמל Google Cloud, לוחצים על התפריט הנפתח ואז בוחרים בכרטיסייה all.

סרגל הפרויקט סרגל הפרויקט 2

  1. מהרשימה של הפרויקטים, בוחרים את מזהה הפרויקט של מסד הנתונים כדי להמשיך.
  2. עוברים אל SQL, בוחרים במסד הנתונים psc-sql-db, מרחיבים את האפשרויות של SQL ובוחרים באפשרות Databases (מסדי נתונים). מסד הנתונים שיצרתם אמור להופיע בשם remotesqldb מהמכונה הווירטואלית של פרויקט הצרכן**.**

cloud sql db

9. הסרת המשאבים

השלמת הפעולה בפרויקט של מסד הנתונים

  1. בחירת מזהה פרויקט מסד הנתונים
  2. עוברים אל Cloud Shell ומוודאים שמזהה פרויקט מסד הנתונים מופיע.
  3. עוברים לספרייה terraform-db cd terraform-db, מריצים את הפקודה terraform destroy ומקלידים yes. כל המשאבים שיצרתם בפרויקט מסד הנתונים באמצעות Terraform יוסרו.

השלמת הפעולה בפרויקט של הצרכן

  1. בחירת מזהה פרויקט הצרכן
  2. עוברים אל Cloud Shell ומוודאים שמזהה פרויקט הלקוח מופיע.
  3. עוברים לספרייה terraform-consumer cd terraform-consumer, מריצים את הפקודה terraform destroy ומקלידים yes. כל המשאבים שיצרתם בפרויקט db באמצעות Terraform יוסרו.

10. מזל טוב

סיימתם בהצלחה להגדיר מכונת Cloud SQL עם קובץ מצורף של PSC וליצור נקודת קצה של Private Service Connect בענן וירטואלי פרטי (VPC) אחר. הצלחת להתחבר למסד הנתונים מ-VM מרוחק דרך נקודת הקצה של PSC.

מידע נוסף

מידע נוסף על Private Service Connect ו-Cloud SQL