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

۱. مرور کلی

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

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

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

شکل ۱.

۱۸۹۳f48fe1298ea2.png

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

اهداف

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

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

۲. تنظیمات و الزامات

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه‌ای که نیاز دارید، مجهز شده است. این ماشین مجازی یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و روی فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. تمام کارهای شما در این آزمایشگاه کد را می‌توان در یک مرورگر انجام داد. نیازی به نصب چیزی ندارید.

۳. وظیفه ۱. راه‌اندازی محیط برای پروژه پایگاه داده با (Terraform)

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

  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. پس از بارگذاری، به مسیر 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 را تایپ کنید.

۴. وظیفه ۲. ایجاد نمونه 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. Switch back to Cloud Shell terminal, make sure you are in the terraform-db directory. Now to create the resources run the terraform apply command and type yes to run. Creating the CloudSQL instance with PSC attachment may take up to 5+ minutes.

تأیید پایگاه داده

  1. پس از اتمام، به SQL در کنسول بروید، نمونه پایگاه داده psc-sql-db که به تازگی ایجاد شده است را انتخاب کنید.
  2. در سمت چپ، اسلایدر گزینه‌های SQL را باز کنید و Connections را انتخاب کنید.
  3. در زیر برگه خلاصه می‌توانید اطلاعات مربوط به اتصال را مشاهده کنید.
  4. آدرس پیوست سرویس را کپی کرده و در جایی از سیستم خود ذخیره کنید.
  5. برای تکمیل مرحله ۸ از بخش ۳ به این نیاز خواهید داشت.

SQL ابری با پیوست PSC

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

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

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

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

نوار پروژهپروژه بار ۲

  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. Select the variable.tf file and add the following. Replace the your-consumer-project-id-here text with your actual consumer project ID in quotes Replace the your-psc-attachment-id-here text with your psc attachment address in quotes. This is the ID you copied in task 2 section 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"

Add Firewall rules

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 هستید. در پروژه consumer، cd terraform-consumer اجرا کنید و دستورات زیر را اجرا کنید.

terraform init

دایرکتوری کاری را مقداردهی اولیه می‌کند. این مرحله ارائه‌دهندگان مورد نیاز برای پیکربندی داده شده را دانلود می‌کند.

terraform plan

یک طرح اجرایی ایجاد می‌کند که نشان می‌دهد Terraform چه اقداماتی را برای استقرار زیرساخت شما انجام خواهد داد.

  1. حالا برای ایجاد منابع، دستور terraform apply اجرا کنید و برای اجرا، yes را تایپ کنید.

۶. وظیفه ۴. ایجاد نقطه پایانی PSC به ضمیمه SQL DB در پروژه مصرف‌کننده و آزمایش ماشین مجازی (Terraform)

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

  1. Switch back to Cloud Shell editor, open the terraform-consumer directory and select the psc.tf file. Add the following Terraform code to the file. This creates a static internal IP, a PSC endpoint and a test VM with Maria DB installed.
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 هستید. در پروژه consumer، cd terraform-consumer اجرا کنید و دستورات زیر را اجرا کنید.

terraform plan

یک طرح اجرایی ایجاد می‌کند که نشان می‌دهد Terraform چه اقداماتی را برای استقرار زیرساخت شما انجام خواهد داد.

  1. حالا برای ایجاد منابع، دستور terraform apply اجرا کنید و برای اجرا، yes را تایپ کنید.
  2. از آنجا که ماشین مجازی و نقطه پایانی ما در مناطق مختلفی قرار دارند، باید دسترسی سراسری (Global Access) را روی نقطه پایانی PSC فعال کنیم . این کار را از طریق کنسول انجام می‌دهیم.
  3. در کنسول پروژه مصرف‌کننده، به Private Service Connect بروید. در زیر تب Connected Endpoint ، زیر بخش Endpoint را جستجو کنید و psc-sql-endpoint را انتخاب کنید.
  4. حالا گزینه‌ی ویرایش (EDIT) را انتخاب کنید و سپس روی کادر کنار گزینه‌ی فعال کردن دسترسی سراسری (Enable global access) و ذخیره (Save) کلیک کنید. 7eeb5a4162f5f79d.png
  5. Continue to next step to verify connectivity

۷. وظیفه ۵. تأیید اتصال نقطه پایانی از ماشین مجازی از طریق آدرس IP PSC

Complete this in the consumer project

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

8. Task 6. Verify database entry

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

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

نوار پروژهپروژه بار ۲

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

cloud sql db

۹. تمیز کردن

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

  1. شناسه پروژه پایگاه داده را انتخاب کنید
  2. به Cloud Shell بروید و مطمئن شوید که شناسه پروژه پایگاه داده را مشاهده می‌کنید.
  3. به دایرکتوری terraform-db cd terraform-db بروید و دستور terraform destroy زیر را اجرا کنید و عبارت yes را تایپ کنید. تمام منابعی که در پروژه پایگاه داده خود با Terraform ایجاد کرده‌اید حذف خواهند شد.

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

  1. شناسه پروژه مصرف‌کننده را انتخاب کنید
  2. به Cloud Shell بروید و مطمئن شوید که شناسه پروژه مصرف‌کننده را می‌بینید.
  3. Go to the terraform-consumer directory cd terraform-consumer and run the following command terraform destroy and type yes all the resources you created in your db project with Terraform will be removed.

۱۰. تبریک

Congratulations, you've successfully configured a Cloud SQL instance with PSC attachment and created a Private Service Connect endpoint in another VPC. You have been able to successfully connect from a remote VM via the PSC endpoint into the database.

بیشتر بدانید

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