عکس روزانه: آزمایشگاه 5 - پاکسازی پس از حذف تصویر

عکس روزانه:
آزمایشگاه 5 - پاکسازی پس از حذف تصویر

درباره این codelab

subjectآخرین به‌روزرسانی: اکتبر ۷, ۲۰۲۱
account_circleنویسنده: Mete Atamel

1. نمای کلی

در این آزمایشگاه کد، یک سرویس Cloud Run جدید، جمع‌آوری زباله تصویر، ایجاد می‌کنید که توسط Eventarc، یک سرویس جدید برای دریافت رویدادها در Cloud Run، راه‌اندازی می‌شود. هنگامی که یک عکس از سطل تصاویر حذف می شود، سرویس رویدادی را از Eventarc دریافت می کند. سپس، تصویر را از سطل ریز عکس ها حذف می کند و همچنین آن را از مجموعه تصاویر Firestore حذف می کند.

d93345bfc235f81e.png

چیزی که یاد خواهید گرفت

  • Cloud Run
  • فضای ذخیره سازی ابری
  • Cloud Firestore
  • رویدادارک

2. راه اندازی و الزامات

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

از کنسول GCP روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

bce75f34b2c53987.png

تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

f6ef2b5f13479f3a.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این آزمایشگاه به سادگی با یک مرورگر قابل انجام است.

3. مقدمه ای بر Eventarc

Eventarc اتصال سرویس های Cloud Run را با رویدادها از منابع مختلف آسان می کند. از انتقال رویداد، تحویل، امنیت، مجوز و رسیدگی به خطا برای شما مراقبت می کند.

776ed63706ca9683.png

می‌توانید رویدادها را از منابع 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 حذف کرده است.

519abf90e7ea4d12.png

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
  • رویدادارک