Private Service Connect: Sử dụng Private Service Connect để phát hành và sử dụng dịch vụ bằng Cloud Run

Thông tin về lớp học lập trình này
schedule61 phút
subjectLần cập nhật gần đây nhất: 28 tháng 3, 2025
account_circleTác giả: Lorin Price

Private Service Connect (PSC) là một tính năng của mạng Google Cloud, cho phép người dùng truy cập riêng tư vào các dịch vụ được quản lý từ bên trong mạng VPC của họ. Tương tự, dịch vụ này cho phép nhà sản xuất dịch vụ được quản lý lưu trữ các dịch vụ này trong mạng VPC riêng của họ và cung cấp kết nối riêng tư cho người dùng.

Cloud Run là một nền tảng điện toán được quản lý, cho phép bạn chạy các vùng chứa ngay trên cơ sở hạ tầng có thể mở rộng của Google.

Bạn có thể sử dụng Cloud Run dưới dạng dịch vụ PSC theo hai cách.

  1. Thông qua PSC cho API của Google bằng cách gọi Cloud Run thông qua URL run.app do Cloud Run cung cấp
  2. Thông qua dịch vụ nhà sản xuất PSC tuỳ chỉnh, trong đó Cloud Run được hiển thị thông qua Tệp đính kèm dịch vụ qua Trình cân bằng tải ứng dụng nội bộ có NEG không có máy chủ.

Lớp học lập trình này sẽ khám phá cách thiết lập Cloud Run bằng PSC cho cả hai tình huống này

Kiến thức bạn sẽ học được

  • Triển khai các ứng dụng cơ bản trên Cloud Run
  • Chế độ kiểm soát lưu lượng truy cập vào và ra của Cloud Run
  • Triển khai Cloud Run thông qua Trình cân bằng tải ứng dụng nội bộ bằng NEG không có máy chủ
  • Thiết lập Dịch vụ nhà sản xuất PSC thông qua Tệp đính kèm dịch vụ
  • Triển khai Điểm cuối PSC

Bạn cần có

  • Dự án Google Cloud có quyền của Chủ sở hữu

2. Cấu trúc liên kết của lớp học lập trình

455a040761a8fab9.png

Trong lớp học lập trình này, bạn sẽ triển khai hai dịch vụ Cloud Run có thể truy cập được thông qua PSC – dịch vụ đầu tiên là dịch vụ được phát hành tuỳ chỉnh bằng PSC và dịch vụ thứ hai là PSC cho API của Google. Bạn sẽ tạo hai VPC, một consumer-vpc và một producer-vpc. Trước tiên, bạn sẽ triển khai dịch vụ Cloud Run Hello World và cho phép truy cập dịch vụ này thông qua Trình cân bằng tải ứng dụng nội bộ theo khu vực và NEG không có máy chủ trong producer-vpc. Bạn sẽ xác minh rằng dịch vụ đang hoạt động thông qua bộ cân bằng tải qua ứng dụng của nhà sản xuất trước khi thiết lập dịch vụ Cloud Run để có thể truy cập dưới dạng dịch vụ nhà sản xuất PSC thông qua Tệp đính kèm dịch vụ.

Chuyển sang consumer-vpc, bạn sẽ triển khai một điểm cuối PSC trỏ đến Tệp đính kèm dịch vụ Cloud Run mà chúng ta đã thiết lập trong producer-vpc. Sau đó, bạn sẽ xác minh rằng có thể truy cập dịch vụ thông qua PSC từ ứng dụng khách của người dùng trong consumer-vpc. Tiếp theo, bạn sẽ tạo một dịch vụ Cloud Run khác gọi Điểm cuối PSC. Cuối cùng, bạn sẽ triển khai Điểm cuối PSC cho các API của Google. Từ ứng dụng khách, bạn sẽ truy cập vào Cloud Run thông qua URL do Cloud Run cung cấp. URL này sẽ sử dụng PSC cho điểm cuối API của Google.

3. Cách thiết lập và các 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ị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án là duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi 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ã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng email của riêng mình để xem có thể sử dụng hay không. Bạn không thể thay đổi giá trị này sau bước này và giá trị này sẽ được giữ nguyên trong suốt thời gian của dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba 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 Cloud. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí sau khi hoàn tất 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í 300 USD.

Khởi động Cloud Shell

Mặc dù có thể điều khiển 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 đám mây.

Trong 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 cấp phép và kết nối với môi trường chỉ mất vài phút. Khi hoàn tất, bạn sẽ thấy như sau:

7ffe5cbb04455448.png

Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện tất cả công việc trong lớp học lập trình này trong một trình duyệt. Bạn không cần cài đặt gì cả.

4. Trước khi bắt đầu

Bật API

Trong Cloud Shell, hãy đảm bảo rằng dự án của bạn đã được thiết lập và định cấu hình các biến.

gcloud auth login
gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
export projectid=[YOUR-PROJECT-ID]
export projectnum=[YOUR-PROJECT-NUM]
export region=us-central1
export zone=us-central1-a
echo $projectid
echo $projectnum
echo $region
echo $zone

Bật tất cả các dịch vụ cần thiết

gcloud services enable compute.googleapis.com
gcloud services enable run.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable dns.googleapis.com
gcloud services enable cloudbuild.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com

5. Tạo mạng VPC của nhà sản xuất

Mạng VPC

Trong Cloud Shell

gcloud compute networks create producer-vpc --subnet-mode custom

Tạo mạng con

Trong Cloud Shell

gcloud compute networks subnets create producer-subnet \
    --network=producer-vpc \
    --range=10.0.0.0/28 \
    --region=$region

gcloud compute networks subnets create lb-proxy-subnet \
    --network=producer-vpc \
    --range=10.100.100.0/24 \
    --region=$region \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE

gcloud compute networks subnets create psc-nat-subnet \
    --network=producer-vpc \
    --region=$region \
    --range=10.100.101.0/24 \
    --purpose=PRIVATE_SERVICE_CONNECT

Mạng con PSC sẽ được liên kết với Tệp đính kèm dịch vụ PSC cho mục đích Dịch địa chỉ mạng. Đối với các trường hợp sử dụng chính thức, bạn cần định cỡ phù hợp cho mạng con này để hỗ trợ số lượng điểm cuối được đính kèm. Hãy xem tài liệu về cách định cỡ mạng con NAT PSC để biết thêm thông tin.

Tạo Chính sách tường lửa và Quy tắc tường lửa cho mạng của nhà sản xuất

Trong Cloud Shell

gcloud compute network-firewall-policies create producer-vpc-policy --global

gcloud compute network-firewall-policies associations create \
    --firewall-policy producer-vpc-policy \
    --network producer-vpc \
    --name network-producer-vpc \
    --global-firewall-policy

Để cho phép IAP kết nối với các phiên bản máy ảo, hãy tạo một quy tắc tường lửa:

  • Áp dụng cho tất cả các phiên bản máy ảo mà bạn muốn truy cập bằng IAP.
  • Cho phép lưu lượng truy cập vào từ dải IP 35.235.240.0/20. Phạm vi này chứa tất cả địa chỉ IP mà IAP sử dụng để chuyển tiếp TCP.

Trong Cloud Shell

gcloud compute network-firewall-policies rules create 1000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "SSH with IAP" \
    --direction INGRESS \
    --src-ip-ranges 35.235.240.0/20 \
    --layer4-configs tcp:22  \
    --global-firewall-policy

6. Tạo ứng dụng Hello World trên Cloud Run

Làm theo hướng dẫn tại đây để viết một ứng dụng mẫu bằng Python. Chạy các lệnh này trong Cloud Shell. Sau khi bạn hoàn tất bước 3 trong phần "Viết ứng dụng mẫu", hãy quay lại Lớp học lập trình này và làm theo hướng dẫn bên dưới để Triển khai lên Cloud Run từ nguồn.

Trước khi triển khai dịch vụ Cloud Run, hãy đảm bảo tài khoản dịch vụ điện toán mặc định của bạn có các quyền thích hợp bằng cách chạy lệnh sau.

Trong Cloud Shell

gcloud projects add-iam-policy-binding $projectid --member=serviceAccount:$projectnum-compute@developer.gserviceaccount.com --role=roles/run.builder

LƯU Ý: Lớp học lập trình này giả định rằng tổ chức của bạn chưa bật Chính sách của tổ chức về việc chia sẻ có giới hạn về miền. Nếu đã bật chính sách này, bạn sẽ phải thực hiện thêm các bước để triển khai Cloud Run bằng tính năng xác thực, định cấu hình Màn hình đồng ý OAuth và thiết lập IAP cho phần phụ trợ của bộ cân bằng tải. Bạn nên làm theo tất cả các bước định cấu hình này trong môi trường sản xuất.

Trong Cloud Shell

gcloud beta run deploy helloworld \
    --source . \
    --platform=managed \
    --ingress=internal \
    --allow-unauthenticated \
    --no-default-url \
    --region=$region

Việc sử dụng cờ --no-default-url sẽ triển khai dịch vụ Cloud Run mà không cần URL run.app được cung cấp. Chúng tôi sẽ không sử dụng URL này cho dịch vụ này. Tính năng này vẫn đang ở giai đoạn xem trước kể từ thời điểm phát hành lớp học lập trình này.

Trước khi tiếp tục, hãy quay lại thư mục chính của Cloud Shell.

Trong Cloud Shell

cd ..

7. Hiển thị Hello World Cloud Run thông qua Trình cân bằng tải ứng dụng nội bộ

Đặt trước địa chỉ IP nội bộ tĩnh cho quy tắc chuyển tiếp của trình cân bằng tải.

Trong Cloud Shell

gcloud compute addresses create cloudrun-ip \
 --region=$region \
 --subnet=producer-subnet

gcloud compute addresses describe cloudrun-ip --region=$region

Kết quả mẫu

address: 10.0.1.31
addressType: INTERNAL
creationTimestamp: '2025-03-17T09:04:06.620-07:00'
description: ''
id: 'xxxx'
kind: compute#address
labelFingerprint: xxxx
name: cloudrun-ip
networkTier: PREMIUM
purpose: GCE_ENDPOINT
region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/addresses/cloudrun-ip
status: RESERVED
subnetwork: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/subnetworks/producer-subnet

Ghi lại địa chỉ IP mà bạn vừa tạo.

Tạo Trình cân bằng tải ứng dụng nội bộ theo vùng

Trong Cloud Shell

gcloud compute network-endpoint-groups create cloudrun-producer-neg \
    --region=$region \
    --network-endpoint-type=serverless \
    --cloud-run-service=helloworld

gcloud compute backend-services create cloudrun-producer-bes \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --protocol=HTTP \
    --region=$region

gcloud compute backend-services add-backend cloudrun-producer-bes \
        --region=$region \
        --network-endpoint-group=cloudrun-producer-neg \
        --network-endpoint-group-region=$region

gcloud compute url-maps create producer-urlmap \
        --default-service=cloudrun-producer-bes \
        --region=$region

gcloud compute target-http-proxies create producer-http-proxy \
        --url-map=producer-urlmap \
        --region=$region

Trong Cloud Shell

gcloud compute forwarding-rules create cloudrun-fr \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=producer-vpc \
        --subnet=producer-subnet \
        --address=cloudrun-ip \
        --target-http-proxy=producer-http-proxy \
        --target-http-proxy-region=$region \
        --region=$region \
        --ports=80 \
        --allow-global-access

8. Kiểm thử Hello World Cloud Run được hiển thị thông qua Trình cân bằng tải

Tạo máy ảo kiểm thử

Trong Cloud Shell

gcloud compute instances create producer-client \
    --zone=$zone \
    --subnet=producer-subnet \
    --no-address \
    --scopes=cloud-platform

Trong Cloud Shell

gcloud compute ssh \
    --zone "$zone" "producer-client" \
    --tunnel-through-iap \
    --project $projectid

Thay thế <loadbalancer-ip> bằng địa chỉ IP mà bạn đã tạo trước đó (ví dụ: 10.0.0.2).

Kiểm thử Hello World

Trong producer-vm

curl <loadbalancer-ip>

Kết quả dự kiến

Hello World!

Thoát khỏi máy ảo.

Trong producer-vm

exit

9. Tạo tệp đính kèm dịch vụ

Trong Cloud Shell

gcloud compute service-attachments create cloudrun-attachment \
    --region=$region \
    --producer-forwarding-rule=cloudrun-fr \
    --connection-preference=ACCEPT_MANUAL \
    --consumer-accept-list=$projectid=5 \
    --nat-subnets=psc-nat-subnet

Tiếp theo, hãy truy xuất và ghi lại URI tệp đính kèm dịch vụ để định cấu hình điểm cuối PSC trong môi trường người dùng.

Trong Cloud Shell

gcloud compute service-attachments describe cloudrun-attachment --region=$region

Ví dụ về kết quả đầu ra dự kiến

connectionPreference: ACCEPT_MANUAL
consumerAcceptLists:
- connectionLimit: 5
  projectIdOrNum: $projectid
creationTimestamp: '2025-03-10T08:49:08.134-07:00'
description: ''
enableProxyProtocol: false
fingerprint: -F0Kpe3Fi8o=
id: '2679595584727463707'
kind: compute#serviceAttachment
name: cloudrun-attachment
natSubnets:
- https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/subnetworks/psc-nat-subnet
pscServiceAttachmentId:
  high: 'xxxxx'
  low: 'xxxx'
reconcileConnections: false
region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/serviceAttachments/cloudrun-attachment
targetService: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$projectid/forwardingRules/cloudrun-fr

10. Tạo mạng VPC của người dùng

Mạng VPC

Trong Cloud Shell

gcloud compute networks create consumer-vpc --subnet-mode custom

Tạo mạng con

Trong Cloud Shell

gcloud compute networks subnets create consumer-subnet \
    --network=consumer-vpc \
    --range=10.0.0.0/24 \
    --region=$region \
    --enable-private-ip-google-access

gcloud compute networks subnets create cloudrun-egress \
    --network=consumer-vpc \
    --range=10.0.1.0/24 \
    --region=$region \
    --enable-private-ip-google-access

Tạo Cloud NAT

Trong Cloud Shell

gcloud compute routers create central-cr \
    --network=consumer-vpc \
    --region=$region

gcloud compute routers nats create central-nat \
    --router=central-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

Tạo Chính sách tường lửa mạng dành cho người tiêu dùng và Quy tắc tường lửa

Chúng ta sẽ tạo một Chính sách tường lửa mạng khác cho consumer-vpc.

Trong Cloud Shell

gcloud compute network-firewall-policies create consumer-vpc-policy --global

gcloud compute network-firewall-policies associations create --firewall-policy consumer-vpc-policy --network consumer-vpc --name network-consumer-vpc --global-firewall-policy

gcloud compute network-firewall-policies rules create 1000 --action ALLOW --firewall-policy consumer-vpc-policy --description "SSH with IAP" --direction INGRESS --src-ip-ranges 35.235.240.0/20 --layer4-configs tcp:22  --global-firewall-policy

11. Tạo điểm cuối PSC cho Dịch vụ Cloud Run Hello World

Tại thời điểm này, chúng ta sẽ tạo một điểm cuối PSC và kết nối điểm cuối đó với dịch vụ Cloud Run mà bạn đã hiển thị thông qua Tệp đính kèm dịch vụ. Bạn sẽ sử dụng URI tệp đính kèm dịch vụ mà bạn đã ghi chú trước đó trong phần này. Đảm bảo rằng định dạng của URI trong lệnh gcloud khớp với URI của bạn.

Tạo điểm cuối PSC

Trong Cloud Shell

gcloud compute addresses create cloudrun-service-ip --region=$region --subnet=consumer-subnet --ip-version=IPV4


gcloud compute forwarding-rules create cloudrun-ep --region=$region --network=consumer-vpc --address=cloudrun-service-ip --target-service-attachment=projects/$projectid/regions/$region/serviceAttachments/cloudrun-attachment

Lấy địa chỉ IP của Điểm cuối PSC mà bạn vừa tạo. Bạn sẽ sử dụng địa chỉ IP này trong bước tiếp theo để kiểm thử điểm cuối.

Trong Cloud Shell

gcloud compute addresses list --filter="name=cloudrun-service-ip"

Ví dụ về kết quả đầu ra dự kiến

NAME: cloudrun-service-ip
ADDRESS/RANGE: 10.0.0.2
TYPE: INTERNAL
PURPOSE: GCE_ENDPOINT
NETWORK: 
REGION: us-central1
SUBNET: consumer-subnet
STATUS: IN_USE

12. Tạo máy ảo ứng dụng khách và kiểm thử khả năng kết nối với điểm cuối

Tạo máy ảo ứng dụng khách

Trong Cloud Shell

gcloud compute instances create consumer-client \
    --zone=$zone \
    --subnet=consumer-subnet \
    --no-address \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install dnsutils -y'

Kiểm thử khả năng kết nối

Trong Cloud Shell

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

Thay thế <cloudrun-service-ip> bằng địa chỉ IP thực tế.

Từ máy ảo ứng dụng khách

curl <cloudrun-service-ip>

Kết quả dự kiến

Hello World!

Từ máy ảo ứng dụng khách

exit

13. Tạo Dịch vụ vòng lặp Cloud Run

Tiếp theo, chúng ta sẽ tạo một dịch vụ Cloud Run để thực hiện lệnh gọi riêng tư trở lại consumer-vpc nhằm gọi dịch vụ HelloWorld trên Cloud Run trước đó mà chúng ta đã hiển thị thông qua PSC.

Làm theo hướng dẫn "Viết ứng dụng mẫu" tại đây để viết một ứng dụng vòng lặp trong PHP. Thay vì helloworld-php, hãy đặt tên thư mục là cloudrun-loop. Chạy các lệnh này trong Cloud Shell. Ở bước hai, hãy sử dụng mã PHP dưới đây trong tệp index.php. Hãy quay lại lớp học lập trình này khi bạn đã sẵn sàng triển khai lên Cloud Run. Đừng làm theo hướng dẫn trong tài liệu cho bước này.

Sử dụng mã này cho tệp index.php. Thay thế <cloudrun-service-ip> bằng địa chỉ IP của điểm cuối PSC mà bạn đã kiểm thử ở bước trước.

Trong Cloud Shell

<?php 

if(!function_exists('curl_init')) {
    die('cURL not available!');
}

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://<cloudrun-service-ip>/');
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$output = curl_exec($curl);
if ($output === FALSE) {
    echo 'An error has occurred: ' . curl_error($curl) . PHP_EOL;
}
else {
    echo $output;
}
?>

Chúng ta đang chỉ định một mạng và mạng con trong quá trình triển khai Cloud Run này vì lưu lượng truy cập Cloud Run cần quay lại VPC để truy cập vào điểm cuối PSC. Chúng tôi đang hướng dẫn Cloud Run sử dụng mạng con cloudrun-egress cho Luồng dữ liệu trực tiếp ra khỏi VPC. Chúng ta sẽ chuyển hướng tất cả lưu lượng truy cập đi ra ngoài thông qua mạng con Direct VPC Egress (Đường thoát VPC trực tiếp) trở lại VPC.

Trong Cloud Shell

gcloud run deploy cloudrun-loop \
    --source . \
    --platform=managed \
    --ingress=internal \
    --allow-unauthenticated  \
    --vpc-egress=all-traffic \
    --network=consumer-vpc \
    --subnet=cloudrun-egress \
    --region=$region

Khi hoàn tất quá trình triển khai, dịch vụ Cloud Run sẽ cung cấp một URL dịch vụ ở định dạng https://cloudrun-loop-<projectnum>.<region>.run.app. Xin lưu ý rằng URL này cũng sẽ được kiểm thử trong bước tiếp theo.

14. Kiểm thử khả năng kết nối với CloudRun-Loop thông qua URL Cloud Run

Trong Cloud Shell

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

Thay thế <Cloud-Run-ServiceURL> bằng URL dịch vụ mà bạn đã ghi chú ở bước trước.

Từ máy ảo ứng dụng khách

curl <Cloud-Run-ServiceURL>

Kết quả dự kiến

Hello World!

Kết quả này cho thấy dịch vụ CloudRun-Loop của chúng ta đang gọi lại thành công vào consumer-vpc để gọi điểm cuối PSC được kết nối với dịch vụ Cloud Run Hello World. Tuy nhiên, tại thời điểm này, máy ảo ứng dụng khách của chúng ta đang thoát ra Internet thông qua Cloud NAT để thực hiện lệnh gọi đến URL công khai của Cloud Run. Chúng ta có thể chạy lệnh dig trên URL để cho thấy rằng URL đó sẽ phân giải thành một địa chỉ IP công khai.

Từ máy ảo ứng dụng khách

dig <Cloud-Run-ServiceURL>

Kết quả mẫu

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> https://cloudrun-loop-<projectnum>.<region>.run.app
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1938
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;https://cloudrun-loop-<projectnum>.<region>.run.app.        IN A

;; ANSWER SECTION:
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.38.53
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.36.53
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.32.53
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.34.53

;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Tue Mar 11 19:05:36 UTC 2025
;; MSG SIZE  rcvd: 147

Chúng ta có thể tạo một PSC cho điểm cuối API của Google để thay đổi độ phân giải này thành riêng tư nhằm ngăn lưu lượng truy cập trên Internet công khai.

Từ máy ảo ứng dụng khách

exit

15. Tạo PSC cho Điểm cuối API của Google

Điểm cuối PSC này khác với điểm cuối PSC mà chúng ta đã tạo trước đó. PSC cho API Google trỏ đến một gói API Google (tất cả API hoặc API tương thích với VPC-SC). Địa chỉ IP không lấy nguồn từ mạng con theo khu vực, mà được tạo dưới dạng một địa chỉ IP /32 duy nhất trên toàn cầu và không được trùng lặp với bất kỳ mạng con VPC hiện có, mạng con VPC ngang hàng hoặc tuyến đường kết hợp nào.

Trong Cloud Shell

export pscgoogip=100.100.100.100

echo $pscgoogip

gcloud compute addresses create psc-goog-ep-ip \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=$pscgoogip \
    --network=consumer-vpc

Trong Cloud Shell

gcloud compute forwarding-rules create psc4googapi \
    --global \
    --network=consumer-vpc \
    --address=psc-goog-ep-ip \
    --target-google-apis-bundle=all-apis

16. Tạo Vùng riêng của Cloud DNS cho run.app

Khi bạn tạo một điểm cuối PSC cho API của Google, một vùng DNS riêng tư của Cloud Run sẽ được tạo cho tất cả API thuộc miền googleapis.com. Vì Cloud Run sử dụng run.app, nên chúng ta cần tạo một vùng riêng tư khác để liên kết run.app với điểm cuối PSC cho API của Google.

Trong Cloud Shell

gcloud dns managed-zones create "cloudrun" \
    --dns-name=run.app \
    --description="run.app psc resolution" \
    --visibility=private \
    --networks=consumer-vpc

gcloud dns record-sets transaction start \
   --zone="cloudrun"

gcloud dns record-sets transaction add $pscgoogip \
   --name=*.run.app \
   --ttl=300 \
   --type=A \
   --zone="cloudrun"

gcloud dns record-sets transaction execute \
   --zone="cloudrun"

17. Kiểm thử tính năng phân giải DNS riêng

Chúng ta sẽ đăng nhập lại vào máy ảo ứng dụng khách và chạy lại lệnh dig. Lúc này, chúng ta sẽ thấy URL Cloud Run sẽ phân giải đến điểm cuối PSC cho API của Google.

Trong Cloud Shell

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

Trước tiên, chúng ta sẽ xoá bộ nhớ đệm DNS. Thay thế <Cloud-Run-ServiceURL> bằng URL dịch vụ mà bạn đã ghi lại trước đó.

Từ máy ảo ứng dụng khách

sudo resolvectl flush-caches

curl <CloudRun-Loop-ServiceURL>

Curl vẫn hoạt động như trước.

Từ máy ảo ứng dụng khách

curl <CloudRun-Loop-ServiceURL>

Kết quả dự kiến

Hello World!

Từ máy ảo ứng dụng khách

dig <CloudRun-Loop-ServiceURL>

Kết quả của lệnh dig sẽ cho thấy rằng dịch vụ Vòng lặp Cloud Run của chúng ta hiện đang phân giải đến điểm cuối PSC cho API của Google.

Kết quả mẫu

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> https://cloudrun-loop-<projectnum>.<region>.run.app
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30179
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;https://cloudrun-loop-<projectnum>.<region>.run.app.        IN A

;; ANSWER SECTION:
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 100.100.100.100

;; Query time: 8 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Tue Mar 11 20:04:05 UTC 2025
;; MSG SIZE  rcvd: 99

THÀNH CÔNG!

18. Các bước dọn dẹp

Thoát khỏi phiên bản máy ảo

exit

Trong Cloud Shell

gcloud dns record-sets delete *.run.app --zone="cloudrun" --type=A -q

gcloud dns managed-zones delete "cloudrun" -q

gcloud compute instances delete consumer-client --zone=$zone --project=$projectid -q

gcloud compute forwarding-rules delete psc4googapi --global -q

gcloud compute addresses delete psc-goog-ep-ip --global -q

gcloud run services delete cloudrun-loop --region=$region -q 

gcloud artifacts docker images delete $region-docker.pkg.dev/$projectid/cloud-run-source-deploy/cloudrun-loop -q

gcloud compute forwarding-rules delete cloudrun-ep --region=$region -q

gcloud compute addresses delete cloudrun-service-ip --region=$region -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy consumer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=consumer-vpc-policy  --name=network-consumer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete consumer-vpc-policy --global -q

gcloud compute routers nats delete central-nat --router=central-cr --region=$region -q

gcloud compute routers delete central-cr --region=$region -q

gcloud compute networks subnets delete consumer-subnet --region $region -q

Có thể bạn sẽ không chạy được hai lệnh tiếp theo do lỗi "tài nguyên đang được sử dụng". Tài liệu về Cloud Run cho biết đôi khi Cloud Run mất từ 1 đến 2 giờ để giải phóng tài nguyên mạng con sau khi dịch vụ Cloud Run bị xoá. Nếu không xoá được, hãy bỏ qua hai lệnh này và tiếp tục sang phần tiếp theo, sau đó quay lại phần này để xoá sau một khoảng thời gian.

Trong Cloud Shell

gcloud compute networks subnets delete cloudrun-egress --region $region -q

gcloud compute networks delete consumer-vpc -q

Trong Cloud Shell

gcloud compute service-attachments delete cloudrun-attachment --region=$region -q

gcloud compute instances delete producer-client --zone=$zone --project=$projectid -q

gcloud compute forwarding-rules delete cloudrun-fr --region=$region -q

gcloud compute target-http-proxies delete producer-http-proxy --region=$region -q

gcloud compute url-maps delete producer-urlmap --region=$region -q

gcloud compute backend-services delete cloudrun-producer-bes --region=$region -q

gcloud compute network-endpoint-groups delete cloudrun-producer-neg --region=$region -q

gcloud compute addresses delete cloudrun-ip --region=$region -q

gcloud run services delete helloworld --region=$region -q 

gcloud artifacts docker images delete $region-docker.pkg.dev/$projectid/cloud-run-source-deploy/helloworld -q

gcloud artifacts repositories delete cloud-run-source-deploy --location=$region -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=producer-vpc-policy  --name=network-producer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete producer-vpc-policy --global -q

gcloud compute networks subnets delete lb-proxy-subnet --region $region -q

gcloud compute networks subnets delete psc-nat-subnet --region $region -q

gcloud compute networks subnets delete producer-subnet --region $region -q

gcloud compute networks delete producer-vpc -q

19. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình này.

Nội dung đã đề cập

  • Triển khai các ứng dụng cơ bản trên Cloud Run
  • Chế độ kiểm soát lưu lượng truy cập vào và ra của Cloud Run
  • Triển khai Cloud Run thông qua Trình cân bằng tải ứng dụng nội bộ bằng NEG không có máy chủ
  • Thiết lập Dịch vụ nhà sản xuất PSC thông qua Tệp đính kèm dịch vụ
  • Triển khai Điểm cuối PSC