الاتصال بـ Private CloudSQL من خلال Cloud Run

1. نظرة عامة

سوف تنشئ في هذا التمرين المعملي خدمة قائمة Cymbal Eats وستعرض واجهات برمجة تطبيقات RESTful لإضافة عناصر القائمة وتحديثها وحذفها وإدراجها. ستنشئ قاعدة بيانات Cloud SQL كقاعدة بيانات خلفية لخدمة القائمة التي سيتم تشغيلها في Cloud Run. بما أنّ Cloud Run لا يتوفّر في شبكة VPC نفسها مثل قاعدة بيانات Cloud SQL، ستحتاج إلى ضبط موصِّل الوصول إلى VPC بدون خادم للسماح بتشغيل Cloud Run بالاتصال مع Cloud SQL من خلال عنوان IP خاص.

19c7b05f35789fda.png

ما سوف تتعلمه

ستتعلم في هذا التمرين المعملي كيفية القيام بما يلي:

  • ضبط شبكة VPC الخاصة
  • إنشاء قاعدة بيانات خاصة لخدمة Postgres Cloud SQL
  • ربط CloudRun بسحابة VPC خاصة
  • نشر خدمة على Cloud Run ترتبط بقاعدة بيانات Cloud SQL

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

إعداد البيئة

  1. إنشاء متغيرات بيئة ذات صلة بالمشروع والموارد
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
  1. استنساخ المستودع والانتقال إلى الدليل
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. تفعيل الخدمات
gcloud services enable \
    sqladmin.googleapis.com \
    run.googleapis.com \
    vpcaccess.googleapis.com \
    servicenetworking.googleapis.com

3- ضبط إعدادات الوصول الخاص

يتم توفير الوصول إلى الخدمات الخاصة كرابط تبادل المعلومات بين الشبكات في شبكة VPC بين شبكة VPC الأساسية وشبكة VPC الأساسية حيث يوجد مثيل Cloud SQL. يسمح الاتصال الخاص بمثيلات الأجهزة الافتراضية في شبكة VPC والخدمات التي تستخدمها للتواصل فقط من خلال عناوين IP الداخلية. للوصول إلى الخدمات المتاحة من خلال الوصول إلى الخدمات الخاصة، لا تتطلب مثيلات الأجهزة الافتراضية الاتصال بالإنترنت أو عناوين IP خارجية.

  1. تخصيص نطاق عنوان 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].
  1. إنشاء اتصال خاص
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.

219cb722c2dd1b82.png

ستنشئ قاعدة بيانات Postgres Cloud SQL باستخدام عنوان IP خاص.

إنشاء قاعدة بيانات ومستخدم

  1. إنشاء مثيل 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
  1. إضافة قاعدة بيانات إلى مثيل قاعدة البيانات
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

مثال على الناتج

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. إنشاء مستخدم SQL
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

مثال على الناتج

Created user [menu-user].
  1. تخزين عنوان IP لقاعدة البيانات
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. إضافة دور "عميل 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.

19c7b05f35789fda.png

  1. أنشِئ موصِّلاً للوصول إلى 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.

  1. تجميع التطبيق باستخدام maven
./mvnw package -DskipTests

مثال على الناتج

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. إنشاء صورة 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
  1. إرسال صورة 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
  1. نشر خدمة القائمة:
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.

  1. عنوان URL لخدمة قائمة المتجر:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. التحقّق من عنوان URL لخدمة القائمة
echo $MENU_SERVICE_URL

مثال على الناتج

https://menu-service-g2mfphytdq-uk.a.run.app

7. اختبار الخدمة

  1. إنشاء عنصر قائمة جديد عن طريق إرسال طلب 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"
}
  1. تغيير حالة عنصر القائمة عن طريق إرسال طلب 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:

تَنظيم

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

حذف المشروع

أسهل طريقة لإزالة الفوترة هي حذف المشروع الذي أنشأته للبرنامج التعليمي.