Private Service Connect: استفاده از Private Service Connect برای انتشار و مصرف خدمات با Cloud Run

۱. مقدمه

اتصال سرویس خصوصی (PSC) قابلیتی از شبکه گوگل کلود است که به مصرف‌کنندگان اجازه می‌دهد تا به صورت خصوصی از داخل شبکه VPC خود به سرویس‌های مدیریت‌شده دسترسی داشته باشند. به طور مشابه، به تولیدکنندگان خدمات مدیریت‌شده نیز اجازه می‌دهد تا این سرویس‌ها را در شبکه‌های VPC جداگانه خود میزبانی کنند و یک اتصال خصوصی به مصرف‌کنندگان خود ارائه دهند.

Cloud Run یک پلتفرم محاسباتی مدیریت‌شده است که به شما امکان می‌دهد کانتینرها را مستقیماً روی زیرساخت مقیاس‌پذیر گوگل اجرا کنید.

Cloud Run می‌تواند به عنوان یک سرویس PSC به دو روش مختلف مورد استفاده قرار گیرد.

  1. از طریق PSC برای APIهای گوگل با فراخوانی Cloud Run از طریق URL run.app ارائه شده توسط Cloud Run
  2. از طریق یک سرویس تولیدکننده PSC سفارشی که در آن Cloud Run از طریق یک ضمیمه سرویس از طریق یک متعادل‌کننده بار برنامه داخلی با یک NEG بدون سرور در معرض دید قرار می‌گیرد.

این آزمایشگاه کد، نحوه راه‌اندازی Cloud Run با PSC را برای هر دوی این سناریوها بررسی خواهد کرد.

آنچه یاد خواهید گرفت

  • استقرار برنامه‌های پایه در Cloud Run
  • کنترل‌های ورود و خروج Cloud Run
  • استقرار Cloud Run از طریق یک متعادل‌کننده بار برنامه داخلی با یک NEG بدون سرور
  • راه‌اندازی سرویس تولیدکننده PSC از طریق پیوست سرویس
  • استقرار نقاط پایانی PSC

آنچه نیاز دارید

  • پروژه گوگل کلود با مجوزهای مالک

۲. توپولوژی Codelab

455a040761a8fab9.png

در این آزمایشگاه کد، شما دو سرویس Cloud Run را که از طریق PSC قابل دسترسی خواهند بود، مستقر خواهید کرد - اول به عنوان یک سرویس منتشر شده سفارشی با PSC و دوم به عنوان PSC برای API های گوگل. شما دو VPC ایجاد خواهید کرد، یک consumer-vpc و یک producer-vpc. ابتدا سرویس Hello World Cloud Run را مستقر کرده و آن را از طریق یک Regional Internal Application Load Balancer و Serverless NEG در producer-vpc قابل دسترسی خواهید کرد. قبل از تنظیم سرویس Cloud Run برای دسترسی به عنوان یک سرویس تولیدکننده PSC از طریق Service Attachment، تأیید خواهید کرد که سرویس از طریق متعادل کننده بار از طریق producer-client کار می‌کند.

در ادامه به سراغ consumer-vpc می‌رویم، یک نقطه پایانی PSC را مستقر می‌کنید که به پیوست سرویس Cloud Run که در producer-vpc راه‌اندازی کرده‌ایم اشاره می‌کند. سپس تأیید می‌کنید که سرویس از طریق PSC از یک consumer-client در consumer-vpc قابل دسترسی است. در مرحله بعد، یک سرویس Cloud Run دیگر ایجاد می‌کنید که PSC Endpoint شما را فراخوانی می‌کند. در نهایت، یک PSC Endpoint برای APIهای گوگل مستقر می‌کنید. از consumer-client، از طریق URL ارائه شده توسط Cloud Run به Cloud Run دسترسی خواهید داشت که از PSC برای نقطه پایانی APIهای گوگل استفاده خواهد کرد.

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

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

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

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

۴. قبل از شروع

فعال کردن APIها

در داخل Cloud Shell، مطمئن شوید که پروژه شما راه‌اندازی شده و متغیرها را پیکربندی کرده‌اید.

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

فعال کردن تمام سرویس‌های لازم

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

۵. شبکه VPC تولیدکننده ایجاد کنید

شبکه VPC

از پوسته ابری

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

ایجاد زیرشبکه‌ها

از پوسته ابری

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

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

ایجاد سیاست فایروال شبکه تولیدکننده و قوانین فایروال

از پوسته ابری

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

برای اینکه به IAP اجازه دهید به ماشین‌های مجازی شما متصل شود، یک قانون فایروال ایجاد کنید که:

  • برای تمام نمونه‌های ماشین مجازی که می‌خواهید با استفاده از IAP به آنها دسترسی داشته باشید، اعمال می‌شود.
  • اجازه ورود ترافیک از محدوده IP 35.235.240.0/20 را می‌دهد. این محدوده شامل تمام آدرس‌های IP است که IAP برای ارسال TCP استفاده می‌کند.

از پوسته ابری

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

۶. اجرای ابری Hello World را ایجاد کنید

برای نوشتن یک برنامه نمونه در پایتون، دستورالعمل‌های اینجا را دنبال کنید. این دستورات را در Cloud Shell اجرا کنید. پس از اتمام مرحله 3 در «نوشتن برنامه نمونه»، به این Codelab برگردید و دستورالعمل‌های زیر را برای Deploy to Cloud Run from Source دنبال کنید.

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

از پوسته ابری

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

نکته: این کدلب فرض می‌کند که سازمان شما سیاست سازمان‌دهی اشتراک‌گذاری محدود دامنه (Domain Restricted Sharing Organization Policy) را فعال نکرده است. اگر این سیاست را فعال کرده‌اید، باید مراحل اضافی برای استقرار Cloud Run با احراز هویت، پیکربندی صفحه رضایت OAuth و تنظیم IAP برای backend متعادل‌کننده بار خود انجام دهید. توصیه می‌شود که تمام این مراحل پیکربندی در یک محیط عملیاتی دنبال شوند.

از پوسته ابری

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

استفاده از پرچم --no-default-url سرویس Cloud Run شما را بدون URL ارائه شده run.app مستقر می‌کند. ما از URL برای این سرویس استفاده نخواهیم کرد. در زمان انتشار این codelab، این ویژگی هنوز در مرحله پیش‌نمایش است.

قبل از ادامه، به دایرکتوری اصلی Cloud Shell خود برگردید.

از پوسته ابری

cd ..

۷. اجرای ابری Hello World را از طریق یک متعادل‌کننده بار برنامه داخلی نمایش دهید

یک آدرس IP داخلی ثابت برای قانون ارسال متعادل‌کننده بار خود رزرو کنید.

در پوسته ابری

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

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

خروجی نمونه

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

آدرس IP که ایجاد کرده‌اید را یادداشت کنید.

ایجاد متعادل‌کننده بار برنامه داخلی منطقه‌ای

در پوسته ابری

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

در پوسته ابری

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

۸. اجرای آزمایشی Hello World Cloud از طریق متعادل‌کننده بار (Load Balancer) در معرض دید قرار گرفت.

ایجاد ماشین مجازی آزمایشی

از پوسته ابری

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

در پوسته ابری

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

<loadbalancer-ip> را با آدرس IP که قبلاً ایجاد کرده‌اید جایگزین کنید (مثال 10.0.0.2).

تست سلام دنیا

در تولیدکننده-vm

curl <loadbalancer-ip>

خروجی مورد انتظار

Hello World!

از ماشین مجازی خارج شوید.

در تولیدکننده-vm

exit

۹. ایجاد پیوست خدمات

از پوسته ابری

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

در مرحله بعد، URI پیوست سرویس را بازیابی و یادداشت کنید تا نقطه پایانی PSC را در محیط مصرف‌کننده پیکربندی کنید.

در پوسته ابری

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

مثال خروجی مورد انتظار

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

۱۰. ایجاد شبکه VPC مصرف‌کننده

شبکه VPC

از پوسته ابری

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

ایجاد زیرشبکه

از پوسته ابری

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

ایجاد NAT ابری

از پوسته ابری

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

ایجاد سیاست و قوانین فایروال شبکه مصرف‌کننده

ما یک سیاست فایروال شبکه دیگر برای consumer-vpc ایجاد خواهیم کرد.

از پوسته ابری

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

۱۱. ایجاد نقطه پایانی PSC برای سرویس اجرای ابری Hello World

در این مرحله، یک نقطه پایانی PSC ایجاد می‌کنیم و آن را به سرویس Cloud Run که از طریق پیوست سرویس در معرض آن قرار داده‌اید، متصل می‌کنیم. شما از URI پیوست سرویس که قبلاً در این بخش یادداشت کرده‌اید، استفاده خواهید کرد. مطمئن شوید که قالب URI در دستور gcloud با URI شما مطابقت دارد.

ایجاد نقطه پایانی PSC

از پوسته ابری

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

آدرس IP مربوط به PSC Endpoint که ایجاد کرده‌اید را دریافت کنید. در مرحله بعدی از این آدرس IP برای آزمایش Endpoint استفاده خواهید کرد.

از پوسته ابری

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

مثال خروجی مورد انتظار

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

۱۲. ایجاد ماشین مجازی مشتری-مشتری و آزمایش اتصال به نقطه پایانی

ایجاد ماشین مجازی مشتری-مشتری

از پوسته ابری

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'

اتصال را آزمایش کنید

از پوسته ابری

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

<cloudrun-service-ip> را با آدرس IP واقعی جایگزین کنید.

از ماشین مجازی مشتری-مصرف‌کننده

curl <cloudrun-service-ip>

خروجی مورد انتظار

Hello World!

از ماشین مجازی مشتری-مصرف‌کننده

exit

۱۳. ایجاد سرویس حلقه اجرای ابری

در مرحله بعد، یک سرویس Cloud Run ایجاد خواهیم کرد که یک فراخوانی خصوصی به consumer-vpc انجام می‌دهد تا سرویس Cloud Run HelloWorld قبلی را که از طریق PSC در معرض نمایش قرار داده بودیم، فراخوانی کند.

برای نوشتن یک برنامه حلقه‌ای در PHP، دستورالعمل‌های «نوشتن برنامه نمونه» را در اینجا دنبال کنید. من به جای helloworld-php، نام پوشه خود را cloudrun-loop می‌گذارم. این دستورات را در Cloud Shell اجرا کنید. در مرحله دوم، از کد PHP زیر در فایل index.php خود استفاده کنید. وقتی آماده استقرار در Cloud Run شدید، به codelab برگردید. دستورالعمل‌های موجود در مستندات این مرحله را دنبال نکنید.

از این کد برای فایل index.php خود استفاده کنید. <cloudrun-service-ip> را با آدرس IP نقطه پایانی PSC خود که در مرحله قبل آزمایش کرده‌اید، جایگزین کنید.

از پوسته ابری

<?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;
}
?>

ما در این پیاده‌سازی Cloud Run یک شبکه و زیرشبکه مشخص می‌کنیم زیرا ترافیک Cloud Run برای دسترسی به نقطه پایانی PSC باید دوباره به VPC برگردد. ما Cloud Run را طوری هدایت می‌کنیم که از زیرشبکه cloudrun-egress برای Direct VPC Egress استفاده کند. ما تمام ترافیک خروجی را از طریق زیرشبکه Direct VPC Egress به VPC برمی‌گردانیم.

از پوسته ابری

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

وقتی سرویس Cloud Run استقرار خود را به پایان رساند، یک URL سرویس با فرمت https://cloudrun-loop-<projectnum>.<region>.run.app ارائه می‌دهد. توجه داشته باشید که این URL نیز در مرحله بعدی آن را آزمایش خواهد کرد.

۱۴. اتصال به CloudRun-Loop را از طریق Cloud Run URL آزمایش کنید

از پوسته ابری

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

<Cloud-Run-ServiceURL> را با URL سرویسی که در مرحله قبل یادداشت کردید، جایگزین کنید.

از ماشین مجازی مشتری-مصرف‌کننده

curl <Cloud-Run-ServiceURL>

خروجی مورد انتظار

Hello World!

این نتیجه نشان می‌دهد که سرویس CloudRun-Loop ما با موفقیت در حال فراخوانی مجدد به consumer-vpc برای فراخوانی نقطه پایانی PSC متصل به سرویس Hello World Cloud Run است. با این حال، در این مرحله، ماشین مجازی consumer-client ما از طریق Cloud NAT ما به اینترنت متصل می‌شود تا با URL عمومی Cloud Run ما تماس برقرار کند. می‌توانیم URL را بررسی کنیم تا نشان دهیم که به یک آدرس IP عمومی متصل می‌شود.

از ماشین مجازی مشتری-مصرف‌کننده

dig <Cloud-Run-ServiceURL>

خروجی نمونه

; <<>> 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

ما می‌توانیم یک PSC برای نقطه پایانی APIهای گوگل ایجاد کنیم تا این وضوح را به خصوصی تغییر دهیم تا ترافیک از اینترنت عمومی دور بماند.

از ماشین مجازی مشتری-مصرف‌کننده

exit

۱۵. ایجاد PSC برای نقطه پایانی APIهای گوگل

این PSC Endpoint با موردی که قبلاً ایجاد کردیم متفاوت است. PSC برای APIهای گوگل به مجموعه‌ای از APIهای گوگل (یا همه APIها یا APIهای سازگار با VPC-SC) اشاره می‌کند. آدرس IP از یک زیرشبکه منطقه‌ای گرفته نمی‌شود، بلکه به عنوان یک آدرس IP واحد /32 ایجاد می‌شود که جهانی است و نمی‌تواند با هیچ زیرشبکه VPC موجود، زیرشبکه‌های VPC همتا یا مسیرهای ترکیبی همپوشانی داشته باشد.

از پوسته ابری

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

از پوسته ابری

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

۱۶. ایجاد منطقه خصوصی Cloud DNS برای run.app

وقتی یک نقطه پایانی PSC برای APIهای گوگل ایجاد می‌شود، یک منطقه DNS خصوصی Cloud Run برای همه APIهایی که تحت دامنه googleapis.com قرار می‌گیرند، ایجاد می‌شود. از آنجایی که Cloud Run از run.app استفاده می‌کند، باید یک منطقه خصوصی دیگر برای نگاشت run.app به نقطه پایانی PSC برای APIهای گوگل خود ایجاد کنیم.

از پوسته ابری

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"

۱۷. تست وضوح DNS خصوصی

ما دوباره به ماشین مجازی مشتری-مصرف‌کننده خود وارد می‌شویم و دوباره عملیات حفاری را اجرا می‌کنیم، و اکنون باید ببینیم که URL Cloud Run ما به نقطه پایانی PSC برای APIهای گوگل ما تبدیل می‌شود.

از پوسته ابری

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

ابتدا حافظه پنهان DNS را پاک می‌کنیم. <Cloud-Run-ServiceURL> را با URL سرویسی که قبلاً یادداشت کرده‌اید جایگزین کنید.

از ماشین مجازی مشتری-مصرف‌کننده

sudo resolvectl flush-caches

curl <CloudRun-Loop-ServiceURL>

حلقه باید همانطور که قبلاً دیده شد، همچنان کار کند.

از ماشین مجازی مشتری-مصرف‌کننده

curl <CloudRun-Loop-ServiceURL>

خروجی مورد انتظار

Hello World!

از ماشین مجازی مشتری-مصرف‌کننده

dig <CloudRun-Loop-ServiceURL>

این بررسی باید نشان دهد که سرویس Cloud Run Loop ما اکنون در حال اتصال به نقطه پایانی PSC for Google APIs است.

خروجی نمونه

; <<>> 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

موفقیت!

۱۸. مراحل پاکسازی

خروج از نمونه ماشین مجازی

exit

از پوسته ابری

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

ممکن است اجرای دو دستور بعدی با خطای «منبع در حال استفاده» مواجه شود. مستندات Cloud Run می‌گویند که گاهی اوقات Cloud Run پس از حذف سرویس Cloud Run، ۱ تا ۲ ساعت طول می‌کشد تا منابع زیرشبکه را آزاد کند. اگر حذف شما با شکست مواجه شد، از این دو دستور صرف نظر کنید و به بخش بعدی بروید و سپس پس از مدتی برای حذف به این بخش برگردید.

از پوسته ابری

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

gcloud compute networks delete consumer-vpc -q

از پوسته ابری

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

۱۹. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردی.

آنچه ما پوشش داده‌ایم

  • استقرار برنامه‌های پایه در Cloud Run
  • کنترل‌های ورود و خروج Cloud Run
  • استقرار Cloud Run از طریق یک متعادل‌کننده بار برنامه داخلی با یک NEG بدون سرور
  • راه‌اندازی سرویس تولیدکننده PSC از طریق پیوست سرویس
  • استقرار نقاط پایانی PSC