اتصال به Private CloudSQL از Cloud Run

۱. مرور کلی

در این آزمایش، شما سرویس منوی Cymbal Eats را ایجاد خواهید کرد و APIهای RESTful را برای افزودن، به‌روزرسانی، حذف و فهرست کردن آیتم‌های منو در اختیار خواهید داشت. شما یک پایگاه داده Cloud SQL به عنوان پایگاه داده backend برای سرویس منو ایجاد خواهید کرد که در Cloud Run اجرا خواهد شد. از آنجا که Cloud Run در همان VPC که پایگاه داده Cloud SQL در آن قرار دارد، قرار ندارد، باید یک رابط Serverless VPC Access را پیکربندی کنید تا به Cloud Run اجازه دهد از طریق یک آدرس IP خصوصی با Cloud SQL ارتباط برقرار کند.

19c7b05f35789fda.png

آنچه یاد خواهید گرفت

در این آزمایشگاه، شما یاد خواهید گرفت که چگونه موارد زیر را انجام دهید:

  • پیکربندی شبکه خصوصی VPC
  • ایجاد پایگاه داده خصوصی Postgres Cloud SQL
  • اتصال CloudRun به VPC خصوصی
  • یک سرویس روی Cloud Run مستقر کنید که به پایگاه داده Cloud SQL متصل شود

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (که معمولاً با عنوان PROJECT_ID شناخته می‌شود). اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند.
  • برای اطلاع شما، یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، می‌توانید منابعی را که ایجاد کرده‌اید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

تنظیمات محیط

  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

۳. پیکربندی دسترسی خصوصی

دسترسی به سرویس‌های خصوصی به عنوان یک لینک همتاسازی VPC بین شبکه VPC شما و شبکه Google Cloud 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.

۴. راه‌اندازی کلود اس‌کیو‌ال

Cloud SQL یک سرویس پایگاه داده کاملاً مدیریت‌شده است که راه‌اندازی، نگهداری، مدیریت و اداره پایگاه‌های داده رابطه‌ای PostgreSQL و MySQL شما را در فضای ابری ساده می‌کند. هر نمونه Cloud SQL توسط یک ماشین مجازی (VM) که روی یک سرور میزبان 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 Client را به حساب سرویس 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].
[...]

۵. VPC بدون سرور

دسترسی VPC بدون سرور به شما این امکان را می‌دهد که مستقیماً از محیط‌های بدون سرور مانند Cloud Run، App Engine یا Cloud Functions به شبکه Virtual Private Cloud خود متصل شوید. پیکربندی دسترسی VPC بدون سرور به محیط بدون سرور شما اجازه می‌دهد تا با استفاده از DNS داخلی و آدرس‌های IP داخلی (مطابق تعریف RFC 1918 و RFC 6598) درخواست‌هایی را به شبکه VPC شما ارسال کند. پاسخ به این درخواست‌ها نیز از شبکه داخلی شما استفاده می‌کند.

شما یک رابط دسترسی 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].

۶. استقرار در Cloud Run

شما یک ایمیج داکر را ساخته و در Cloud Run مستقر خواهید کرد و Cloud Run را به کانکتور Serverless 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 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 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

گوگل توصیه می‌کند که برای ذخیره اطلاعات حساس مانند اعتبارنامه‌های SQL از Secret Manager استفاده کنید. می‌توانید اطلاعات محرمانه را به عنوان متغیرهای محیطی ارسال کنید یا با Cloud Run به عنوان یک Volume مانت کنید .

  1. آدرس اینترنتی سرویس منوی فروشگاه:
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

۷. آزمایش سرویس

  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"
}

۸. تبریک می‌گویم!

تبریک می‌گویم، شما codelab را تمام کردید!

قدم بعدی چیست؟

سایر آزمایشگاه‌های کد Cymbal Eats را کاوش کنید:

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب گوگل کلود خود برای منابع استفاده شده در این آموزش، یا پروژه‌ای که شامل منابع است را حذف کنید، یا پروژه را نگه دارید و منابع تکی را حذف کنید.

حذف پروژه

ساده‌ترین راه برای حذف هزینه‌ها، حذف پروژه‌ای است که برای آموزش ایجاد کرده‌اید.