Kết nối với CloudSQL thông qua Private Service Connect (Terraform)

1. Tổng quan

Có một số lựa chọn để kết nối với một phiên bản riêng tư Cloud SQL từ một dự án hoặc VPC khác. Private Service Connect (PSC) cho phép nhà sản xuất dịch vụ có khả năng hiển thị dịch vụ của họ thông qua các tệp đính kèm dịch vụ. Người dùng có thể sử dụng các tệp đính kèm dịch vụ này để tạo các điểm cuối PSC và/hoặc các phụ trợ PSC trong môi trường của họ, đồng thời kết nối với các dịch vụ của nhà sản xuất này thông qua một IP riêng tư được chỉ định.

Cloud SQL có khả năng sử dụng tệp đính kèm dịch vụ PSC để cho phép kết nối riêng tư. Trong phòng thí nghiệm này, bạn có thể định cấu hình và kiểm thử lựa chọn này.

Trong phòng thí nghiệm này, bạn sẽ xây dựng một cấu trúc đơn giản minh hoạ việc sử dụng quyền truy cập vào điểm cuối PSC với CloudSQL.

Hình 1.

1893f48fe1298ea2.png

Đối với bài thực hành này, bạn sẽ cần 2 dự án hoặc các VPC riêng biệt trong cùng một dự án.

Mục tiêu

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách thực hiện nhiệm vụ sau:

  • Tạo một phiên bản CloudSQL có tệp đính kèm dịch vụ PSC.
  • Tạo địa chỉ IP tĩnh
  • Tạo một điểm cuối PSC trong VPC của người dùng để kết nối với cơ sở dữ liệu CloudSQL
  • Xác minh quyền truy cập vào cơ sở dữ liệu SQL từ một máy ảo thử nghiệm trong mạng của người tiêu dùng thông qua IP điểm cuối PSC.

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.

Khởi động Cloud Shell

Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.

Trên Bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ ở trên cùng bên phải:

55efc1aaa7a4d3ad.png

Quá trình này chỉ mất vài phút để cung cấp và kết nối với môi trường. Khi quá trình này kết thúc, bạn sẽ thấy như sau:

7ffe5cbb04455448.png

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện mọi thao tác trong lớp học lập trình này trong trình duyệt. Bạn không cần cài đặt bất cứ thứ gì.

3. Nhiệm vụ 1. Thiết lập môi trường cho dự án cơ sở dữ liệu bằng (Terraform)

Trong dự án cơ sở dữ liệu,chúng ta sẽ tạo một VPC tuỳ chỉnh có các quy tắc về tường lửa và mạng con. Mở bảng điều khiển đám mây rồi chọn dự án mà bạn sẽ dùng cho cơ sở dữ liệu.

  1. Mở Cloud Shell ở trên cùng bên phải của bảng điều khiển, đảm bảo bạn thấy Mã dự án cơ sở dữ liệu cho dự án cơ sở dữ liệu trong Cloud Shell, xác nhận mọi lời nhắc để cho phép truy cập. 4261e776f64ea978.png
  2. Tạo một thư mục có tên là terraform-db rồi chuyển đến thư mục đó
mkdir terraform-db  && cd terraform-db
  1. Tạo tệp main.tf, variable.tfdatabase.tf.
touch main.tf variable.tf database.tf 
  1. Chuyển sang chế độ xem trình chỉnh sửa Cloud Shell. Chọn trình chỉnh sửa, đảm bảo bạn cho phép mọi lời nhắc cần thiết để giao diện có thể tải.
  2. Sau khi tải, hãy chuyển đến File > Open Folder (Tệp > Mở thư mục) rồi chuyển đến /home/your-user-name/terraform-db và chọn Ok để mở thư mục trong trình chỉnh sửa. 78f5eb9f2f82f1b0.png
  3. Chọn tệp variable.tf rồi thêm nội dung sau. Thay thế văn bản your-database-project-id-here bằng mã nhận dạng dự án cơ sở dữ liệu thực tế của bạn trong dấu ngoặc kép. Thay thế văn bản your-consumer-project-id-here bằng mã nhận dạng dự án của người tiêu dùng thực tế của bạn trong dấu ngoặc kép.
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. Tiếp theo, hãy mở tệp main.tf. Chúng ta sẽ thêm một số mã terraform để thực hiện nhiều thao tác như giải thích bên dưới.

Bật API

resource "google_project_service" "default"

Tạo VPC

resource "google_compute_network" "default"

Thêm quy tắc tường lửa

resource "google_compute_firewall" "allow_icmp"

  1. Sao chép và dán nội dung sau vào tệp 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. Chuyển về cửa sổ dòng lệnh Cloud Shell, đảm bảo bạn đang ở trong thư mục terraform-db cd terraform-db rồi chạy các lệnh sau

terraform init

Khởi chạy thư mục đang làm việc. Bước này sẽ tải các nhà cung cấp cần thiết cho cấu hình đã cho xuống.

terraform plan

Tạo một kế hoạch thực thi, cho biết những hành động mà Terraform sẽ thực hiện để triển khai cơ sở hạ tầng của bạn.

  1. Bây giờ, để tạo tài nguyên, hãy chạy lệnh terraform apply và nhập yes để chạy.

4. Nhiệm vụ 2. Tạo phiên bản CloudSQL có tệp đính kèm PSC (Terraform)

Hãy sử dụng Terraform để tạo một phiên bản CloudSQL, với lựa chọn PSC để cho phép kết nối. Hoàn tất cấu hình này trong dự án cơ sở dữ liệu.

  1. Chuyển sang chế độ xem trình chỉnh sửa Cloud Shell. Đảm bảo bạn đang ở trong thư mục terraform-db. Chọn tệp database.tf rồi thêm nội dung sau.
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. Chuyển về cửa sổ dòng lệnh Cloud Shell,hãy đảm bảo bạn đang ở trong thư mục terraform-db. Bây giờ, để tạo tài nguyên, hãy chạy lệnh terraform apply và nhập yes để chạy. Quá trình tạo thực thể CloudSQL có tệp đính kèm PSC có thể mất hơn 5 phút.

Xác minh cơ sở dữ liệu

  1. Sau khi hoàn tất, hãy chuyển đến SQL trong bảng điều khiển, chọn phiên bản cơ sở dữ liệu psc-sql-db mà bạn vừa tạo.
  2. Ở bên trái, hãy mở rộng thanh trượt các lựa chọn SQL rồi chọn Connections (Kết nối)
  3. Trong thẻ tóm tắt, bạn có thể xem thông tin về mối kết nối.
  4. Sao chép Địa chỉ đính kèm dịch vụ và lưu ở đâu đó trên hệ thống của bạn.
  5. Bạn sẽ cần thông tin này để hoàn tất bước 8 của nhiệm vụ 3.

Cloud SQL có tệp đính kèm PSC

  1. Ở bên trái, hãy mở rộng bảng chọn SQL và chọn Người dùng.
  2. Bạn sẽ thấy một người dùng có tên là testsql với mật khẩu cloudsql24 (Mật khẩu này sẽ được dùng để truy cập vào cơ sở dữ liệu sau này)

5. Nhiệm vụ 3. Thiết lập môi trường cho dự án người dùng (Terraform)

Trong dự án người tiêu dùng,chúng ta sẽ tạo một VPC tuỳ chỉnh có các quy tắc Tường lửa và mạng con. Mở Cloud Console rồi chọn dự án mà bạn sẽ sử dụng.

  1. Ở đầu bảng điều khiển, bên phải biểu tượng Google Cloud, hãy nhấp vào trình đơn thả xuống rồi chọn thẻ tất cả.

thanh dự ánthanh dự án 2

  1. Trong danh sách dự án, hãy chọn mã dự án dành cho người tiêu dùng để tiếp tục.
  2. Mở Cloud Shell ở phía trên cùng bên phải của bảng điều khiển, đảm bảo bạn thấy mã dự án người dùng trong Cloud Shell, xác nhận mọi lời nhắc để cho phép truy cập.
  3. Tạo một thư mục có tên là terraform-consumer rồi di chuyển đến thư mục đó
mkdir terraform-consumer  && cd terraform-consumer
  1. Tạo tệp main.tf, variable.tfpsc.tf.
touch main.tf variable.tf psc.tf 
  1. Chuyển sang chế độ xem trình chỉnh sửa Cloud Shell cho mã dự án người dùng thông thường. Chọn trình chỉnh sửa, đảm bảo bạn cho phép mọi lời nhắc cần thiết để giao diện có thể tải.
  2. Sau khi tải, hãy chuyển đến File > Open Folder (Tệp > Mở thư mục) rồi chuyển đến /home/your-user-name/terraform-consumer và chọn Ok (OK) để mở thư mục trong trình chỉnh sửa. 78f5eb9f2f82f1b0.png
  3. Chọn tệp variable.tf rồi thêm nội dung sau. Thay thế văn bản your-consumer-project-id-here bằng mã dự án người dùng thực tế của bạn trong dấu ngoặc kép Thay thế văn bản your-psc-attachment-id-here bằng địa chỉ đính kèm psc của bạn trong dấu ngoặc kép. Đây là mã nhận dạng mà bạn đã sao chép trong phần 2-5 của nhiệm vụ 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. Tiếp theo, hãy mở tệp main.tf. Chúng ta sẽ thêm một số mã terraform để thực hiện nhiều thao tác như giải thích bên dưới.

Bật API

resource "google_project_service"

Tạo VPC

resource "google_compute_network"

Tạo cổng NAT

resource "google_compute_router"
resource "google_compute_router_nat"

Thêm quy tắc tường lửa

resource "google_compute_firewall"

  1. Sao chép và dán nội dung sau vào tệp 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. Chuyển về thiết bị đầu cuối Cloud Shell, đảm bảo bạn đang ở trong thư mục terraform-consumer cd terraform-consumer trong dự án người tiêu dùng và chạy các lệnh sau

terraform init

Khởi chạy thư mục đang làm việc. Bước này sẽ tải các nhà cung cấp cần thiết cho cấu hình đã cho xuống.

terraform plan

Tạo một kế hoạch thực thi, cho biết những hành động mà Terraform sẽ thực hiện để triển khai cơ sở hạ tầng của bạn.

  1. Bây giờ, để tạo tài nguyên, hãy chạy lệnh terraform apply và nhập yes để chạy.

6. Nhiệm vụ 4. Tạo tệp đính kèm điểm cuối PSC vào cơ sở dữ liệu SQL trong dự án người dùng và máy ảo thử nghiệm (Terraform)

Hoàn tất cấu hình này trong dự án người dùng.

  1. Chuyển về trình chỉnh sửa Cloud Shell, mở thư mục terraform-consumer rồi chọn tệp psc.tf. Thêm mã Terraform sau vào tệp. Thao tác này sẽ tạo một IP nội bộ tĩnh, một điểm cuối PSC và một VM kiểm thử đã cài đặt 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. Chuyển về thiết bị đầu cuối Cloud Shell, đảm bảo bạn đang ở trong thư mục terraform-consumer cd terraform-consumer trong dự án người tiêu dùng và chạy các lệnh sau

terraform plan

Tạo một kế hoạch thực thi, cho biết những hành động mà Terraform sẽ thực hiện để triển khai cơ sở hạ tầng của bạn.

  1. Bây giờ, để tạo tài nguyên, hãy chạy lệnh terraform apply và nhập yes để chạy
  2. Vì máy ảo và điểm cuối của chúng tôi nằm ở các khu vực khác nhau, nên chúng tôi cần bật Quyền truy cập trên toàn cầu trên điểm cuối PSC. Chúng tôi thực hiện việc này thông qua bảng điều khiển
  3. Trong bảng điều khiển dự án người dùng, hãy chuyển đến Private Service Connect. Trong thẻ Connected Endpoint (Điểm cuối được kết nối), hãy xem trong phần Endpoint (Điểm cuối) rồi chọn psc-sql-endpoint
  4. Bây giờ, hãy chọn CHỈNH SỬA, rồi nhấp vào hộp đánh dấu bên cạnh mục Bật quyền truy cập toàn cầu và chọn Lưu. 7eeb5a4162f5f79d.png
  5. Tiếp tục chuyển sang bước tiếp theo để xác minh khả năng kết nối

7. Nhiệm vụ 5. Xác minh khả năng kết nối điểm cuối từ máy ảo thông qua địa chỉ IP PSC

Hoàn tất việc này trong dự án dành cho người tiêu dùng

  1. Chuyển đến Phiên bản máy ảo. Chọn sql-test-vm
  2. Chọn tuỳ chọn SSH để kết nối với VM.
  3. Kết nối với DB thông qua điểm cuối bằng cách làm như sau:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. Khi kết nối được thiết lập, hãy tạo một cơ sở dữ liệu bằng psc-sql-db sau đây.
CREATE DATABASE remotesqldb;
  1. Sau khi hoàn tất, hãy nhập exit để thoát khỏi kết nối.

8. Nhiệm vụ 6. Xác minh mục nhập cơ sở dữ liệu

Hoàn tất quy trình xác minh này trong dự án cơ sở dữ liệu

  1. Ở đầu bảng điều khiển, bên phải biểu tượng Google Cloud, hãy nhấp vào trình đơn thả xuống rồi chọn thẻ tất cả.

thanh dự ánthanh dự án 2

  1. Trong danh sách dự án, hãy chọn mã dự án cơ sở dữ liệu để tiếp tục.
  2. Chuyển đến SQL, chọn cơ sở dữ liệu psc-sql-db, mở rộng các lựa chọn SQL rồi chọn Cơ sở dữ liệu. Bạn sẽ thấy cơ sở dữ liệu mà bạn vừa tạo có tên là remotesqldb trong VM của dự án người dùng**.**

cloud sql db

9. Dọn dẹp

Hoàn tất việc này trong dự án Cơ sở dữ liệu

  1. Chọn mã dự án cơ sở dữ liệu
  2. Chuyển đến Cloud Shell, hãy đảm bảo bạn thấy mã dự án cơ sở dữ liệu
  3. Chuyển đến thư mục terraform-db cd terraform-db rồi chạy lệnh sau terraform destroy và nhập yes tất cả tài nguyên mà bạn đã tạo trong dự án db bằng Terraform sẽ bị xoá.

Hoàn tất việc này trong dự án Người tiêu dùng

  1. Chọn mã dự án của người tiêu dùng
  2. Chuyển đến Cloud Shell để đảm bảo bạn thấy mã dự án của người dùng
  3. Chuyển đến thư mục terraform-consumer cd terraform-consumer rồi chạy lệnh sau terraform destroy và nhập yes tất cả tài nguyên bạn đã tạo trong dự án db bằng Terraform sẽ bị xoá.

10. Xin chúc mừng

Xin chúc mừng, bạn đã định cấu hình thành công một phiên bản Cloud SQL có tệp đính kèm PSC và tạo một điểm cuối Kết nối dịch vụ riêng tư trong một VPC khác. Bạn đã kết nối thành công từ một máy ảo từ xa thông qua điểm cuối PSC vào cơ sở dữ liệu.

Tìm hiểu thêm

Bạn có thể đọc thêm về Kết nối dịch vụ riêng tư và Cloud SQL