اتصال به CloudSQL از طریق Private Service Connect (Terraform)

1. بررسی اجمالی

چندین گزینه برای اتصال به یک نمونه خصوصی Cloud SQL از یک پروژه دیگر یا VPC وجود دارد. Private Service Connect (PSC) به تولیدکنندگان خدمات این امکان را می دهد که خدمات خود را از طریق پیوست های سرویس در معرض دید قرار دهند. این پیوست‌های سرویس می‌توانند توسط مصرف‌کنندگان برای ایجاد نقاط پایانی PSC و/یا باطن‌های PSC در محیط خود و اتصال به این خدمات تولیدکننده از طریق یک IP خصوصی مشخص استفاده شوند.

Cloud SQL این قابلیت را دارد که از پیوست سرویس PSC برای اجازه دادن به اتصال خصوصی استفاده کند. در این آزمایشگاه می توانید گزینه را پیکربندی و تست کنید.

در این آزمایشگاه، می‌خواهید یک معماری ساده بسازید که استفاده از دسترسی نقطه پایانی PSC با CloudSQL را نشان می‌دهد.

شکل 1.

1893f48fe1298ea2.png

برای این آزمایشگاه به دو پروژه یا VPC مجزا در همان پروژه نیاز دارید .

اهداف

در این آزمایشگاه شما یاد خواهید گرفت که چگونه وظایف زیر را انجام دهید:

  • یک نمونه CloudSQL با پیوست سرویس PSC ایجاد کنید.
  • یک آدرس IP ثابت ایجاد کنید
  • یک نقطه پایانی PSC در VPC مصرف کننده برای اتصال به پایگاه داده CloudSQL ایجاد کنید
  • دسترسی به پایگاه داده SQL را از یک VM آزمایشی در شبکه مصرف کننده از طریق IP نقطه پایانی PSC تأیید کنید.

2. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورت‌حساب فراتر از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

55efc1aaa7a4d3ad.png

تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این کد لبه را می توان در یک مرورگر انجام داد. شما نیازی به نصب چیزی ندارید.

3. وظیفه 1. تنظیم محیط برای پروژه پایگاه داده با (Terraform)

در پروژه پایگاه داده، یک VPC سفارشی با قوانین فایروال و زیرشبکه ایجاد خواهیم کرد. کنسول ابری را باز کنید و پروژه ای را که برای پایگاه داده استفاده می کنید انتخاب کنید.

  1. Cloud Shell را که در بالای کنسول خود در سمت راست قرار دارد باز کنید، مطمئن شوید که ID پروژه پایگاه داده برای پروژه پایگاه داده را در 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. پس از بارگیری به مسیر 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. موارد زیر را کپی کرده و در فایل 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 را باز کنید و Connections را انتخاب کنید
  3. در زیر برگه خلاصه می توانید اطلاعات مربوط به اتصال را مشاهده کنید.
  4. آدرس پیوست سرویس را کپی کرده و در جایی از سیستم خود ذخیره کنید.
  5. برای تکمیل کار 3 مرحله 8 به این نیاز دارید.

sql ابری با پیوست psc

  1. در سمت چپ گزینه های SQL را باز کنید و Users را انتخاب کنید.
  2. شما باید کاربری به نام testsql با رمز عبور cloudsql24 را ببینید (از این رمز عبور برای دسترسی به db بعدا استفاده خواهد شد)

5. وظیفه 3. راه اندازی محیط برای پروژه مصرف کننده (Terraform)

در پروژه مصرف کننده، یک VPC سفارشی با قوانین فایروال و زیرشبکه ایجاد خواهیم کرد. کنسول ابری را باز کنید و پروژه مورد استفاده خود را انتخاب کنید.

  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. پس از بارگیری به مسیر 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 خود را در نقل قول جایگزین کنید. این شناسه ای است که در بخش 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. موارد زیر را کپی کرده و در فایل 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 DB در پروژه مصرف کننده و تست VM (Terraform)

این پیکربندی را در پروژه مصرف کننده کامل کنید.

  1. به ویرایشگر Cloud Shell برگردید، دایرکتوری terraform-consumer را باز کنید و فایل psc.tf را انتخاب کنید. کد Terraform زیر را به فایل اضافه کنید. این یک IP داخلی ثابت، یک نقطه پایانی PSC و یک ماشین مجازی آزمایشی با نصب ماریا 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. از آنجا که VM و نقطه پایانی ما در مناطق مختلف هستند، باید دسترسی جهانی را در نقطه پایانی PSC فعال کنیم . ما این کار را از طریق کنسول انجام می دهیم
  3. در کنسول پروژه مصرف کننده، به Private Service Connect بروید. در تب Connected Endpoint ، به قسمت Endpoint نگاه کنید و psc-sql-endpoint را انتخاب کنید.
  4. حالا EDIT را انتخاب کنید و سپس بر روی تیک کنار گزینه Enable global access and Save کلیک کنید. 7eeb5a4162f5f79d.png
  5. برای تأیید اتصال به مرحله بعدی ادامه دهید

7. وظیفه 5. بررسی اتصال نقطه پایانی از VM از طریق آدرس IP PSC

این را در پروژه مصرف کننده کامل کنید

  1. به VM Instance بروید. sql-test-vm را انتخاب کنید
  2. برای اتصال به VM گزینه SSH را انتخاب کنید.
  3. از طریق نقطه پایانی با موارد زیر به DB متصل شوید:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. هنگامی که اتصال برقرار شد اجازه دهید یک پایگاه داده با psc-sql-db زیر ایجاد کنید.
CREATE DATABASE remotesqldb;
  1. پس از تکمیل، خروج را تایپ کنید تا از اتصال خارج شوید.

8. وظیفه 6. بررسی ورود پایگاه داده

این تأیید را در پروژه پایگاه داده تکمیل کنید

  1. در بالای کنسول خود در سمت راست در کنار نماد Google Cloud، روی منوی کشویی کلیک کنید و سپس برگه همه را انتخاب کنید.

نوار پروژهنوار پروژه 2

  1. از بین پروژه های فهرست شده ID پروژه پایگاه داده خود را برای ادامه انتخاب کنید.
  2. به SQL بروید، پایگاه داده psc-sql-db را انتخاب کنید، گزینه‌های SQL را گسترش دهید و پایگاه‌های داده را انتخاب کنید. باید پایگاه داده ای را که به تازگی ایجاد کرده اید به نام remotesqldb از پروژه مصرف کننده VM** ببینید . **

ابر sql db

9. پاکسازی کنید

این را در پروژه پایگاه داده تکمیل کنید

  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 دیگری ایجاد کرده‌اید. شما توانسته اید با موفقیت از یک VM راه دور از طریق نقطه پایانی PSC به پایگاه داده متصل شوید.

بیشتر بدانید

می‌توانید درباره Private Service Connect و Cloud SQL بیشتر بخوانید