1. مقدمة
نظرة عامة
لتأمين حركة بيانات الشبكة لخدماتها وتطبيقاتها، تستخدم العديد من المؤسسات شبكة "سحابة إلكترونية خاصة افتراضية" (VPC) على Google Cloud مع عناصر تحكّم في الحدود لمنع استخراج البيانات. شبكة السحابة الافتراضية الخاصة هي نسخة افتراضية من شبكة فعلية يتم تنفيذها داخل شبكة الإنتاج في Google. توفّر شبكة VPC إمكانية الاتصال لأجهزة Compute Engine الافتراضية، وتوفّر موازنات الحمل الأصلية الداخلية على الشبكة التي تعمل بنقل البيانات المباشر وأنظمة الخادم الوكيل لموازنات الحمل الداخلية للتطبيقات، وتتصل بالشبكات المحلية باستخدام أنفاق Cloud VPN ومرفقات شبكة VLAN لخدمة Cloud Interconnect، وتوزّع الزيارات من موازنات الحمل الخارجية في Google Cloud على الخلفيات.
على عكس الأجهزة الافتراضية، لا ترتبط خدمات Cloud Run بأي شبكة VPC معيّنة تلقائيًا. يوضّح هذا الدرس التطبيقي حول الترميز كيفية تغيير إعدادات حركة البيانات الواردة (الاتصالات الواردة) بحيث لا يمكن إلا للزيارات الواردة من شبكة VPC الوصول إلى خدمة Cloud Run (مثل خدمة الخلفية). بالإضافة إلى ذلك، يوضّح لك هذا الدرس التطبيقي حول الترميز كيفية السماح لخدمة ثانية (مثل خدمة الواجهة الأمامية) بالوصول إلى خدمة Cloud Run للخادم الخلفي من خلال شبكة VPC.
في هذا المثال، تعرض خدمة Cloud Run الخلفية عبارة "hello world". توفّر خدمة Cloud Run للواجهة الأمامية حقل إدخال في واجهة المستخدم لجمع عنوان URL. بعد ذلك، ترسل خدمة الواجهة الأمامية طلب استرداد بيانات باستخدام GET إلى عنوان URL هذا (مثل خدمة الخلفية)، ما يجعل هذا طلب خدمة إلى خدمة (بدلاً من طلب من المتصفح إلى الخدمة). عندما تتمكّن خدمة الواجهة الأمامية من الوصول إلى الواجهة الخلفية بنجاح، ستظهر الرسالة hello world في المتصفّح.
ما ستتعلمه
- كيفية السماح فقط بحركة البيانات من شبكة VPC إلى خدمة Cloud Run
- كيفية ضبط حركة الخروج في خدمة Cloud Run للتواصل مع خدمة Cloud Run التي تسمح بالدخول الداخلي فقط
2. الإعداد والمتطلبات
المتطلبات الأساسية
- يجب أن تكون مسجّلاً الدخول إلى Cloud Console.
- سبق لك نشر خدمة Cloud Run. على سبيل المثال، يمكنك اتّباع دليل البدء السريع لنشر خدمة ويب من الرمز المصدر للبدء.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة توضّح ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.

يتم تحميل هذا الجهاز الافتراضي بجميع أدوات التطوير اللازمة. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إنجاز معظم عملك في هذا الدرس العملي، إن لم يكن كله، باستخدام متصفح.
بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تم إثبات هويتك وأنّ المشروع مضبوط على رقم تعريف مشروعك.
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من إكمال عملية المصادقة:
gcloud auth list
ناتج الأمر
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من أنّ أمر gcloud يعرف مشروعك:
gcloud config list project
ناتج الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
ناتج الأمر
Updated property [core/project].
3- إنشاء خدمات Cloud Run
إعداد متغيرات البيئة
يمكنك ضبط متغيّرات البيئة التي سيتم استخدامها في جميع مراحل هذا الدرس البرمجي.
REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend BACKEND=backend
إنشاء خدمة Cloud Run للخلفية
أولاً، أنشئ دليلاً لرمز المصدر وانتقِل إلى هذا الدليل.
mkdir -p internal-codelab/frontend internal-codelab/backend && cd internal-codelab/backend
بعد ذلك، أنشِئ ملف package.json يتضمّن المحتوى التالي:
{
"name": "backend-service",
"version": "1.0.0",
"description": "",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.18.1"
}
}
بعد ذلك، أنشِئ ملف مصدر index.js يتضمّن المحتوى أدناه. يحتوي هذا الملف على نقطة دخول الخدمة ويتضمّن المنطق الرئيسي للتطبيق.
const express = require('express');
const app = express();
app.use(express.urlencoded({ extended: true }));
app.get('/', function (req, res) {
res.send("hello world");
});
const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
console.log(`helloworld: listening on port ${port}`);
});
أخيرًا، يمكنك نشر خدمة Cloud Run من خلال تنفيذ الأمر التالي.
gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION
إنشاء خدمة Cloud Run للواجهة الأمامية
انتقِل إلى دليل الواجهة الأمامية.
cd ../frontend
بعد ذلك، أنشِئ ملف package.json يتضمّن المحتوى التالي:
{
"name": "frontend",
"version": "1.0.0",
"description": "",
"scripts": {
"start": "node index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^1.6.6",
"express": "^4.18.2"
}
}
بعد ذلك، أنشِئ ملف مصدر index.js يتضمّن المحتوى أدناه. يحتوي هذا الملف على نقطة دخول الخدمة ويتضمّن المنطق الرئيسي للتطبيق.
const express = require("express");
const app = express();
const port = 8080;
const path = require('path');
const axios = require('axios');
// serve static content (index.html) using
// built-in middleware function in Express
app.use(express.static('public'));
app.use(express.urlencoded({ extended: true }));
// this endpoint receives a URL in the post body
// and then makes a get request to that URL
// results are sent back to the caller
app.post('/callService', async (req, res) => {
const url = req.body.url;
let message = "";
try {
console.log("url: ", url);
const response = await axios.get(url);
message = response.data;
} catch (error) {
message = error.message;
console.error(error.message);
}
res.send(`
${message}
<p>
</p>
`);
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
إنشاء دليل متاح للجميع لملف index.html
mkdir public touch public/index.html
عدِّل ملف index.html ليتضمّن ما يلي:
<html>
<script
src="https://unpkg.com/htmx.org@1.9.10"
integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC"
crossorigin="anonymous"
></script>
<body>
<div style="margin-top: 100px; margin-left: 100px">
<h1>I'm the Frontend service on the Internet</h1>
<form hx-trigger="submit" hx-post="/callService" hx-target="#message">
<label for="url"> URL:</label>
<input
style="width: 308px"
type="text"
id="url"
name="url"
placeholder="The backend service URL"
required
/>
<button hx-indicator="#loading" type="submit">Submit</button>
<p></p>
<span class="htmx-indicator" id="loading"> Loading... </span>
<div id="message" style="white-space: pre-wrap"></div>
<p></p>
</form>
</div>
</body>
</html>
أخيرًا، يمكنك نشر خدمة Cloud Run من خلال تنفيذ الأمر التالي.
gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION
الاتصال بخدمة الخلفية
تأكَّد من أنّك نشرت خدمتَين من Cloud Run بنجاح.
افتح عنوان URL الخاص بالخدمة الأمامية في متصفّح الويب.
في مربّع النص، أدخِل عنوان URL لخدمة الخلفية. يُرجى العِلم أنّ هذا الطلب يتم توجيهه من مثيل Cloud Run للواجهة الأمامية إلى خدمة Cloud Run للخلفية، بدلاً من توجيهه من المتصفّح.
سيظهر لك النص "hello world".
4. ضبط خدمة الخلفية للسماح بالدخول الداخلي فقط
نفِّذ أمر gcloud التالي للسماح فقط بالزيارات من داخل شبكة VPC بالوصول إلى خدمة الخلفية.
gcloud run services update $BACKEND --ingress internal --region $REGION
للتأكّد من أنّ خدمة الخلفية يمكنها تلقّي الزيارات من شبكة VPC فقط، حاوِل مرة أخرى استدعاء خدمة الخلفية من خدمة الواجهة الأمامية.
في هذه المرة، ستظهر لك الرسالة "تعذّر تنفيذ الطلب مع رمز الحالة 404".
يحدث هذا الخطأ لأنّ طلب الخروج من خدمة Cloud Run للواجهة الأمامية (أي الخروج) ينتقل إلى الإنترنت أولاً، وبالتالي لا يعرف Google Cloud مصدر الطلب.
في القسم التالي، ستضبط خدمة الواجهة الأمامية للوصول إلى شبكة VPC، وبالتالي ستعرف Google Cloud أنّ الطلب وارد من شبكة VPC، التي يتم التعرّف عليها كمصدر داخلي.
5- ضبط خدمة الواجهة الأمامية للوصول إلى شبكة VPC
في هذا القسم، ستضبط خدمة Cloud Run للواجهة الأمامية للتواصل مع خدمة الخلفية من خلال شبكة VPC.
لتنفيذ ذلك، عليك إضافة ميزة الخروج المباشر من سحابة VPC إلى مثيلات Cloud Run للواجهة الأمامية لمنح خدمتك عنوان IP داخليًا لاستخدامه داخل سحابة VPC. بعد ذلك، عليك ضبط حركة الخروج بحيث تنتقل جميع الاتصالات الصادرة من خدمة الواجهة الأمامية إلى شبكة VPC.
أولاً، نفِّذ الأمر التالي لتفعيل الخروج المباشر من سحابة VPC:
gcloud beta run services update $FRONTEND \ --network=default \ --subnet=default \ --vpc-egress=all-traffic \ --region=$REGION
يمكنك الآن التأكّد من أنّ خدمة الواجهة الأمامية يمكنها الوصول إلى شبكة VPC:
gcloud beta run services describe $FRONTEND \ --region=$REGION
من المفترَض أن تظهر لك نتيجة مثل
VPC access:
Network: default
Subnet: default
Egress: all-traffic
الآن، حاوِل مرة أخرى الاتصال بخدمة الخلفية من خدمة الواجهة الأمامية.
في هذه المرة، ستظهر لك عبارة "hello world".
ملاحظة: لن تتمكّن خدمة الواجهة الأمامية من الوصول إلى الإنترنت لأنّ جميع عمليات الخروج تم توجيهها إلى شبكة VPC. على سبيل المثال، ستنتهي مهلة خدمة الواجهة الأمامية إذا حاولت الوصول إلى https://curlmyip.org/.
6. تهانينا!
تهانينا على إكمال هذا الدرس العملي.
ننصحك بمراجعة مستندات Cloud Run وكيفية إعداد الشبكات الخاصة لخدمات Cloud Run.
المواضيع التي تناولناها
- كيفية السماح فقط بحركة البيانات من شبكة VPC إلى خدمة Cloud Run
- كيفية ضبط حركة الخروج في خدمة Cloud Run للتواصل مع خدمة Cloud Run التي تسمح بالدخول الداخلي فقط
7. تَنظيم
لتجنُّب الرسوم غير المقصودة (على سبيل المثال، إذا تم استدعاء خدمات Cloud Run مرات أكثر من مخصص استدعاء Cloud Run الشهري في المستوى المجاني)، يمكنك إما حذف Cloud Run أو حذف المشروع الذي أنشأته في الخطوة 2.
لحذف خدمة Cloud Run، انتقِل إلى Cloud Run Cloud Console على الرابط https://console.cloud.google.com/run واحذف خدمتَي $FRONTEND و $BACKEND.
إذا اخترت حذف المشروع بأكمله، يمكنك الانتقال إلى https://console.cloud.google.com/cloud-resource-manager، واختيار المشروع الذي أنشأته في الخطوة 2، ثم النقر على "حذف". إذا حذفت المشروع، عليك تغيير المشاريع في Cloud SDK. يمكنك الاطّلاع على قائمة بجميع المشاريع المتاحة من خلال تنفيذ gcloud projects list.