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

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

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

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

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

איור 1.

1893f48fe1298ea2.png

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

מטרות

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

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

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

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

הפעלת Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

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. בוחרים באפשרות editor (עריכה) ומוודאים שמאשרים את כל ההנחיות הנדרשות כדי שהממשק יוכל לטעון.
  2. אחרי הטעינה, עוברים אל קובץ > פתיחת תיקייה, עוברים אל ‎/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, מוודאים שנמצאים בספרייה cd terraform-dbterraform-db ומריצים את הפקודות הבאות:

terraform init

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

terraform plan

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

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

4. משימה 2: יצירת מכונה של CloudSQL עם צירוף 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 ובוחרים באפשרות Connections (חיבורים).
  3. בכרטיסיית הסיכום מוצג מידע על החיבור.
  4. מעתיקים את הכתובת לקבצים מצורפים לשירות ושומרים אותה במקום כלשהו במערכת.
  5. תצטרכו את זה כדי להשלים את שלב 8 במשימה 3.

Cloud SQL עם קובץ מצורף של PSC

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

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

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

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

סרגל הפרויקטproject bar 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 עבור מזהה הפרויקט של הצרכן. בוחרים באפשרות editor (עריכה) ומוודאים שמאשרים את כל ההנחיות הנדרשות כדי שהממשק יוכל לטעון.
  2. אחרי הטעינה, עוברים אל קובץ > פתיחת תיקייה, עוברים אל ‎/home/your-user-name/terraform-consumer ובוחרים באפשרות Ok כדי לפתוח את התיקייה בעורך. 78f5eb9f2f82f1b0.png
  3. בוחרים את הקובץ variable.tf ומוסיפים את הטקסט הבא. מחליפים את הטקסט your-consumer-project-id-here במזהה הפרויקט של הצרכן בפועל במירכאות. מחליפים את הטקסט your-psc-attachment-id-here בכתובת הקובץ המצורף ל-PSC במירכאות. זהו המזהה שהעתקת בקטע 2-5 של משימה 2 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, מוודאים שנמצאים בספרייה cd terraform-consumerterraform-consumer בפרויקט של הצרכן ומריצים את הפקודות הבאות:

terraform init

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

terraform plan

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

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

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

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

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

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

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

cloud sql db

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

מבצעים את הפעולה הזו בפרויקט Database

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

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

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

10. מזל טוב

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

מידע נוסף

מידע נוסף זמין במאמר Private Service Connect ו-Cloud SQL