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

1. بررسی اجمالی

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

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

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. شما می توانید آن را در هر زمان به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (معمولاً به عنوان PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول 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 شما و شبکه زیربنایی Google Cloud VPC که نمونه Cloud SQL شما در آن قرار دارد، ارائه می‌شود. اتصال خصوصی به نمونه های VM در شبکه VPC شما و سرویس هایی که استفاده می کنید اجازه می دهد تا فقط از طریق آدرس های IP داخلی با هم ارتباط برقرار کنند. برای دسترسی به خدماتی که از طریق دسترسی به سرویس‌های خصوصی در دسترس هستند، نمونه‌های VM نیازی به اتصال اینترنت یا آدرس‌های 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 توسط یک ماشین مجازی (VM) که روی سرور میزبان Google Cloud اجرا می‌شود، پشتیبانی می‌شود. گزینه دسترسی بالا همچنین شامل یک VM آماده به کار در منطقه دیگری با تنظیمات مشابه ماشین مجازی اولیه است. پایگاه داده روی یک دستگاه ذخیره‌سازی شبکه مقیاس‌پذیر و بادوام به نام دیسک پایدار نگهداری می‌شود که به VM متصل است. یک آدرس 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].
[...]

5. VPC بدون سرور

دسترسی VPC بدون سرور به شما امکان می دهد از محیط های بدون سرور مانند Cloud Run، App Engine یا Cloud Function ها مستقیماً به شبکه 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].

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

شما یک تصویر 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 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

گوگل توصیه می کند که از Secret Manager برای ذخیره اطلاعات حساس مانند اعتبارنامه 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 خود برای منابع استفاده شده در این آموزش، یا پروژه حاوی منابع را حذف کنید یا پروژه را نگه دارید و منابع فردی را حذف کنید.

حذف پروژه

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