Kết nối với Cloud SQL: Compute Engine, IP riêng tư và Cloud SQL Proxy

1. Giới thiệu

Lần cập nhật gần đây nhất: ngày 6 tháng 5 năm 2021

Cân nhắc đến mối liên kết

Có nhiều loại ứng dụng và khung. Trong lớp học lập trình này, chúng ta sẽ tìm hiểu về cách kết nối với Cloud SQL từ một ứng dụng đang chạy trên máy ảo được quản lý trong Google Compute Engine thông qua địa chỉ IP riêng tư nội bộ bằng Cloud SQL Proxy. Đây là một cách cực kỳ an toàn để chạy một ứng dụng trạng thái trong Đám mây. Bạn đang giảm thiểu nguy cơ kết nối Internet bằng cách hạn chế chỉ sử dụng IP riêng tư và sử dụng Proxy SQL để xử lý kết nối SSL cho bạn.

Một trường hợp sử dụng phổ biến cho việc này là, chẳng hạn như một ứng dụng tại chỗ đã được chuyển sang chạy trên Đám mây thay vì chạy cục bộ.

Sản phẩm bạn sẽ tạo ra

Lớp học lập trình này có thiết kế rất tối giản. Mục đích của việc này là hướng dẫn bạn từng chi tiết nhỏ của mối kết nối mà không phải suy nghĩ quá nhiều về ứng dụng. Trong một thế giới hoàn hảo, việc kết nối với Cloud SQL cũng giống như việc kết nối với mọi thực thể khác của cơ sở dữ liệu SQL. Nhờ vậy, bạn sẽ có thể lấy những gì đã tạo trong lớp học lập trình này và áp dụng cho mọi ứng dụng chính thức.

Nội dung hướng dẫn sẽ bao gồm thông tin hướng dẫn từng bước cách thực hiện trong bảng điều khiển dành cho GCP cũng như các lệnh gcloud tương đương để sử dụng trên CLI hoặc quy trình tự động hoá.

Các bước riêng lẻ bao gồm:

  • Tạo một Tài khoản dịch vụ tối thiểu để bật kết nối với phiên bản Cloud SQL
  • Tạo máy ảo trên Google Compute Engine (GCE)
  • Tạo một phiên bản Cloud SQL (hướng dẫn này sử dụng Postgres, nhưng hoạt động tương tự như MySQL hoặc SQL Server)
  • Tải xuống và chạy Cloud SQL Proxy trên phiên bản GCE

Bạn cần có

  • Tài khoản GCP mà bạn có quyền bật các API và tạo dịch vụ trên đó

2. Tạo một tài khoản dịch vụ

Tài khoản dịch vụ được dùng để cấp quyền sử dụng các dịch vụ khác nhau trong dự án GCP của bạn. Đối với lớp học lập trình này, chúng ta cần một yêu cầu để cấp quyền Proxy Cloud SQL cho việc kết nối với thực thể Cloud SQL.

Trên Play Console

Truy cập vào trang tài khoản dịch vụ IAM rồi nhấp vào nút f8393a08b37a422c.png ở đầu trang.

Đặt tên và mã nhận dạng duy nhất cho tài khoản dịch vụ của bạn, rồi nhấp vào TẠO.

Trên trang tiếp theo, hãy nhấp vào trình đơn thả xuống để chọn vai trò. Bộ lọc cho "Cloud SQL" rồi chọn vai trò Ứng dụng Cloud SQL. Nhấp vào TIẾP TỤC.

Nhấp vào XONG.

Sử dụng gcloud

Tạo tài khoản dịch vụ:

gcloud iam service-accounts create <SERVICE_ACCOUNT_NAME> --display-name "<SERVICE_ACCOUNT_NAME> service account"

Thao tác này sẽ tạo tài khoản dịch vụ, nhưng hiện không có vai trò/quyền nào được chỉ định cho tài khoản này. Để chỉ định vai trò thích hợp, hãy chạy:

gcloud projects add-iam-policy-binding <GCP PROJECT ID> --member serviceAccount:<SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com --role roles/cloudsql.client

Ví dụ: Nếu tài khoản dịch vụ của bạn có tên là sa-test khi tạo và dự án của bạn là my-project-test, thì lệnh sẽ là:

gcloud projects add-iam-policy-binding my-project-test --member serviceAccount:sa-test@my-project-test.iam.gserviceaccount.com --role roles/cloudsql.client
gcloud iam service-accounts keys create service-account.json --iam-account <SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com

3. Tạo máy ảo Compute Engine

Google Compute Engine là dịch vụ được quản lý mà máy ảo sẽ chạy. Dịch vụ này sẽ lưu giữ ứng dụng mà chúng ta muốn kết nối. Trong lớp học lập trình này, chúng ta không tạo ứng dụng, nhưng chúng ta sẽ xác nhận khả năng kết nối bằng cách chạy psql.

Trên Play Console

Truy cập vào trang Google Compute Engine rồi nhấp vào nút 77c46cd1f51bed5c.pngS.

Bạn có rất nhiều lựa chọn ở đây, việc duy nhất bạn cần làm là:

  1. Đặt tên cho thực thể
  2. Thay đổi Machine type thành f1-micro
  3. Trong phần Quyền truy cập vào danh tính và API, hãy thay đổi trình đơn thả xuống cho Service account từ Default compute service account thành trình đơn bạn đã tạo ở bước trước.
  4. Nhấp vào Tạo hoàn toàn ở cuối trang

Sử dụng gcloud

Tài khoản dịch vụ là tên đầy đủ của tài khoản dịch vụ mà bạn đã tạo trước đó, vì vậy, tài khoản này sẽ có định dạng: <NAME>@<PROJECT>.iam.gserviceaccount.com.

gcloud compute instances create <INSTANCE NAME> --machine-type=f1-micro --zone=us-central1-b --service-account=<SERVICE ACCOUNT FULL NAME>
gcloud compute zones list

4. Tạo thực thể Cloud SQL

Cloud SQL là cơ sở dữ liệu quan hệ được quản lý của chúng tôi. Công cụ này hỗ trợ MySQL, PostgreSQL và SQL Server. Đối với lớp học lập trình này, chúng ta sẽ tạo một cơ sở dữ liệu Postgres, nhưng các hướng dẫn thì tương tự như cho cả 3 cơ sở dữ liệu.

Trên Play Console

Truy cập vào trang Cloud SQL rồi nhấp vào nút 241836b315e11bf5.pngS.

Như tôi đã đề cập, hầu hết lớp học lập trình này đều dùng chung cho mọi phiên bản SQL, nhưng đối với lớp học lập trình này, hãy chọn PostgreSQL.

  1. Cung cấp mã nhận dạng cho thực thể của bạn
  2. Nhập mật khẩu cho người dùng mặc định (tên người dùng sẽ là mặc định cho DB đã chọn, ví dụ: root cho MySQL hoặc postgres cho PostgreSQL)
  3. Nếu đã thay đổi khu vực của phiên bản điện toán, bạn cũng nên thay đổi khu vực tại đây cho phù hợp.
  4. Di chuyển xuống rồi nhấp vào show configuration options
  5. Mở rộng phần Connectivity
  6. Bỏ đánh dấu lựa chọn Public IP rồi đánh dấu vào hộp Private IP
  7. Hãy đảm bảo rằng bạn đã chọn default trong trình đơn thả xuống xuất hiện khi IP riêng được đánh dấu
  8. Di chuyển xuống rồi nhấp vào Tạo

Thường thì quá trình này mất vài phút để bắt đầu.

Sử dụng gcloud

Do chúng tôi không có lời nhắc phù hợp nào để bật API từ đây, nên chúng tôi cần phải thực hiện việc này theo cách thủ công

gcloud services enable servicenetworking.googleapis.com

Tiếp theo, chúng ta cần bật kết nối dịch vụ riêng tư trên mạng VPC mặc định. Bước đầu tiên để thực hiện việc đó là phân bổ một dải địa chỉ IP được đặt tên để dùng cho thực thể của chúng ta.

gcloud compute addresses create sql-codelab-allocation --global --purpose=VPC_PEERING --prefix-length=24 --network=default

Tiếp theo là chỉ định dải IP đó cho các dịch vụ nội bộ của chúng tôi (việc này mất khoảng một phút).

gcloud services vpc-peerings update --service=servicenetworking.googleapis.com  --network=default     --project=<PROJECT ID> --ranges=sql-codelab-allocation --force

Và cuối cùng, việc tạo phiên bản này hiện chỉ có trong phiên bản thử nghiệm. Sự kết hợp giữa --no-assign-ip--network=default cho phép kết nối IP riêng tư. Hiện tại, không có cách nào để bật cả IP riêng tư và IP công cộng cùng một lúc. Vì vậy, nếu cần có quyền truy cập công khai, bạn cần chỉnh sửa phiên bản sau khi tạo. Quá trình này cần vài phút để hoàn tất.

gcloud beta sql instances create test-sql-codelab-00 --no-assign-ip --database-version=POSTGRES_11 --tier=db-f1-micro --region=us-central1 --network=default --root-password=<PASSWORD>

5. Thiết lập và chạy Cloud SQL Proxy

Sau khi kết nối với máy ảo, chúng ta sẽ cần một chuỗi kết nối thực thể. Trước tiên, chúng ta sẽ lấy dữ liệu đó, sau đó sẽ kết nối với chính máy ảo này thông qua SSH. Hướng dẫn cho các phần này sẽ có trong phần tương ứng giữa Console và gcloud, phần còn lại sẽ là các lệnh chạy từ shell trên máy ảo trong phần riêng.

Trên Play Console

Chuyển đến đây rồi nhấp vào tên của phiên bản Cloud SQL.

Di chuyển xuống một chút rồi sao chép Connection name vào nơi nào đó để sử dụng sau này.

Truy cập vào trang danh sách phiên bản Google Compute Engine rồi tìm hàng có máy ảo của bạn.

Trong cột Connect, hãy nhấp vào nút SSH để mở ra một cửa sổ riêng giúp kết nối an toàn với máy ảo.

Chuyển qua phần Using gcloud để xem các hướng dẫn còn lại vì cả hai đều giống nhau.

Sử dụng gcloud

Thay thế <INSTANCE NAME> bằng tên của thực thể Cloud SQL:

gcloud sql instances describe <INSTANCE NAME> | grep connectionName

Lưu tên kết nối thực thể để sử dụng sau này.

Bạn cần phải thay thế <ZONE> bằng vùng được sử dụng ngược lại khi bạn tạo thực thể. Nếu bạn không phải là người thay đổi thì thuộc tính này đã được đặt thành us-central1-b. Đồng thời thay thế <INSTANCE_NAME> bằng bất kỳ giá trị nào bạn đã chỉ định trước đó.

gcloud compute ssh --zone <ZONE> <INSTANCE_NAME>

Sau khi kết nối với máy ảo

Trước tiên, chúng ta cần tải proxy xuống. Tuỳ thuộc vào hệ điều hành bạn dùng. Nếu bạn không thay đổi hệ điều hành trong quá trình tạo máy ảo, thì đó sẽ là Linux và bạn có thể sử dụng:

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy

Nếu đã chuyển đổi hệ điều hành, bạn có thể truy cập vào đây để tìm lệnh phù hợp để lấy proxy cho hệ điều hành của bạn.

Để chạy proxy, hãy lấy tên kết nối thực thể mà bạn đã sao chép từ thông tin chi tiết về phiên bản Cloud SQL để thay thế <INSTANCE_CONNECTION_NAME>. Ngoài ra, xin lưu ý rằng số cổng tcp có thể thay đổi nếu bạn không sử dụng db Postgres hoặc nếu bạn đã thay đổi cổng mặc định mà db đang nghe.

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

6. Kiểm tra kết nối và tổng kết

Như đã đề cập trước đó, nếu bạn có một ứng dụng muốn đưa lên thực thể GCE để kiểm thử, thì tất nhiên cũng không sao. Đối với lớp học lập trình này, chúng ta sẽ cài đặt psql và sử dụng ứng dụng đó để xác minh rằng chúng ta có thể kết nối với cơ sở dữ liệu của mình.

Trong phiên SSH trên máy ảo:

sudo apt-get install postgresql-client
psql "host=127.0.0.1 port=5432 sslmode=disable user=postgres"

Sau đó, hãy chỉ định mật khẩu của người dùng mặc định mà bạn thiết lập khi tạo phiên bản Cloud SQL.

Xin chúc mừng! Nếu mọi việc đều diễn ra suôn sẻ, bạn sẽ thấy lời nhắc của Postgres và có thể chạy các lệnh dựa trên cơ sở dữ liệu của mình.

Tiếp theo là gì?

Hãy xem một số lớp học lập trình này...

Tài liệu tham khảo