Private Service Connect: استخدام Private Service Connect لنشر الخدمات واستخدامها باستخدام Cloud Run

1. مقدمة

‫Private Service Connect (PSC) هي إحدى إمكانات شبكات Google Cloud التي تتيح للمستهلكين الوصول إلى الخدمات المُدارة بشكل خاص من داخل شبكة السحابة الإلكترونية الخاصة الافتراضية (VPC). وبالمثل، يتيح هذا الخيار لمقدّمي الخدمات المُدارة استضافة هذه الخدمات في شبكات VPC منفصلة وتقديم اتصال خاص للمستهلكين.

‫Cloud Run هي منصة حوسبة مُدارة تتيح لك تشغيل الحاويات مباشرةً على البنية التحتية القابلة للتوسّع من Google.

يمكن استخدام Cloud Run كخدمة PSC بطريقتَين مختلفتَين.

  1. من خلال PSC لواجهات Google APIs عن طريق استدعاء Cloud Run من خلال عنوان URL run.app الذي يوفّره Cloud Run
  2. من خلال خدمة منتِج PSC مخصّصة يتم فيها عرض Cloud Run من خلال مرفق خدمة عبر "موازن تطبيق داخلي" مع مجموعة نقاط نهاية شبكة بدون خادم

سيوضّح هذا الدرس التطبيقي حول الترميز كيفية إعداد Cloud Run باستخدام PSC في كلتا الحالتين.

ما ستتعلمه

  • نشر تطبيقات أساسية على Cloud Run
  • عناصر التحكّم في حركة المرور الواردة والصادرة في Cloud Run
  • نشر Cloud Run من خلال جهاز موازنة حمل داخلي للتطبيقات باستخدام مجموعة NEG بدون خادم
  • إعداد خدمة منتِج PSC من خلال مرفق خدمة
  • نشر نقاط نهاية PSC

المتطلبات

  • مشروع Google Cloud لديه أذونات المالك

2. بنية الدرس التطبيقي حول الترميز

455a040761a8fab9.png

في هذا الدرس التطبيقي حول الترميز، ستنشئ خدمتَين على Cloud Run يمكن الوصول إليهما من خلال Private Service Connect (PSC)، الأولى كخدمة مخصّصة منشورة باستخدام PSC، والثانية كخدمة PSC لواجهات Google APIs. ستنشئ شبكتَي VPC، إحداهما للمستهلك والأخرى للمنتج. عليك أولاً نشر خدمة Hello World Cloud Run وإتاحتها من خلال "جهاز موازنة حمل التطبيقات الداخلي الإقليمي" وNEG بلا خادم في شبكة VPC الخاصة بالمنتج. عليك التأكّد من أنّ الخدمة تعمل من خلال موازن التحميل عبر منتج العميل قبل إعداد خدمة Cloud Run لتكون متاحة كخدمة منتج PSC من خلال "ملحق الخدمة".

بالانتقال إلى consumer-vpc، ستنشئ نقطة نهاية PSC تشير إلى مرفق خدمة Cloud Run الذي أعددناه في producer-vpc. بعد ذلك، عليك التأكّد من إمكانية الوصول إلى الخدمة من خلال PSC من جهاز عميل مستهلك في شبكة VPC للمستهلك. بعد ذلك، ستنشئ خدمة Cloud Run أخرى تستدعي نقطة نهاية PSC. أخيرًا، ستنشئ نقطة نهاية PSC لواجهات Google APIs. من العميل المستهلك، يمكنك الوصول إلى Cloud Run من خلال عنوان URL الذي يوفّره Cloud Run، والذي سيستخدم نقطة نهاية PSC لواجهات Google APIs.

3- الإعداد والمتطلبات

إعداد البيئة بالسرعة التي تناسبك

  1. سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

fbef9caa1602edd0.pnga99b7ace416376c4.png5e3ff691252acf41.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
  • رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم آخر عشوائي. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة ويظل ساريًا طوال مدة المشروع.
  • للعلم، هناك قيمة ثالثة، وهي رقم المشروع، وتستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس البرمجي الكثير، إن وُجدت أي تكلفة. لإيقاف الموارد وتجنُّب تحمّل تكاليف فوترة تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي حول الترميز Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:

55efc1aaa7a4d3ad.png

لن يستغرق توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

7ffe5cbb04455448.png

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا دائمًا بسعة 5 غيغابايت، وتعمل على Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إكمال جميع المهام في هذا الدرس العملي ضمن المتصفّح. لست بحاجة إلى تثبيت أي تطبيق.

4. قبل البدء

تفعيل واجهات برمجة التطبيقات

داخل 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

5- إنشاء شبكة VPC خاصة بالمنتج

شبكة VPC

من Cloud Shell

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

إنشاء شبكات فرعية

من 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

سيتم ربط الشبكة الفرعية لخدمة PSC بمرفق خدمة PSC بغرض ترجمة عناوين الشبكة. بالنسبة إلى حالات الاستخدام في مرحلة الإنتاج، يجب تحديد حجم هذه الشبكة الفرعية بشكل مناسب لاستيعاب عدد نقاط النهاية المرفقة. لمزيد من المعلومات، يمكنك الاطّلاع على مستندات تحديد حجم الشبكة الفرعية لترجمة عنوان الشبكة (NAT) في PSC.

إنشاء سياسة جدار الحماية وقواعد جدار الحماية لشبكة المنتج

من 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

للسماح لميزة "الوصول إلى الأجهزة الافتراضية عبر الإنترنت" بالاتصال بأجهزة VM، أنشئ قاعدة جدار حماية تتضمّن ما يلي:

  • ينطبق على جميع مثيلات الأجهزة الافتراضية التي تريد إتاحتها باستخدام IAP.
  • يسمح هذا الخيار بزيارات الدخول من نطاق عناوين IP ‏35.235.240.0/20. يحتوي هذا النطاق على جميع عناوين IP التي تستخدمها خدمة IAP لإعادة توجيه بروتوكول TCP.

من 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. إنشاء تطبيق Hello World على Cloud Run

اتّبِع التعليمات هنا لكتابة نموذج تطبيق بلغة Python. نفِّذ هذه الأوامر في Cloud Shell. بعد الانتهاء من الخطوة 3 في "كتابة نموذج التطبيق"، ارجع إلى هذا الدرس التطبيقي حول الترميز واتّبِع التعليمات أدناه لنشر التطبيق على Cloud Run من المصدر.

قبل نشر خدمة Cloud Run، تأكَّد من أنّ حساب خدمة Compute Engine التلقائي لديه الأذونات المناسبة من خلال تنفيذ الأمر التالي.

من Cloud Shell

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

ملاحظة: يفترض هذا الدرس التطبيقي حول الترميز أنّ مؤسستك لم تفعّل "سياسة المؤسسة للمشاركة المقيدة بالنطاق". إذا كانت هذه السياسة مفعَّلة، عليك اتّخاذ خطوات إضافية لنشر Cloud Run مع المصادقة، وإعداد شاشة موافقة OAuth، وإعداد IAP لخادم الخلفية لموازنة التحميل. يُنصح باتّباع جميع خطوات الإعداد هذه في بيئة التشغيل الفعلي.

من Cloud Shell

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 لهذه الخدمة. في تاريخ نشر هذا الدرس التطبيقي حول الترميز، لا تزال هذه الميزة في مرحلة المعاينة.

قبل المتابعة، عليك الرجوع إلى الدليل الرئيسي في Cloud Shell.

من Cloud Shell

cd ..

7. عرض تطبيق Hello World Cloud Run من خلال جهاز موازنة حمل داخلي للتطبيقات

احجز عنوان IP داخليًا ثابتًا لقاعدة إعادة توجيه جهاز موازنة الحمل.

في Cloud Shell

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 الذي أنشأته للتو.

إنشاء جهاز موازنة الحمل الداخلي للتطبيقات على مستوى منطقة معيّنة

في 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

في 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. اختبار تطبيق Hello World الذي تم عرضه من خلال جهاز موازنة الحمل في Cloud Run

إنشاء جهاز افتراضي للاختبار

من Cloud Shell

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

في Cloud Shell

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

استبدِل <loadbalancer-ip> بعنوان IP الذي أنشأته سابقًا (مثال: 10.0.0.2).

اختبار تطبيق Hello World

In producer-vm

curl <loadbalancer-ip>

الناتج المتوقّع

Hello World!

اخرج من الجهاز الظاهري.

In producer-vm

exit

9. إنشاء مرفق خدمة

من 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

بعد ذلك، استردِد معرّف الموارد المنتظم (URI) لمرفق الخدمة ودوِّن ملاحظة عنه لإعداد نقطة نهاية PSC في بيئة المستهلك.

في Cloud Shell

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

10. إنشاء شبكة VPC للمستهلك

شبكة VPC

من Cloud Shell

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

إنشاء شبكة فرعية

من 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

إنشاء Cloud NAT

من 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

إنشاء سياسة جدار الحماية وقواعد جدار الحماية في شبكة المستهلك

سننشئ سياسة أخرى لجدار حماية الشبكة من أجل consumer-vpc.

من 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. إنشاء نقطة نهاية Private Service Connect لخدمة Hello World Cloud Run

في هذه المرحلة، سننشئ نقطة نهاية PSC ونربطها بخدمة Cloud Run التي عرضتها من خلال Service Attachment. ستستخدم معرّف الموارد المنتظم (URI) لملحق الخدمة الذي دوّنته سابقًا في هذا القسم. تأكَّد من أنّ تنسيق معرّف الموارد المنتظم (URI) في أمر gcloud يتطابق مع معرّف الموارد المنتظم (URI) الخاص بك.

إنشاء نقطة نهاية PSC

من 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

احصل على عنوان IP لنقطة نهاية Private Service Connect التي أنشأتها للتو. ستستخدم عنوان IP في الخطوة التالية لاختبار نقطة النهاية.

من Cloud Shell

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

12. إنشاء جهاز افتراضي للعميل المستهلك واختبار الاتصال بنقطة النهاية

إنشاء جهاز افتراضي للعميل المستهلك

من 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'

اختبار الاتصال

من Cloud Shell

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

استبدِل <cloudrun-service-ip> بعنوان IP الفعلي.

من الجهاز الافتراضي للعميل المستهلك

curl <cloudrun-service-ip>

الناتج المتوقّع

Hello World!

من الجهاز الافتراضي للعميل المستهلك

exit

13. إنشاء خدمة Loop على Cloud Run

بعد ذلك، سننشئ خدمة Cloud Run ستُجري عملية ردّ اتصال خاص إلى شبكة VPC الخاصة بالمستهلك لاستدعاء خدمة Cloud Run HelloWorld السابقة التي أتحناها من خلال PSC.

اتّبِع التعليمات الواردة في "كتابة نموذج التطبيق" هنا لكتابة تطبيق حلقة في PHP. بدلاً من helloworld-php، سمِّ دليلَك cloudrun-loop. نفِّذ هذه الأوامر في Cloud Shell. في الخطوة الثانية، استخدِم رمز PHP أدناه في ملف index.php. ارجع إلى الدرس التطبيقي حول الترميز عندما تكون مستعدًا للنشر على Cloud Run. لا تتّبِع التعليمات الواردة في المستندات لهذه الخطوة.

استخدِم هذا الرمز لملف index.php. استبدِل <cloudrun-service-ip> بعنوان IP لنقطة نهاية PSC التي اختبرتها في الخطوة السابقة.

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

نحدّد شبكة وشبكة فرعية في عملية نشر Cloud Run هذه لأنّ بيانات Cloud Run يجب أن تخرج مرة أخرى إلى شبكة VPC للوصول إلى نقطة نهاية PSC. نوجّه Cloud Run لاستخدام الشبكة الفرعية cloudrun-egress من أجل الخروج المباشر من سحابة VPC. نحن نوجّه جميع الزيارات إلى الخروج من خلال الشبكة الفرعية Direct VPC Egress والعودة إلى شبكة VPC.

من 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

عندما تنتهي خدمة Cloud Run من عملية النشر، ستوفّر عنوان URL للخدمة بالتنسيق https://cloudrun-loop-<projectnum>.<region>.run.app. سجِّل عنوان URL هذا أيضًا لاختباره في الخطوة التالية.

14. اختبار الاتصال بخدمة CloudRun-Loop من خلال عنوان URL الخاص بها

من Cloud Shell

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

استبدِل <Cloud-Run-ServiceURL> بعنوان URL للخدمة الذي دوّنته في الخطوة السابقة.

من الجهاز الافتراضي للعميل المستهلك

curl <Cloud-Run-ServiceURL>

الناتج المتوقّع

Hello World!

توضّح هذه النتيجة أنّ خدمة CloudRun-Loop تعيد الاتصال بنجاح بشبكة VPC الخاصة بالمستهلك لاستدعاء نقطة نهاية PSC المرتبطة بخدمة Hello World Cloud Run. ومع ذلك، في هذه المرحلة، يخرج الجهاز الافتراضي الخاص بالعميل والمستهلك إلى الإنترنت من خلال Cloud NAT لإجراء مكالمة إلى عنوان URL العلني الخاص بـ Cloud Run. يمكننا تنفيذ عملية بحث dig على عنوان 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 لنقطة نهاية Google APIs لتغيير هذا القرار إلى خاص من أجل إبقاء عدد الزيارات بعيدًا عن الإنترنت العام.

من الجهاز الافتراضي للعميل المستهلك

exit

15. إنشاء Private Service Connect لنقطة نهاية Google APIs

تختلف نقطة نهاية PSC هذه عن تلك التي أنشأناها سابقًا. تشير خدمة Private Service Connect لواجهات Google APIs إلى حزمة من واجهات Google APIs (إما جميع واجهات برمجة التطبيقات أو واجهات برمجة التطبيقات المتوافقة مع VPC-SC). لا يتم الحصول على عنوان IP من شبكة فرعية إقليمية، بل يتم إنشاؤه كعنوان IP واحد /32 عالمي لا يمكن أن يتداخل مع أي شبكات فرعية حالية في شبكة VPC أو شبكات فرعية في شبكة VPC مرتبطة أو مسارات مختلطة.

من 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

من Cloud Shell

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

16. إنشاء منطقة خاصة في Cloud DNS لتطبيق run.app

عند إنشاء نقطة نهاية Private Service Connect لواجهات Google APIs، سيتم إنشاء منطقة نظام أسماء نطاقات (DNS) خاصة في Cloud Run لجميع واجهات برمجة التطبيقات التي تندرج ضمن النطاق googleapis.com. بما أنّ Cloud Run تستخدم run.app، علينا إنشاء منطقة خاصة أخرى لربط run.app بنقطة نهاية PSC لواجهات Google API.

من 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. اختبار التحويل باستخدام نظام أسماء النطاقات الخاص

سنعيد تسجيل الدخول إلى الجهاز الظاهري الخاص بالعميل المستهلك وننفّذ الأمر dig مرة أخرى، وسنلاحظ الآن أنّ عنوان URL الخاص بخدمة Cloud Run سيتم تحويله إلى نقطة نهاية Private Service Connect لواجهات Google API.

من Cloud Shell

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

أولاً، سنمحو ذاكرة التخزين المؤقت لنظام أسماء النطاقات. استبدِل <Cloud-Run-ServiceURL> بعنوان URL للخدمة الذي دوّنته سابقًا.

من الجهاز الافتراضي للعميل المستهلك

sudo resolvectl flush-caches

curl <CloudRun-Loop-ServiceURL>

يجب أن يظل curl يعمل كما كان من قبل.

من الجهاز الافتراضي للعميل المستهلك

curl <CloudRun-Loop-ServiceURL>

الناتج المتوقّع

Hello World!

من الجهاز الافتراضي للعميل المستهلك

dig <CloudRun-Loop-ServiceURL>

يجب أن يوضّح الأمر dig أنّ خدمة Cloud Run Loop تحلّل الآن نقطة نهاية PSC لواجهات 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

نجح الإجراء!

18 خطوات التنظيف

الخروج من مثيل الجهاز الافتراضي

exit

من 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

من المحتمل أن يتعذّر تنفيذ الأمرَين التاليَين بسبب ظهور أخطاء "المورد قيد الاستخدام". تذكر المستندات الخاصة بخدمة Cloud Run أنّها تستغرق أحيانًا من ساعة إلى ساعتين لإتاحة موارد الشبكة الفرعية بعد حذف خدمة Cloud Run. إذا تعذّر الحذف، تخطَّ هاتين الأمرين وانتقِل إلى القسم التالي، ثم ارجع إلى هذا القسم للحذف بعد مرور بعض الوقت.

من Cloud Shell

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

gcloud compute networks delete consumer-vpc -q

من 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. تهانينا!

تهانينا على إكمال درس البرمجة.

المواضيع التي تناولناها

  • نشر تطبيقات أساسية على Cloud Run
  • عناصر التحكّم في حركة المرور الواردة والصادرة في Cloud Run
  • نشر Cloud Run من خلال جهاز موازنة حمل داخلي للتطبيقات باستخدام مجموعة NEG بدون خادم
  • إعداد خدمة منتِج PSC من خلال مرفق خدمة
  • نشر نقاط نهاية PSC