درباره این codelab
1. نمای کلی
در این آزمایشگاه کد، یک سرویس Cloud Run جدید، جمعآوری زباله تصویر، ایجاد میکنید که توسط Eventarc، یک سرویس جدید برای دریافت رویدادها در Cloud Run، راهاندازی میشود. هنگامی که یک عکس از سطل تصاویر حذف می شود، سرویس رویدادی را از Eventarc دریافت می کند. سپس، تصویر را از سطل ریز عکس ها حذف می کند و همچنین آن را از مجموعه تصاویر Firestore حذف می کند.
چیزی که یاد خواهید گرفت
- Cloud Run
- فضای ذخیره سازی ابری
- Cloud Firestore
- رویدادارک
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود و می توانید هر زمان که بخواهید آن را به روز کنید.
- شناسه پروژه باید در تمام پروژههای Google Cloud منحصربهفرد باشد و تغییرناپذیر باشد (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (و معمولاً به عنوان
PROJECT_ID
شناخته میشود)، بنابراین اگر آن را دوست ندارید، یک نمونه تصادفی دیگر ایجاد کنید، یا میتوانید شناسه پروژه را امتحان کنید و ببینید در دسترس است. سپس پس از ایجاد پروژه "یخ زده" می شود. - یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها، باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. برای اینکه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید، دستورالعملهای «پاکسازی» را که در انتهای Codelab یافت میشود دنبال کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
از کنسول GCP روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:
تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این آزمایشگاه به سادگی با یک مرورگر قابل انجام است.
3. مقدمه ای بر Eventarc
Eventarc اتصال سرویس های Cloud Run را با رویدادها از منابع مختلف آسان می کند. از انتقال رویداد، تحویل، امنیت، مجوز و رسیدگی به خطا برای شما مراقبت می کند.
میتوانید رویدادها را از منابع Google Cloud و برنامههای سفارشی منتشر شده در Cloud Pub/Sub ترسیم کنید و آنها را به سینکهای Google Cloud Run تحویل دهید.
رویدادها از وسعت منابع Google Cloud از طریق گزارشهای حسابرسی ابری ارائه میشوند. تأخیر و در دسترس بودن تحویل رویداد از این منابع به گزارشهای حسابرسی ابری مرتبط است. هر زمان که رویدادی از منبع Google Cloud فعال شود، یک ورودی گزارش حسابرسی ابری مربوطه ایجاد میشود.
برنامههای کاربردی سفارشی که در Cloud Pub/Sub منتشر میشوند میتوانند پیامها را در یک موضوع Pub/Sub که مشخص میکنند در هر قالبی منتشر کنند.
محرکهای رویداد مکانیزم فیلترینگ برای تعیین رویدادهایی هستند که به کدام سینک تحویل داده شوند.
همه رویدادها در قالب CloudEvents v1.0 برای قابلیت همکاری متقابل سرویس ارائه می شوند.
4. قبل از شروع
API ها را فعال کنید
برای راه اندازی سرویس Cloud Run به سرویس Eventarc نیاز دارید. مطمئن شوید که فعال است:
gcloud services enable eventarc.googleapis.com
برای اتمام موفقیت آمیز باید عملیات را مشاهده کنید:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
حساب های سرویس را پیکربندی کنید
حساب سرویس محاسباتی پیشفرض در تریگرها استفاده خواهد شد. نقش eventarc.eventReceiver
را به حساب سرویس محاسباتی پیشفرض اعطا کنید:
PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)') gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role roles/eventarc.eventReceiver
نقش pubsub.publisher
را به حساب سرویس Cloud Storage اعطا کنید. این مورد برای راهاندازی Eventarc Cloud Storage لازم است:
SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER) gcloud projects add-iam-policy-binding $PROJECT_NUMBER \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/pubsub.publisher
اگر حساب سرویس Pub/Sub را در تاریخ 8 آوریل 2021 یا قبل از آن فعال کردهاید، نقش iam.serviceAccountTokenCreator
را به حساب سرویس Pub/Sub اعطا کنید:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role roles/iam.serviceAccountTokenCreator
5. کد را کلون کنید
اگر قبلاً در آزمایشگاه کد قبلی نبوده اید، کد را شبیه سازی کنید:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
سپس می توانید به دایرکتوری حاوی سرویس بروید:
cd serverless-photosharing-workshop/services/garbage-collector/nodejs
شما طرح بندی فایل زیر را برای سرویس خواهید داشت:
services | ├── garbage-collector | ├── nodejs | ├── index.js ├── package.json
در داخل پوشه، شما 3 فایل دارید:
-
index.js
حاوی کد Node.js است -
package.json
وابستگی های کتابخانه را تعریف می کند
6. کد را کاوش کنید
وابستگی ها
فایل package.json
وابستگی های کتابخانه مورد نیاز را تعریف می کند:
{
"name": "garbage_collector_service",
"version": "0.0.1",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"cloudevents": "^4.0.1",
"express": "^4.17.1",
"@google/events": "^3.1.0",
"@google-cloud/firestore": "^4.9.9",
"@google-cloud/storage": "^5.8.3"
}
}
ما برای حذف تصاویر در فضای ذخیره سازی ابری به کتابخانه Cloud Storage وابسته هستیم. ما یک وابستگی به Cloud Firestore اعلام میکنیم تا ابردادههای تصویری که قبلاً ذخیره کردهایم را نیز حذف کنیم. علاوه بر این، برای خواندن CloudEvents ارسال شده توسط Eventarc به کتابخانههای CloudEvents SDK و Google Events وابسته هستیم. Express یک چارچوب وب جاوا اسکریپت / Node است. Bluebird برای رسیدگی به وعده ها استفاده می شود.
index.js
بیایید نگاهی دقیق تر به کد index.js
خود داشته باشیم:
const express = require('express');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const { HTTP } = require("cloudevents");
const {toStorageObjectData} = require('@google/events/cloud/storage/v1/StorageObjectData');
ما به وابستگی های مختلف مورد نیاز برای اجرای برنامه خود نیاز داریم: Express چارچوب وب Node است که از آن استفاده خواهیم کرد، Bluebird کتابخانه ای برای مدیریت وعده های جاوا اسکریپت است، Storage و Firestore به ترتیب برای کار با Google Cloud Storage (سطل های تصاویر ما) هستند. و Cloud Firestore datastore. علاوه بر این، ما به CloudEvent نیاز داریم که CloudEvent ارسال شده توسط Eventarc StoreObjectData از کتابخانه Google Events را بخواند تا بدنه رویداد Cloud Storage CloudEvent را بخواند.
const app = express();
app.use(express.json());
app.post('/', async (req, res) => {
try {
const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body });
console.log(cloudEvent);
/* ... */
} catch (err) {
console.log(`Error: ${err}`);
res.status(500).send(err);
}
});
در بالا، ساختار Node handler خود را داریم: برنامه ما به درخواستهای HTTP POST پاسخ میدهد. CloudEvent را از درخواست HTTP می خواند و در صورتی که مشکلی پیش بیاید، کمی خطاها را مدیریت می کنیم. حال بیایید نگاهی به آنچه در داخل این ساختار وجود دارد بیاندازیم.
مرحله بعدی بازیابی و تجزیه بدنه CloudEvent و بازیابی نام شی است:
const storageObjectData = toStorageObjectData(cloudEvent.data);
console.log(storageObjectData);
const objectName = storageObjectData.name;
هنگامی که نام تصویر را دانستیم، می توانیم آن را از سطل ریز عکسها حذف کنیم:
try {
await storage.bucket(bucketThumbnails).file(objectName).delete();
console.log(`Deleted '${objectName}' from bucket '${bucketThumbnails}'.`);
}
catch(err) {
console.log(`Failed to delete '${objectName}' from bucket '${bucketThumbnails}': ${err}.`);
}
به عنوان آخرین مرحله، فراداده تصویر را نیز از مجموعه Firestore حذف کنید:
try {
const pictureStore = new Firestore().collection('pictures');
const docRef = pictureStore.doc(objectName);
await docRef.delete();
console.log(`Deleted '${objectName}' from Firestore collection 'pictures'`);
}
catch(err) {
console.log(`Failed to delete '${objectName}' from Firestore: ${err}.`);
}
res.status(200).send(`Processed '${objectName}'.`);
اکنون زمان آن است که اسکریپت Node خود را به درخواست های دریافتی گوش دهد. همچنین بررسی کنید که متغیرهای محیطی مورد نیاز تنظیم شده باشند:
app.listen(PORT, () => {
if (!bucketThumbnails) throw new Error("BUCKET_THUMBNAILS not set");
console.log(`Started service on port ${PORT}`);
});
7. به صورت محلی تست کنید
کد را به صورت محلی تست کنید تا مطمئن شوید قبل از استقرار در فضای ابری کار می کند.
در پوشه garbage-collector/nodejs
، وابستگیهای npm را نصب کرده و سرور را راهاندازی کنید:
export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT npm install; npm start
اگر همه چیز خوب پیش رفت، باید سرور را روی پورت 8080 راه اندازی کند:
Started service on port 8080
برای خروج از CTRL-C
استفاده کنید.
8. ساخت و استقرار در Cloud Run
قبل از استقرار در Cloud Run، منطقه Cloud Run را روی یکی از مناطق پشتیبانی شده و پلتفرم برای managed
تنظیم کنید:
REGION=europe-west1 gcloud config set run/region $REGION gcloud config set run/platform managed
می توانید بررسی کنید که پیکربندی تنظیم شده است:
gcloud config list ... [run] platform = managed region = europe-west1
به جای ساختن و انتشار تصویر کانتینر با استفاده از Cloud Build به صورت دستی، میتوانید برای ساختن تصویر کانتینر با استفاده از Google Cloud Buildpacks به Cloud Run نیز تکیه کنید.
دستور زیر را برای ساخت تصویر کانتینر با استفاده از Google Cloud Buildpacks اجرا کنید و سپس تصویر کانتینر را در Cloud Run اجرا کنید:
SERVICE_NAME=garbage-collector-service gcloud run deploy $SERVICE_NAME \ --source . \ --no-allow-unauthenticated \ --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS
به پرچم –-source
توجه کنید. این Cloud Run را برای استفاده از Google Cloud Buildpacks برای ساخت تصویر کانتینر بدون Dockerfile.
پرچم --no-allow-unauthenticated
سرویس Cloud Run را به یک سرویس داخلی تبدیل می کند که فقط توسط حساب های سرویس خاص راه اندازی می شود. بعداً، یک Trigger با حساب سرویس محاسباتی پیشفرض ایجاد میکنید که نقش run.invoker
برای فراخوانی خدمات داخلی Cloud Run را دارد.
9. یک ماشه ایجاد کنید
در Eventarc، یک Trigger تعریف می کند که چه سرویسی باید چه نوع رویدادهایی را دریافت کند. در این حالت، شما می خواهید که سرویس هنگام حذف یک فایل در یک سطل، رویدادها را دریافت کند.
محل تریگر را در همان منطقه ای که سطل تصاویر آپلود شده قرار دارد، تنظیم کنید:
gcloud config set eventarc/location eu
ایجاد یک ماشه AuditLog برای فیلتر کردن رویدادهای storage.objects.delete
و ارسال به سرویس Cloud Run:
BUCKET_IMAGES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT gcloud eventarc triggers create trigger-$SERVICE_NAME \ --destination-run-service=$SERVICE_NAME \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.storage.object.v1.deleted" \ --event-filters="bucket=$BUCKET_IMAGES" \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
با این دستور می توانید دوباره بررسی کنید که Trigger ایجاد شده است:
gcloud eventarc triggers list
10. سرویس را تست کنید
برای آزمایش اینکه آیا سرویس کار می کند، به سطل uploaded-pictures
بروید و یکی از تصاویر را حذف کنید. باید در گزارش های سرویس مشاهده کنید که تصویر مربوطه را در سطل thumbnails
حذف کرده و همچنین سند خود را از مجموعه pictures
Firestore حذف کرده است.
11. تمیز کردن (اختیاری)
اگر قصد ندارید با دیگر آزمایشگاههای این سری ادامه دهید، میتوانید منابع را پاکسازی کنید تا در هزینهها صرفهجویی کنید و در کل شهروند ابری خوبی باشید. می توانید منابع را به صورت جداگانه به صورت زیر پاک کنید.
سرویس را حذف کنید:
gcloud run services delete $SERVICE_NAME -q
تریگر Eventarc را حذف کنید:
gcloud eventarc triggers delete trigger-$SERVICE_NAME -q
یا می توانید کل پروژه را حذف کنید:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
12. تبریک می گویم!
تبریک می گویم! شما یک سرویس Cloud Run ایجاد کردید، جمع آوری زباله تصویر، که توسط Eventarc، یک سرویس جدید برای دریافت رویدادها در Cloud Run، راه اندازی می شود. هنگامی که یک عکس از سطل تصاویر حذف می شود، سرویس رویدادی را از Eventarc دریافت می کند. سپس، تصویر را از سطل ریز عکس ها حذف می کند و همچنین آن را از مجموعه تصاویر Firestore حذف می کند.
آنچه را پوشش داده ایم
- Cloud Run
- فضای ذخیره سازی ابری
- Cloud Firestore
- رویدادارک