1. مقدمة
Private Service Connect (PSC) هي إحدى إمكانات شبكة Google Cloud التي تتيح للمستهلكين الوصول إلى الخدمات المُدارة بشكل خاص من داخل شبكة السحابة الإلكترونية الخاصة الافتراضية (VPC). وبالمثل، يتيح لمقدّمي الخدمات المُدارة استضافة هذه الخدمات في شبكات VPC منفصلة وتقديم اتصال خاص للمستهلكين.
Cloud Run هي منصة حوسبة مُدارة تتيح لك تشغيل الحاويات مباشرةً على بنية Google التحتية القابلة للتوسّع.
يمكن استخدام Cloud Run كخدمة PSC بطريقتَين مختلفتَين.
- من خلال PSC لواجهات Google API عن طريق استدعاء Cloud Run من خلال عنوان URL الخاص بـ run.app الذي يوفّره Cloud Run
- من خلال خدمة مخصّصة لإنتاج PSC يتم فيها عرض Cloud Run من خلال مرفق خدمة عبر "موازنة حمل التطبيقات الداخلية" باستخدام مجموعة NEG بدون خادم
سيتناول هذا الدرس التطبيقي حول الترميز كيفية إعداد Cloud Run باستخدام PSC لكلا السيناريوهَين
ما ستتعلمه
- نشر تطبيقات أساسية على Cloud Run
- عناصر التحكّم في البيانات الواردة والصادرة في Cloud Run
- نشر Cloud Run من خلال جهاز موازنة حمل داخلي للتطبيقات مع مجموعة NEG بدون خادم
- إعداد خدمة منتِج PSC من خلال Service Attachment
- تفعيل نقاط نهاية Private Service Connect
المتطلبات
- مشروع Google Cloud لديه أذونات المالك
2. بنية الدرس التطبيقي حول الترميز

في هذا الدرس التطبيقي حول الترميز، ستنشر خدمتَين على Cloud Run يمكن الوصول إليهما من خلال PSC، الأولى كخدمة مخصّصة منشورة باستخدام PSC، والثانية كخدمة PSC لواجهات Google APIs. ستنشئ شبكتَي VPC، وهما consumer-vpc وproducer-vpc. عليك أولاً نشر خدمة Hello World Cloud Run وإتاحتها من خلال جهاز موازنة الحمل للتطبيقات الداخلية الإقليمية ومجموعة NEG بدون خادم في شبكة VPC الخاصة بالمنتج. عليك التأكّد من أنّ الخدمة تعمل من خلال موازن التحميل عبر منتج العميل قبل إعداد خدمة Cloud Run لتكون متاحة كخدمة منتج PSC من خلال Service Attachment.
بالانتقال إلى consumer-vpc، ستنشئ نقطة نهاية PSC تشير إلى "ربط الخدمة" في Cloud Run الذي أعددناه في producer-vpc. بعد ذلك، عليك التأكّد من إمكانية الوصول إلى الخدمة من خلال PSC من جهاز عميل مستهلك في شبكة VPC للمستهلك. بعد ذلك، ستنشئ خدمة Cloud Run أخرى تستدعي نقطة نهاية PSC. أخيرًا، ستنشئ نقطة نهاية Private Service Connect لواجهات Google APIs. من جهاز العميل، يمكنك الوصول إلى Cloud Run من خلال عنوان URL الذي توفّره Cloud Run، والذي سيستخدم نقطة نهاية PSC لواجهات Google APIs.
3- الإعداد والمتطلبات
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.



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

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

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا ثابتًا بسعة 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) في Private Service Connect.
إنشاء سياسة جدار الحماية وقواعد جدار الحماية لشبكة المنتج
من 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
في هذه المرحلة، سننشئ نقطة نهاية Private Service Connect ونربطها بخدمة 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 لنقطة نهاية PSC التي أنشأتها للتو. ستستخدم عنوان 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. إنشاء خدمة Cloud Run Loop
بعد ذلك، سننشئ خدمة Cloud Run ستُجري عملية ردّ اتصال خاص إلى شبكة VPC الخاصة بالمستهلك لاستدعاء خدمة Cloud Run HelloWorld السابقة التي عرضناها من خلال PSC.
اتّبِع التعليمات الواردة في "كتابة نموذج التطبيق" هنا لكتابة تطبيق حلقة في PHP. بدلاً من helloworld-php، سمِّ دليلك cloudrun-loop. نفِّذ هذه الأوامر في Cloud Shell. في الخطوة الثانية، استخدِم رمز PHP أدناه في ملف index.php. ارجع إلى Codelab عندما تكون مستعدًا للنشر على 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 من أجل الخروج المباشر من السحابة الإلكترونية الخاصة الافتراضية. نحن نوجّه جميع الزيارات إلى الخروج من خلال الشبكة الفرعية 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 Run
من 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. ومع ذلك، في هذه المرحلة، يخرج الجهاز الافتراضي (VM) الخاص بالعميل إلى الإنترنت من خلال 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 لنقطة نهاية Google APIs لتغيير هذا القرار إلى خاص من أجل إبقاء عدد الزيارات بعيدًا عن الإنترنت العام.
من الجهاز الافتراضي للعميل المستهلك
exit
15. إنشاء PSC لنقطة نهاية Google APIs
تختلف نقطة نهاية PSC هذه عن تلك التي أنشأناها سابقًا. تشير خدمة Private Service Connect (PSC) لواجهات 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، سيتم إنشاء منطقة نظام أسماء نطاقات خاص في Cloud Run لجميع واجهات برمجة التطبيقات التي تندرج ضمن النطاق googleapis.com. بما أنّ Cloud Run تستخدم run.app، علينا إنشاء منطقة خاصة أخرى لربط run.app بنقطة نهاية PSC لواجهات Google APIs.
من 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 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 من خلال Service Attachment
- تفعيل نقاط نهاية Private Service Connect