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

1. Giới thiệu

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ự, tính năng 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 tiêu 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ó khả năng mở rộng của Google.

Bạn có thể sử dụng Cloud Run dưới dạng một dịch vụ PSC theo 2 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 một dịch vụ nhà sản xuất PSC tuỳ chỉnh, trong đó Cloud Run được hiển thị thông qua một Service Attachment (Tệp đính kèm dịch vụ) thông qua một Internal Application Load Balancer (Bộ cân bằng tải ứng dụng nội bộ) có NEG không dùng 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 trường hợp 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
  • Các 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 một Internal Application Load Balancer có NEG không 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 trên Google Cloud có quyền của chủ sở hữu

2. Cấu trúc liên kết 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 2 dịch vụ Cloud Run có thể truy cập thông qua PSC – dịch vụ đầu tiên là dịch vụ tuỳ chỉnh được xuất bản bằng PSC và dịch vụ thứ hai là PSC cho Google API. Bạn sẽ tạo 2 VPC, một consumer-vpc và một producer-vpc. Trước tiên, bạn sẽ triển khai dịch vụ Hello World Cloud Run và cung cấp quyền truy cập vào dịch vụ này thông qua Bộ cân bằng tải ứng dụng nội bộ theo khu vực và NEG phi 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 producer-client 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 một Service Attachment.

Chuyển sang consumer-vpc, bạn sẽ triển khai một điểm cuối PSC trỏ đến Cloud Run Service Attachment mà chúng ta đã thiết lập trong producer-vpc. Sau đó, bạn sẽ xác minh rằng dịch vụ này có thể truy cập thông qua PSC từ một ứng dụng khách 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 của bạn. Cuối cùng, bạn sẽ triển khai một Đ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 điểm cuối PSC cho API của Google.

3. 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ì.

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

Từ Cloud Shell

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

Tạo mạng con

Từ 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 PSC Service Attachment cho mục đích Network Address Translation. Đối với các trường hợp sử dụng trong thực tế, bạn cần điều chỉnh kích thước của mạng con này cho phù hợp để hỗ trợ số lượng điểm cuối được đính kèm. Hãy xem tài liệu về việc định cỡ mạng con NAT PSC để biết thêm thông tin.

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

Từ 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 có:

  • Áp dụng cho tất cả các phiên bản máy ảo mà bạn muốn có thể 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. Dải này chứa tất cả địa chỉ IP mà IAP sử dụng để chuyển tiếp TCP.

Từ 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 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 từ nguồn đến Cloud Run.

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

Từ 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 tổ chức về việc chia sẻ hạn chế theo miền. Nếu đã bật chính sách này, bạn sẽ phải thực hiện các bước bổ sung để triển khai Cloud Run có xác thực, định cấu hình Màn hình xin phép bằ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.

Từ 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ó URL run.app được cung cấp. Chúng tôi sẽ không sử dụng URL cho dịch vụ này. Tính năng này vẫn đang ở giai đoạn xem trước tại thời điểm xuất bản lớp học lập trình này.

Trước khi tiếp tục, hãy chuyển về thư mục chính của Cloud Shell.

Từ Cloud Shell

cd ..

7. Hiển thị Hello World Cloud Run thông qua một Internal Application Load Balancer

Đặt trước một đị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 khu vực

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ử

Từ 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ử chương trình Hello World

Trong producer-vm

curl <loadbalancer-ip>

Kết quả đầu ra 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ụ

Từ 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 của 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 tiêu dùng

Mạng VPC

Từ Cloud Shell

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

Tạo mạng con

Từ 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

Từ 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 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.

Từ 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ụ Hello World Cloud Run

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 Service Attachment. Bạn sẽ sử dụng URI của tệp đính kèm dịch vụ mà bạn đã ghi lại 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

Từ 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.

Từ 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 và Kiểm tra khả năng kết nối với điểm cuối

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

Từ 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

Từ 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ừ VM của ứng dụng khách

curl <cloudrun-service-ip>

Kết quả đầu ra dự kiến

Hello World!

Từ VM của ứng dụng khách

exit

13. Tạo dịch vụ lặp lại 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ụ Cloud Run HelloWorld 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 bằng 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 2, hãy sử dụng mã PHP bên dưới trong tệp index.php. Quay lại lớp học lập trình khi bạn đã sẵn sàng triển khai trê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.

Từ 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 phải thoát ra 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 Direct VPC Egress. Chúng tôi đang chuyển hướng tất cả lưu lượng truy cập để truyền dữ liệu ra ngoài thông qua mạng con Truyền dữ liệu ra ngoài trực tiếp của VPC trở lại VPC.

Từ 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 việc triển khai, dịch vụ Cloud Run sẽ cung cấp một URL dịch vụ theo định dạng https://cloudrun-loop-<projectnum>.<region>.run.app. Hãy lưu ý URL này vì bạn sẽ kiểm thử URL này ở bước tiếp theo.

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

Từ 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 lại ở bước trước.

Từ VM của ứng dụng khách

curl <Cloud-Run-ServiceURL>

Kết quả đầu ra dự kiến

Hello World!

Kết quả này cho thấy dịch vụ CloudRun-Loop của chúng tôi đ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ụ Hello World Cloud Run. Tuy nhiên, tại thời điểm này, VM máy khách tiêu dùng của chúng tôi đang truyền dữ liệu ra Internet thông qua Cloud NAT để gọi đến URL Cloud Run công khai. 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ừ VM của ứ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 Google API để thay đổi độ phân giải này thành riêng tư nhằm giữ lưu lượng truy cập bên ngoài Internet công cộng.

Từ VM của ứ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 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 bắt nguồn từ mộ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 thể trùng lặp với bất kỳ mạng con VPC, mạng con VPC được kết nối ngang hàng hoặc tuyến đường kết hợp nào hiện có.

Từ 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

Từ 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 DNS 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ả cá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 PSC cho điểm cuối API của Google.

Từ 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 tra quá trình phân giải DNS riêng

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

Từ 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 <Cloud-Run-ServiceURL> bằng URL dịch vụ mà bạn đã ghi lại trước đó.

Từ VM của ứng dụng khách

sudo resolvectl flush-caches

curl <CloudRun-Loop-ServiceURL>

Lệnh curl vẫn hoạt động như trước đây.

Từ VM của ứng dụng khách

curl <CloudRun-Loop-ServiceURL>

Kết quả đầu ra dự kiến

Hello World!

Từ VM của ứng dụng khách

dig <CloudRun-Loop-ServiceURL>

Lệnh dig sẽ cho thấy dịch vụ Cloud Run Loop của chúng tôi hiện đang phân giải thành đ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

Từ 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ể việc chạy hai lệnh tiếp theo sẽ không thành công và gặp 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 bạn không xoá được, hãy bỏ qua 2 lệnh này và tiếp tục chuyển sang phần tiếp theo, sau đó quay lại phần này để xoá sau một thời gian.

Từ Cloud Shell

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

gcloud compute networks delete consumer-vpc -q

Từ 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
  • Các 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 một Internal Application Load Balancer có NEG không 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