1. نظرة عامة
سوف تنشئ في هذا التمرين المعملي خدمة قائمة Cymbal Eats وستعرض واجهات برمجة تطبيقات RESTful لإضافة عناصر القائمة وتحديثها وحذفها وإدراجها. ستنشئ قاعدة بيانات Cloud SQL كقاعدة بيانات خلفية لخدمة القائمة التي سيتم تشغيلها في Cloud Run. بما أنّ Cloud Run لا يتوفّر في شبكة VPC نفسها مثل قاعدة بيانات Cloud SQL، ستحتاج إلى ضبط موصِّل الوصول إلى VPC بدون خادم للسماح بتشغيل Cloud Run بالاتصال مع Cloud SQL من خلال عنوان IP خاص.
ما سوف تتعلمه
ستتعلم في هذا التمرين المعملي كيفية القيام بما يلي:
- ضبط شبكة VPC الخاصة
- إنشاء قاعدة بيانات خاصة لخدمة Postgres Cloud SQL
- ربط CloudRun بسحابة VPC خاصة
- نشر خدمة على Cloud Run ترتبط بقاعدة بيانات Cloud SQL
2. الإعداد والمتطلبات
إعداد بيئة ذاتية
- سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
- يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه
PROJECT_ID
). وإذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيبقى طوال مدة المشروع. - لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بالكامل. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
إعداد البيئة
- إنشاء متغيرات بيئة ذات صلة بالمشروع والموارد
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service
export SERVERLESS_VPC_CONNECTOR=cymbalconnector
export DB_INSTANCE_NAME=menu-catalog
export DB_INSTANCE_PASSWORD=password123
export DB_DATABASE=menu-db
export DB_USER=menu-user
export DB_PASSWORD=menupassword123
- استنساخ المستودع والانتقال إلى الدليل
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- تفعيل الخدمات
gcloud services enable \
sqladmin.googleapis.com \
run.googleapis.com \
vpcaccess.googleapis.com \
servicenetworking.googleapis.com
3- ضبط إعدادات الوصول الخاص
يتم توفير الوصول إلى الخدمات الخاصة كرابط تبادل المعلومات بين الشبكات في شبكة VPC بين شبكة VPC الأساسية وشبكة VPC الأساسية حيث يوجد مثيل Cloud SQL. يسمح الاتصال الخاص بمثيلات الأجهزة الافتراضية في شبكة VPC والخدمات التي تستخدمها للتواصل فقط من خلال عناوين IP الداخلية. للوصول إلى الخدمات المتاحة من خلال الوصول إلى الخدمات الخاصة، لا تتطلب مثيلات الأجهزة الافتراضية الاتصال بالإنترنت أو عناوين IP خارجية.
- تخصيص نطاق عنوان IP
gcloud compute addresses create google-managed-services-default \
--global \
--purpose=VPC_PEERING \
--prefix-length=20 \
--network=projects/$PROJECT_ID/global/networks/default
مثال على الناتج
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
- إنشاء اتصال خاص
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-default \
--network=default \
--project=$PROJECT_ID
مثال على الناتج
Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.
4. إعداد Cloud SQL
خدمة Cloud SQL هي خدمة قواعد بيانات مُدارة بالكامل تسهِّل عملية إعداد قواعد البيانات الارتباطية لـ PostgreSQL وMySQL وإدارتها وإدارتها وإدارتها في السحابة الإلكترونية. يتم تشغيل كل مثيل من Cloud SQL بواسطة جهاز افتراضي يعمل على خادم مضيف في Google Cloud. يشمل خيار مدى التوفّر العالي أيضًا جهاز افتراضي في وضع الاستعداد في منطقة أخرى بالإعداد نفسه المستخدَم في الجهاز الافتراضي الأساسي. ويتم الاحتفاظ بقاعدة البيانات على جهاز تخزين شبكي قابل للتطوير وطويلة الأمد يُعرف باسم القرص الدائم المتصل بالجهاز الافتراضي. يتم تخصيص عنوان IP ثابت لكل جهاز افتراضي لضمان بقاء عنوان IP الذي يتصل به التطبيق ثابتًا طوال فترة بقاء مثيل Cloud SQL.
ستنشئ قاعدة بيانات Postgres Cloud SQL باستخدام عنوان IP خاص.
إنشاء قاعدة بيانات ومستخدم
- إنشاء مثيل Postgres Cloud SQL لاستخدام عنوان IP خاص
gcloud sql instances create $DB_INSTANCE_NAME \
--project=$PROJECT_ID \
--network=projects/$PROJECT_ID/global/networks/default \
--no-assign-ip \
--database-version=POSTGRES_12 \
--cpu=2 \
--memory=4GB \
--region=$REGION \
--root-password=${DB_INSTANCE_PASSWORD}
مثال على الناتج
Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/cymbal1/instances/menu-instance]. NAME: menu-instance DATABASE_VERSION: POSTGRES_12 LOCATION: us-east1-a TIER: db-custom-2-4096 PRIMARY_ADDRESS: - PRIVATE_ADDRESS: 10.8.80.5 STATUS: RUNNABLE
- إضافة قاعدة بيانات إلى مثيل قاعدة البيانات
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME
مثال على الناتج
Created database [menu-db]. instance: menu-catalog name: menu-db project: cymbal1
- إنشاء مستخدم SQL
gcloud sql users create ${DB_USER} \
--password=$DB_PASSWORD \
--instance=$DB_INSTANCE_NAME
مثال على الناتج
Created user [menu-user].
- تخزين عنوان IP لقاعدة البيانات
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
--format=json | jq \
--raw-output ".ipAddresses[].ipAddress")
- إضافة دور "عميل Cloud SQL" إلى حساب خدمة Compute Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"
مثال على الناتج
Updated IAM policy for project [cymbal1]. [...]
5- سحابة VPC بدون خادم
يتيح لك الوصول إلى سحابة VPC بدون خادم الاتصال مباشرةً بشبكة السحابة الإلكترونية الخاصة الافتراضية من بيئات بدون خادم، مثل تشغيل Cloud أو App Engine أو Cloud Functions. إنّ "إعداد إمكانية الوصول إلى سحابة VPC بدون خادم" يسمح للبيئة غير التابعة لخادم بإرسال طلبات إلى شبكة VPC باستخدام نظام أسماء النطاقات الداخلي وعناوين IP الداخلية (كما هو محدّد في RFC 1918 وRFC 6598). تستخدم الردود على هذه الطلبات أيضًا شبكتك الداخلية.
ستنشئ موصِّلاً للوصول إلى VPC بدون خادم لخدمة Cloud Run للاتصال بخدمة Cloud SQL.
- أنشِئ موصِّلاً للوصول إلى VPC بدون خادم في شبكة VPC نفسها مثل مثيل Cloud SQL.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
--region=${REGION} \
--range=10.8.0.0/28
مثال على الناتج
Created connector [cymbalconnector].
6- النشر إلى التشغيل في السحابة الإلكترونية
سيكون عليك إنشاء صورة Docker ونشرها على Cloud Run وربط ميزة Cloud Run بموصل VPC بدون خادم للوصول إلى قاعدة بيانات Cloud SQL.
- تجميع التطبيق باستخدام maven
./mvnw package -DskipTests
مثال على الناتج
[...] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 42.864 s [INFO] Finished at: 2022-04-28T16:15:33Z [INFO] ------------------------------------------------------------------------
- إنشاء صورة Docker:
docker build -f src/main/docker/Dockerfile.jvm \
--tag gcr.io/$PROJECT_NAME/menu-service .
مثال على الناتج
[...] Successfully built 4ef5d7a3befc Successfully tagged gcr.io/cymbal1/menu-service:latest
- إرسال صورة Docker إلى سجلّ الحاوية:
docker push gcr.io/$PROJECT_NAME/menu-service
مثال على الناتج
Using default tag: latest The push refers to repository [gcr.io/cymbalsql/menu-service] 17b374963800: Pushed d9a51c06430d: Pushed fff5d2a2cfc9: Pushed f21fceb558c6: Pushed 5ffbbbf218dd: Pushed 60609ec85f86: Layer already exists f2c4302f03b8: Layer already exists latest: digest: sha256:f64cb7c288dbf4ad9b12bd210c23c5aec1048dee040450ff2d9dbdf96e83a426 size: 1789
- نشر خدمة القائمة:
gcloud run deploy $MENU_SERVICE_NAME \
--image=gcr.io/$PROJECT_NAME/menu-service:latest \
--region $REGION \
--allow-unauthenticated \
--set-env-vars DB_USER=$DB_USER \
--set-env-vars DB_PASS=$DB_PASSWORD \
--set-env-vars DB_DATABASE=$DB_DATABASE \
--set-env-vars DB_HOST=$DB_INSTANCE_IP \
--vpc-connector $SERVERLESS_VPC_CONNECTOR \
--project=$PROJECT_ID \
--quiet
مثال على الناتج
[...] Done. Service [menu-service] revision [menu-service-00002-xox] has been deployed and is serving 100 percent of traffic. Service URL: https://menu-service-g2mfphytdq-uk.a.run.app
تنصح Google باستخدام المدير السري لتخزين المعلومات الحساسة، مثل بيانات اعتماد SQL. يمكنك تمرير المفاتيح السرّية كمتغيّرات للبيئة أو تحميلها كوحدة تخزين باستخدام Cloud Run.
- عنوان URL لخدمة قائمة المتجر:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- التحقّق من عنوان URL لخدمة القائمة
echo $MENU_SERVICE_URL
مثال على الناتج
https://menu-service-g2mfphytdq-uk.a.run.app
7. اختبار الخدمة
- إنشاء عنصر قائمة جديد عن طريق إرسال طلب POST:
curl -X POST "${MENU_SERVICE_URL}/menu" \
-H 'Content-Type: application/json' \
-d '{
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.5,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 3,
"status": "Ready",
"tagLine": "Spicy touch for your taste buds!!"
}'
مثال على الناتج
{ "id": 16, "createDateTime": "2022-04-28T18:14:04.17225", "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80", "itemName": "Curry Plate", "itemPrice": 12.5, "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80", "spiceLevel": 3, "status": "Processing", "tagLine": "Spicy touch for your taste buds!!", "updateDateTime": "2022-04-28T18:14:04.172298" }
- تغيير حالة عنصر القائمة عن طريق إرسال طلب PUT:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
-H 'Content-Type: application/json' \
-d '{"status": "Ready"}'
مثال على الناتج
{ "id": 1, "createDateTime": "2022-04-28T17:21:02.369093", "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80", "itemName": "Curry Plate", "itemPrice": 12.50, "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80", "spiceLevel": 0, "status": "Ready", "tagLine": "Spicy touch for your taste buds!!", "updateDateTime": "2022-04-28T17:21:02.657636" }
8. تهانينا!
تهانينا، لقد أنهيت الدرس التطبيقي حول الترميز.
الخطوة التالية:
اطّلع على الدروس التطبيقية الأخرى حول الترميز في Cymbal Eats:
- تشغيل Cloud Workflows باستخدام Eventarc
- بدء معالجة الأحداث من Cloud Storage
- الاتصال بقواعد بيانات مُدارة بالكامل من خلال تشغيل السحابة الإلكترونية
- تطبيق آمن بدون خادم مع خادم وكيل يستخدم الهوية (IAP)
- تشغيل مهام تشغيل السحابة الإلكترونية باستخدام أداة جدولة المهام في السحابة الإلكترونية
- النشر الآمن إلى التشغيل في السحابة الإلكترونية
- تأمين الزيارات الواردة من تشغيل السحابة الإلكترونية
- الاتصال بـ AlloyDB الخاص من GKE Autopilot
تَنظيم
لتجنُّب تحمُّل الرسوم المفروضة على حسابك على Google Cloud مقابل الموارد المُستخدَمة في هذا الدليل التوجيهي، يمكنك إما حذف المشروع الذي يحتوي على الموارد أو الاحتفاظ بالمشروع وحذف الموارد الفردية.
حذف المشروع
أسهل طريقة لإزالة الفوترة هي حذف المشروع الذي أنشأته للبرنامج التعليمي.