الاتصال بخدمة CloudSQL من خلال Private Service Connect (Terraform)

1. نظرة عامة

تتوفّر عدة خيارات للاتصال بمثيل خاص Cloud SQL من مشروع أو شبكات VPC أخرى. تتيح خدمة Private Service Connect (PSC) لمقدّمي الخدمات إمكانية عرض خدماتهم من خلال مرفقات الخدمة. يمكن للمستهلكين استخدام مرفقات الخدمة هذه لإنشاء نقاط نهاية و/أو خلفيات PSC في بيئتهم والاتصال بخدمات المنتج هذه من خلال عنوان IP خاص محدّد.

تتضمّن Cloud SQL إمكانية استخدام مرفق خدمة PSC للسماح بالاتصال الخاص. في هذا التمرين العملي، يمكنك ضبط الخيار واختباره.

في هذا الدرس العملي، ستنشئ بنية أساسية بسيطة توضّح كيفية استخدام إذن الوصول إلى نقطة نهاية PSC مع CloudSQL.

الشكل 1.

1893f48fe1298ea2.png

في هذا الدرس التطبيقي، ستحتاج إلى مشروعَين أو شبكتَي VPC منفصلتَين في المشروع نفسه.

الأهداف

في هذا التمرين المعملي، ستتعرّف على كيفية تنفيذ المهمة التالية:

  • أنشئ مثيل CloudSQL مع مرفق خدمة PSC.
  • إنشاء عنوان IP ثابت
  • إنشاء نقطة نهاية PSC في شبكة VPC الخاصة بالمستهلك للاتصال بقاعدة بيانات CloudSQL
  • تحقَّق من إمكانية الوصول إلى قاعدة بيانات SQL من جهاز افتراضي اختباري في شبكة المستهلك من خلال عنوان IP لنقطة نهاية PSC.

2. الإعداد والمتطلبات

إعداد البيئة بالسرعة التي تناسبك

  1. سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
  • رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع.
  • للعلم، هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير، إن وُجدت أي تكلفة على الإطلاق. لإيقاف الموارد وتجنُّب تحمّل تكاليف تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس العملي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:

55efc1aaa7a4d3ad.png

لن يستغرق توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

7ffe5cbb04455448.png

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا ثابتًا بسعة 5 غيغابايت، وتعمل على Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إكمال جميع المهام في هذا الدرس العملي ضمن المتصفّح. لست بحاجة إلى تثبيت أي تطبيق.

3- المهمة رقم 1 إعداد بيئة لمشروع قاعدة البيانات باستخدام (Terraform)

في مشروع قاعدة البيانات، سننشئ شبكة VPC مخصّصة تتضمّن قواعد جدار الحماية والشبكة الفرعية. افتح Cloud Console واختَر المشروع الذي ستستخدمه لقاعدة البيانات.

  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. انقر على المحرّر، وتأكَّد من السماح بأي طلبات ضرورية كي يتم تحميل الواجهة.
  2. بعد التحميل، انتقِل إلى ملف > فتح مجلد وانتقِل إلى /home/your-user-name/terraform-db وانقر على حسنًا لفتح المجلد في المحرّر. 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 البرمجية لتنفيذ إجراءات مختلفة كما هو موضّح أدناه.

تفعيل واجهات برمجة التطبيقات

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 إنشاء مثيل CloudSQL مع ربط PSC (Terraform)

لنستخدِم Terraform لإنشاء مثيل CloudSQL مع خيار PSC للسماح بالاتصال. أكمِل عملية الضبط هذه في مشروع قاعدة البيانات.

  1. انتقِل إلى طريقة عرض محرّر Cloud Shell. تأكَّد من أنّك في المجلد 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 مع ربط PSC

  1. على يمين الصفحة، وسِّع اللوحة المنبثقة لخيارات SQL واختَر المستخدمون.
  2. من المفترض أن يظهر لك مستخدم باسم testsql وكلمة المرور cloudsql24 (سيتم استخدام هذا الحساب للوصول إلى قاعدة البيانات لاحقًا)

5- المهمة رقم 3 إعداد بيئة لمشروع المستهلك (Terraform)

في مشروع المستهلك، سننشئ شبكة VPC مخصّصة تتضمّن قواعد جدار الحماية والشبكة الفرعية. افتح Cloud Console واختَر المشروع الذي ستستخدمه.

  1. في أعلى وحدة التحكّم على اليسار بجانب رمز Google Cloud، انقر على القائمة المنسدلة ثم اختَر علامة التبويب الكل.

شريط المشروعشريط المشروع 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. بعد التحميل، انتقِل إلى ملف > فتح مجلد، ثم إلى /home/your-user-name/terraform-consumer، وانقر على حسنًا لفتح المجلد في المحرّر. 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 البرمجية لتنفيذ إجراءات مختلفة كما هو موضّح أدناه.

تفعيل واجهات برمجة التطبيقات

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، وافتح الدليل terraform-consumer واختَر الملف psc.tf. أضِف رمز Terraform التالي إلى الملف. يؤدي ذلك إلى إنشاء عنوان IP داخلي ثابت ونقطة نهاية 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. ضمن علامة التبويب نقطة النهاية المرتبطة، ابحث في قسم "نقطة النهاية" واختَر psc-sql-endpoint.
  4. انقروا الآن على تعديل، ثم ضَعوا علامة في مربّع الاختيار بجانب تفعيل الوصول العام وانقروا على حفظ. 7eeb5a4162f5f79d.png
  5. المتابعة إلى الخطوة التالية للتحقّق من الاتصال

7. المهمة رقم 5 التحقّق من إمكانية الاتصال بنقطة النهاية من الجهاز الظاهري من خلال عنوان IP الخاص بخدمة Private Service Connect

أكمِل هذه الخطوات في مشروع المستهلك

  1. انتقِل إلى مثيل الجهاز الافتراضي. اختَر 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، انقر على القائمة المنسدلة ثم اختَر علامة التبويب الكل.

شريط المشروعشريط المشروع 2

  1. من المشاريع المُدرَجة، اختَر رقم تعريف مشروع قاعدة البيانات للمتابعة.
  2. انتقِل إلى SQL، واختَر قاعدة البيانات psc-sql-db، ثم وسِّع خيارات SQL واختَر قواعد البيانات. من المفترض أن ترى قاعدة البيانات التي أنشأتها للتو باسم remotesqldb من الجهاز الافتراضي لمشروع المستهلك**.**

قاعدة بيانات Cloud SQL

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 ستتم إزالة جميع الموارد التي أنشأتها في مشروع قاعدة البيانات باستخدام Terraform.

10. تهانينا

تهانينا، لقد نجحت في ضبط إعدادات مثيل Cloud SQL باستخدام عملية ربط PSC وإنشاء نقطة نهاية Private Service Connect في شبكة VPC أخرى. تمكّنت من الاتصال بنجاح من جهاز افتراضي بعيد من خلال نقطة نهاية PSC بقاعدة البيانات.

مزيد من المعلومات

يمكنك الاطّلاع على مزيد من المعلومات عن Private Service Connect وCloud SQL.