1. بررسی اجمالی
در این آزمایشگاه، نحوه استفاده از رویدادهای سطل ذخیرهسازی ابری و رویدادهای Eventarc را برای راهاندازی پردازش رویداد یاد خواهید گرفت. شما از توابع ابری (نسل دوم) برای تجزیه و تحلیل داده ها و پردازش تصاویر استفاده خواهید کرد. این تابع از Vision API گوگل استفاده می کند و تصویر حاصل را در سطل ذخیره سازی ابری ذخیره می کند.
آنچه خواهید آموخت
چگونه یک خط لوله پردازش تصویر بسازیم.
- سطل های ذخیره سازی را پیکربندی کنید
- برای خواندن و نوشتن اشیاء در Cloud Storage یک تابع ابری ایجاد کنید
- Vision API را برای تشخیص تصاویر غذا یکپارچه کنید
- استقرار یک تابع ابری
- یک تریگر Eventarc را مستقر کنید
- راه حل انتها به انتها را آزمایش و تأیید کنید
پیش نیازها
- این آزمایشگاه آشنایی با کنسول Cloud و محیط های پوسته را فرض می کند.
- تجربه قبلی Cloud Storage، Cloud Functions یا Vision API مفید است اما لازم نیست.
2. راه اندازی و الزامات
راه اندازی پروژه ابری
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. شما می توانید آن را در هر زمان به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (معمولاً به عنوان
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. برای اینکه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید، می توانید منابعی را که ایجاد کرده اید حذف کنید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را فعال کنید
Cloud Shell را با کلیک بر روی نماد سمت راست نوار جستجو فعال کنید.
راه اندازی محیط
- با اجرای دستورات زیر در ترمینال Cloud Shell یک پروژه و متغیرهای محیطی مرتبط با منابع ایجاد کنید.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NAME=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export UPLOAD_BUCKET=gs://menu-item-uploads-$PROJECT_ID
export BUCKET_THUMBNAILS=gs://menu-item-thumbnails-$PROJECT_ID
export MENU_SERVICE_NAME=menu-service
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
- API های مورد نیاز برای آزمایشگاه را فعال کنید
gcloud services enable \
vision.googleapis.com \
cloudfunctions.googleapis.com \
pubsub.googleapis.com \
cloudbuild.googleapis.com \
logging.googleapis.com \
eventarc.googleapis.com \
artifactregistry.googleapis.com \
run.googleapis.com \
--quiet
- API های مورد نیاز برای آزمایشگاه را فعال کنید. (مرحله خاص Qwiklabs)
gcloud services disable cloudfunctions.googleapis.com
gcloud services enable cloudfunctions.googleapis.com
- مخزن را شبیه سازی کنید
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/cloud-functions
3. سطل های Cloud Storage را پیکربندی کنید
ایجاد سطل های ذخیره سازی
برای خط لوله پردازش تصویر خود، سطل های ذخیره سازی ابری آپلود و تصاویر کوچک ایجاد کنید.
از دستور gsutil mb و یک نام منحصر به فرد برای ایجاد دو سطل استفاده کنید:
- سطلی را بارگذاری کنید که در آن ابتدا تصاویر بارگذاری می شوند
- سطل ریز عکسها برای ذخیره تصاویر کوچک تولید شده
یک سطل برای آپلود تصاویر جدید ایجاد کنید:
gsutil mb -p $PROJECT_ID -l $REGION $UPLOAD_BUCKET
خروجی نمونه:
Creating gs://menu-item-uploads-cymbal-eats-8399-3119/...
یک سطل برای ذخیره تصاویر کوچک تولید شده ایجاد کنید:
gsutil mb -p $PROJECT_ID -l $REGION $BUCKET_THUMBNAILS
خروجی نمونه:
Creating gs://menu-item-thumbnails-cymbal-eats-8399-3119/...
مجوزهای Bucket را به روز کنید
مجوزهای سطل ذخیره سازی را به روز کنید تا اجازه خواندن به کاربران داده شود.
از دستور gsutil iam ch برای اجازه خواندن و نوشتن اشیاء در سطل خود استفاده کنید:
gsutil iam ch allUsers:objectViewer $UPLOAD_BUCKET
gsutil iam ch allUsers:objectViewer $BUCKET_THUMBNAILS
خروجی نمونه
Updated IAM policy for project [cymbal-eats-8399-3119]. [...]
4. حساب های سرویس را پیکربندی کنید
برای پردازش تصاویر کوچک، یک حساب سرویس سفارشی برای Cloud Function ایجاد کنید:
export CF_SERVICE_ACCOUNT=thumbnail-service-sa
gcloud iam service-accounts create ${CF_SERVICE_ACCOUNT}
اعطای نقش artifactregistry.reader
برای اجازه دادن به عملیات خواندن از Artifact Registry:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role "roles/artifactregistry.reader"
نقش storage.objectCreator
را اعطا کنید تا امکان ذخیره تصاویر تولید شده در سطل تصویر کوچک فراهم شود:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role "roles/storage.objectCreator"
نقش run.invoker
را اعطا کنید تا فراخوانی سرویس Cloud Run مجاز باشد:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role "roles/run.invoker"
نقش eventarc.eventReceiver
را اعطا کنید تا امکان دریافت رویدادها از ارائه دهندگان را فراهم کند:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role "roles/eventarc.eventReceiver"
نقش pubsub.publisher
را به حساب سرویس Cloud Storage اعطا کنید. این به حساب سرویس اجازه می دهد تا هنگام بارگذاری تصاویر در سطل، رویدادها را منتشر کند.
GCS_SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)
gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
--member "serviceAccount:$GCS_SERVICE_ACCOUNT" \
--role "roles/pubsub.publisher"
5. بررسی اجمالی عملکرد پردازش تصویر
یک تابع برای دانلود یک تصویر از Cloud Storage، تغییر اندازه تصویر و آپلود مجدد تصویر به Cloud Storage ایجاد کنید. این تابع Vision API را فراخوانی می کند تا یک برچسب توضیحات به تصویر اختصاص دهد. تابع برچسب توضیحات را بررسی می کند. اگر برچسب تصویر را به عنوان "غذا" شناسایی کند، رویدادی به سرویس منو ارسال می شود تا تصویر و تصویر کوچک آیتم منو را به روز کند.
راه اندازی یک تابع
عملکردهای Cloud Storage بر اساس اعلانهای Pub/Sub از Cloud Storage هستند و از انواع رویدادهای مشابه پشتیبانی میکنند:
در این آزمایشگاه، زمانی که یک شی در Cloud Storage نهایی شد، یک تابع را مستقر و راهاندازی میکنید.
Object Finalize
هنگامی که "نوشتن" یک شی ذخیرهسازی ابری با موفقیت نهایی شود، رویدادهای نهاییسازی شی فعال میشوند. به طور خاص، این بدان معنی است که ایجاد یک شی جدید یا بازنویسی یک شیء موجود باعث ایجاد این رویداد می شود. عملیات بهروزرسانی بایگانی و فراداده توسط این راهانداز نادیده گرفته میشود.
6. یکپارچه سازی فضای ذخیره سازی ابری
Cloud Storage سرویسی برای ذخیره اشیاء شما در Google Cloud است. یک شی یک قطعه داده غیرقابل تغییر است که از یک فایل با هر فرمتی تشکیل شده است. شما اشیاء را در ظرف هایی به نام سطل ذخیره می کنید. همه سطل ها با یک پروژه مرتبط هستند و می توانید پروژه های خود را تحت یک سازمان گروه بندی کنید. کتابخانه های سرویس گیرنده و API ها با Cloud Storage یکپارچه می شوند
در این آزمایشگاه، از کتابخانه مشتری برای خواندن و نوشتن اشیاء در فضای ذخیره سازی ابری استفاده خواهید کرد.
نصب کتابخانه مشتری
کتابخانه های سرویس گیرنده ابری در بسیاری از زبان های برنامه نویسی محبوب در دسترس هستند. برای شروع استفاده از کتابخانه ها باید کتابخانه مشتری را نصب کنید.
استفاده از کتابخانه مشتری
جزئیات پیاده سازی در کل به زبان برنامه نویسی بستگی دارد. برای استفاده از کتابخانه کلاینت در برنامه خود، اولین قدم وارد کردن وابستگیهای Cloud Storage است. به عنوان مثال، در پروژه Node.js، واردات در فایل package.json اضافه می شود. قطعه زیر اطلاعیه فایل package.json این آزمایشگاه را نشان می دهد.
package.json
{ "name": "thumbnail-service", "version": "0.1.0", "dependencies": { "@google-cloud/functions-framework": "^3.0.0", "@google-cloud/storage": "^5.18.2", "@google-cloud/vision": "^2.4.2", ... } }
یک پاسخ تماس CloudEvent را ثبت کنید
یک پاسخ تماس CloudEvent را با Functions Framework ثبت کنید که وقتی یک تصویر جدید در سطل آپلود می شود توسط Cloud Storage فعال می شود.
index.js
functions.cloudEvent('process-thumbnails', async (cloudEvent) => { console.log(`Event ID: ${cloudEvent.id}`); console.log(`Event Type: ${cloudEvent.type}`); ...
ایجاد یک شی مرجع ذخیره سازی
پس از وارد شدن کتابخانه های سرویس گیرنده، باید یک سرویس گیرنده ذخیره سازی جدید و سطل هایی ایجاد کنید که برنامه شما با آنها تعامل دارد.
index.js
const storage = new Storage(); const bucket = storage.bucket(file.bucket); const thumbBucket = storage.bucket(process.env.BUCKET_THUMBNAILS);
دانلود اشیاء Cloud Storage
index.js
await bucket.file(file.name).download({ destination: originalFile });
اشیاء را در فضای ذخیره سازی ابری بارگذاری کنید
میتوانید درخواستهای آپلود را به سه روش به Cloud Storage ارسال کنید: یک درخواست، قابل ازسرگیری یا آپلود چند قسمتی XML API. برای آپلودهای بزرگتر یا آپلودهای جریانی، از آپلودهای قابل ازسرگیری استفاده کنید. با XML API فایل ها به صورت قطعات آپلود شده و به عنوان یک شی واحد مونتاژ می شوند. برای اشیاء کوچکتر، از آپلودهای تک درخواستی استفاده کنید.
کد زیر با استفاده از آپلود تک درخواستی، تصویری را در فضای ذخیرهسازی ابری آپلود میکند.
index.js
const thumbnailImage = await thumbBucket.upload(thumbFile);
7. Vision API را یکپارچه کنید
Cloud Vision به توسعه دهندگان اجازه می دهد تا به راحتی ویژگی های تشخیص بینایی را در برنامه ها ادغام کنند، از جمله برچسب گذاری تصویر، تشخیص چهره و نقطه عطف، تشخیص نوری کاراکتر (OCR)، و برچسب گذاری محتوای صریح.
نصب کتابخانه مشتری
کتابخانه های سرویس گیرنده ابری در بسیاری از زبان های برنامه نویسی محبوب در دسترس هستند. برای شروع استفاده از کتابخانه ها باید کتابخانه مشتری را نصب کنید.
یک Image Annotator Client ایجاد کنید
برای دسترسی به APIهای Google با استفاده از SDKهای مشتری رسمی، یک شیء سرویس را بر اساس سند کشف API ایجاد می کنید که API را به SDK توصیف می کند. باید آن را از سرویس اکتشاف Vision API و با استفاده از اطلاعات کاربری خود دریافت کنید.
index.js
const client = new vision.ImageAnnotatorClient();
یک درخواست Vision API بسازید
Vision API می تواند با ارسال محتویات فایل تصویری به عنوان یک رشته کدگذاری شده base64 در بدنه درخواست شما، تشخیص ویژگی را روی یک فایل تصویری انجام دهد.
برای ایجاد یک درخواست با استفاده از منبع تصاویر برای حاشیه نویسی تصویر خود. درخواست به این API به شکل یک شی با لیست درخواست ها است. هر مورد در این لیست حاوی دو بیت اطلاعات است:
- داده های تصویر کدگذاری شده با base64
- فهرستی از ویژگی هایی که می خواهید درباره آن تصویر حاشیه نویسی کنید.
index.js
const client = new vision.ImageAnnotatorClient(); const visionRequest = { image: { source: { imageUri: `gs://${file.bucket}/${file.name}` } }, features: [ { type: 'LABEL_DETECTION' }, ] }; const visionPromise = client.annotateImage(visionRequest);
8. استقرار عملکرد ابر
این سرویس تغییر اندازه تصویر بخشی از سیستم بزرگتر Cymbal Eats است. در این بخش، شما فقط اجزای مربوط به ویژگی پردازش تصویر را مستقر خواهید کرد. نصب کامل شامل یک رابط کاربری برای آپلود تصویر و یک درخواست پایین دستی برای ذخیره ابرداده به دست آمده است. این قابلیت ها به عنوان بخشی از این آزمایشگاه نصب نشده اند.
اجزای زیر در حین استقرار تابع ایجاد خواهند شد:
- عملکرد ابر
- سرویس Cloud Run
- ماشه Eventarc
- موضوع Pub/Sub و اشتراک
در ترمینال پوسته ابری، دستور زیر را برای استقرار Cloud Function با یک سطل ماشه در menu-item-uploads-$PROJECT_ID
اجرا کنید:
gcloud functions deploy process-thumbnails \
--gen2 \
--runtime=nodejs16 \
--source=thumbnail \
--region=$REGION \
--project=$PROJECT_ID \
--entry-point=process-thumbnails \
--trigger-bucket=$UPLOAD_BUCKET \
--service-account="${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--set-env-vars=BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS,MENU_SERVICE_URL=$MENU_SERVICE_URL \
--max-instances=1 \
--quiet
اگر استقرار به دلیل مشکل مجوز در سطل ذخیرهسازی آپلود انجام نشد - لطفاً منتظر انتشار تغییرات IAM نسبت به مرحله قبل باشید. معمولاً 1-2 دقیقه طول می کشد و سپس دوباره استقرار را امتحان کنید.
خروجی نمونه
Deploying function (may take a while - up to 2 minutes)...done. [...]
در کنسول Cloud، بررسی ایجاد شده Cloud Function :
در کنسول Cloud، سرویس Cloud Run را که برای عملکرد ایجاد شده است، مرور کنید:
در کنسول Cloud، ماشه Eventarc را که برای عملکرد ایجاد شده است، مرور کنید:
در کنسول Cloud، موضوع Pub/Sub و اشتراکی که برای راهانداز Eventarc ایجاد شدهاند را مرور کنید:
9. راه حل انتها به انتها را آزمایش و تأیید کنید
یک عکس جدید در Cloud Storage آپلود کنید و پیشرفت خط لوله را همزمان با تجزیه و تحلیل تصاویر نظارت کنید. شما راه حل انتها به انتها را با نظارت بر گزارش های توابع ابری آزمایش خواهید کرد.
آپلود تصویر مناسب
- این تصویر را در دستگاه محلی خود ذخیره کنید
- تغییر نام فایل 1.jpg
- کنسول Cloud Storage را باز کنید
- روی سطل menu-item-uploads-... کلیک کنید
- روی UPLOAD FILES کلیک کنید
- 1.jpg را در سطل ذخیره سازی آپلود کنید
- در Cloud Console، به Cloud Functions بروید
- روی process-thumbails کلیک کنید
- روی تب LOGS کلیک کنید
- به سطل ذخیرهسازی ابری- $PROJECT_ID-menu-item-thumbnails بروید
- بررسی کنید که تصویر بند انگشتی در سطل ریز عکسها ایجاد شده باشد
بارگذاری یک تصویر غیر خوراکی
برای تأیید اینکه عملکرد به درستی کار میکند، تصویری را آپلود میکنید که حاوی شیای نیست که بهعنوان آیتم «غذا» طبقهبندی شود.
- این تصویر را در دستگاه محلی خود ذخیره کنید
- تغییر نام فایل 2.jpg
- کنسول Cloud Storage را باز کنید
- روی سطل menu-item-uploads-... کلیک کنید
- روی UPLOAD FILES کلیک کنید
- 2.jpg را در سطل ذخیره سازی آپلود کنید
- در Cloud Console، به Cloud Functions بروید
- روی process-thumbails کلیک کنید
- روی تب LOGS کلیک کنید
10. تبریک می گویم!
تبریک می گویم، شما آزمایشگاه را تمام کردید!
بعدش چیه:
سایر کدهای Cymbal Eats را کاوش کنید:
- راهاندازی گردشهای کاری ابری با Eventarc
- اتصال به Private CloudSQL از Cloud Run
- اتصال به پایگاه های داده کاملاً مدیریت شده از Cloud Run
- برنامه امن بدون سرور با پروکسی آگاه از هویت (IAP)
- راه اندازی Cloud Run Jobs با Cloud Scheduler
- استقرار ایمن در Cloud Run
- ایمن سازی ترافیک ورودی در اجرای ابر
- اتصال به AlloyDB خصوصی از GKE Autopilot
تمیز کردن
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش، یا پروژه حاوی منابع را حذف کنید یا پروژه را نگه دارید و منابع فردی را حذف کنید.
حذف پروژه
ساده ترین راه برای حذف صورتحساب، حذف پروژه ای است که برای آموزش ایجاد کرده اید.