۱. مقدمه



Eventarc اتصال سرویسهای Cloud Run را با رویدادهایی از منابع مختلف آسان میکند. این به شما امکان میدهد معماریهای رویدادمحور بسازید که در آنها میکروسرویسها به صورت آزادانه متصل و توزیع شدهاند. Eventarc دریافت، تحویل، امنیت، مجوزدهی و مدیریت خطا را برای شما انجام میدهد.
گردشهای کاری یک پلتفرم هماهنگسازی کاملاً مدیریتشده است که سرویسها را به ترتیبی که شما تعریف میکنید اجرا میکند: یک گردش کار. این گردشهای کاری میتوانند سرویسهای میزبانیشده در Cloud Run یا Cloud Functions، سرویسهای Google Cloud مانند Cloud Vision AI و BigQuery و هر API مبتنی بر HTTP را ترکیب کنند.
در این آزمایشگاه کد، شما یک ارکستراسیون رویداد محور از میکروسرویسها برای پردازش تصاویر خواهید ساخت. شما از گردشهای کاری برای هماهنگسازی ترتیب، ورودیها و خروجیهای ۴ تابع ابری پردازش تصویر استفاده خواهید کرد. سپس ارکستراسیون را قادر خواهید ساخت تا به رویدادهای ذخیرهسازی ابری به روشی آزادانه با Eventarc پاسخ دهد.
در نهایت، شما با یک معماری انعطافپذیر اما ساختارمند بدون سرور برای پردازش تصاویر مواجه خواهید شد.

آنچه یاد خواهید گرفت
- مروری بر Eventarc و گردشهای کاری
- نحوه استقرار سرویسهای Cloud Functions
- نحوه هماهنگسازی سرویسها با استفاده از گردشهای کاری
- چگونه با Eventarc، گردشهای کاری را به رویدادهای ذخیرهسازی ابری پاسخ دهیم؟
۲. تنظیمات و الزامات
تنظیم محیط خودتنظیم
- وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .



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

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

این ماشین مجازی با تمام ابزارهای توسعهای که نیاز دارید، مجهز شده است. این ماشین مجازی یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه میدهد و روی فضای ابری گوگل اجرا میشود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود میبخشد. تمام کارهای شما در این آزمایشگاه کد را میتوان در یک مرورگر انجام داد. نیازی به نصب چیزی ندارید.
جی کلود را تنظیم کنید
در Cloud Shell، شناسه پروژه و منطقهای که میخواهید برنامه خود را در آن مستقر کنید، تنظیم کنید. آنها را به عنوان متغیرهای PROJECT_ID و REGION ذخیره کنید. برای اطلاع از مناطق موجود، به مکانهای توابع Cloud مراجعه کنید.
PROJECT_ID=your-project-id gcloud config set project $PROJECT_ID
دریافت کد منبع
کد منبع برنامه در پوشه processing-pipelines از مخزن eventarc-samples قرار دارد.
مخزن را کلون کنید:
git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
به پوشه eventarc-samples/processing-pipelines بروید:
cd eventarc-samples/processing-pipelines
۳. مرور کلی معماری
معماری برنامه به شرح زیر است:

- یک تصویر در یک سطل ورودی ذخیره میشود که رویداد ایجاد فضای ذخیرهسازی ابری را ایجاد میکند.
- رویداد ایجاد فضای ذخیرهسازی ابری توسط Eventarc از طریق یک تریگر فضای ذخیرهسازی ابری خوانده میشود و به عنوان یک رویداد ابری (CloudEvent) به Workflows ارسال میشود.
- در اولین مرحله از گردش کار، فیلتر ، یک سرویس تابع ابری، از رابط برنامهنویسی کاربردی بینایی برای تعیین ایمن بودن تصویر استفاده میکند. اگر تصویر ایمن باشد، گردشهای کاری با مراحل بعدی ادامه مییابند.
- در مرحله دوم گردش کار، Labeler ، یک سرویس Cloud Function، برچسبهای تصویر را با Vision API استخراج کرده و برچسبها را در مخزن خروجی ذخیره میکند.
- در مرحله سوم، Resizer ، یکی دیگر از سرویسهای Cloud Function، با استفاده از ImageSharp تصویر را تغییر اندازه میدهد و تصویر تغییر اندازه یافته را در پوشه خروجی ذخیره میکند.
- در آخرین مرحله، Watermarker ، یکی دیگر از سرویسهای Cloud Function، با استفاده از ImageSharp یک واترمارک از برچسبها را از Labeler به تصویر تغییر اندازه داده شده اضافه میکند و تصویر را در مخزن خروجی ذخیره میکند.
این برنامه توسط یک رویداد Cloud Storage آغاز میشود، از این رو رویدادمحور است. پردازش تصاویر در یک گردش کار اتفاق میافتد، از این رو یک هماهنگی است. در نهایت، این یک هماهنگی رویدادمحور برای یک معماری انعطافپذیر اما ساختارمند بدون سرور برای پردازش تصاویر است.
۴. ایجاد سطلها
یک سطل ورودی برای کاربران ایجاد کنید تا تصاویر را در آن آپلود کنند و یک سطل خروجی برای خط لوله پردازش تصویر ایجاد کنید تا تصاویر پردازش شده را ذخیره کند.
دستور زیر را در Cloud Shell اجرا کنید:
REGION=us-central1 BUCKET1=$PROJECT_ID-images-input-$RANDOM BUCKET2=$PROJECT_ID-images-output-$RANDOM gsutil mb -l $REGION gs://$BUCKET1 gsutil mb -l $REGION gs://$BUCKET2
۵. سرویس فیلتر را مستقر کنید
بیایید با استقرار اولین سرویس شروع کنیم. این سرویس Cloud Functions اطلاعات سطل و فایل را دریافت میکند، تعیین میکند که آیا تصویر با Vision API ایمن است یا خیر و نتیجه را برمیگرداند.
ابتدا، سرویسهای مورد نیاز برای Cloud Functions gen2 و Vision API را فعال کنید:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ run.googleapis.com \ vision.googleapis.com
در داخل پوشه سطح بالای processing-pipelines ، سرویس را مستقر کنید:
SERVICE_NAME=filter gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --entry-point Filter.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v3/filter/csharp
پس از استقرار تابع، آدرس اینترنتی سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:
FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
۶. سرویس برچسبگذاری را مستقر کنید
سرویس دوم Cloud Functions اطلاعات باکت و فایل را دریافت میکند، برچسبهای تصویر را با Vision API استخراج میکند و برچسبها را در باکت خروجی ذخیره میکند.
در داخل پوشه سطح بالای processing-pipelines ، سرویس را مستقر کنید:
SERVICE_NAME=labeler gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --set-env-vars BUCKET=$BUCKET2 \ --entry-point Labeler.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v2/labeler/csharp
پس از استقرار تابع، آدرس اینترنتی سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:
LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
۷. سرویس تغییر اندازه را مستقر کنید
این سرویس Cloud Functions اطلاعات باکت و فایل را دریافت میکند، با استفاده از ImageSharp اندازه تصویر را تغییر میدهد و تصویر را در باکت خروجی ذخیره میکند.
در داخل پوشه سطح بالای processing-pipelines ، سرویس را مستقر کنید:
SERVICE_NAME=resizer gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --set-env-vars BUCKET=$BUCKET2 \ --entry-point Resizer.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v2/resizer/csharp \ --timeout=120s
به مقدار timeout ۲ دقیقه توجه کنید تا به تابع تغییر اندازه، زمان اضافی برای پردازش داده شود.
پس از استقرار تابع، آدرس اینترنتی سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:
RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
۸. سرویس واترمارک را مستقر کنید
این سرویس Cloud Functions اطلاعات سطل، فایل و برچسبها را دریافت میکند، فایل را میخواند، برچسبها را به عنوان واترمارک با استفاده از ImageSharp به تصویر اضافه میکند و تصویر را در سطل خروجی ذخیره میکند.
در داخل پوشه سطح بالای processing-pipelines ، سرویس را مستقر کنید:
SERVICE_NAME=watermarker gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --set-env-vars BUCKET=$BUCKET2 \ --entry-point Watermarker.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v2/watermarker/csharp
پس از استقرار تابع، آدرس اینترنتی سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:
WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
در این مرحله، هر چهار عملکرد ابری باید مستقر و در حال اجرا باشند:

۹. تعریف و استقرار گردش کار
از گردشهای کاری برای گرد هم آوردن سرویسهای فیلتر، برچسبگذار، تغییر اندازه و واترمارک در یک گردش کاری استفاده کنید. گردشهای کاری، فراخوانی این سرویسها را به ترتیب و با پارامترهایی که ما تعریف میکنیم، هماهنگ میکنند.
ابتدا، سرویسهای مورد نیاز برای Workflows را فعال کنید:
gcloud services enable \ workflows.googleapis.com \ workflowexecutions.googleapis.com
تعریف کنید
Workflows یک CloudEvent را به عنوان پارامتر دریافت میکند. این پارامتر پس از ایجاد یک trigger از Eventarc دریافت میشود. در دو مرحله اول، Workflows رویداد را ثبت کرده و اطلاعات سطل و فایل را از رویداد استخراج میکند:
main:
params: [event]
steps:
- log_event:
call: sys.log
args:
text: ${event}
severity: INFO
- extract_bucket_and_file:
assign:
- bucket: ${event.data.bucket}
- file: ${event.data.name}
در مرحله filter ، Workflows سرویس فیلتری که قبلاً پیادهسازی کردیم را فراخوانی میکند. سپس لاگ میگیرد و ایمنی فایل را بررسی میکند:
- filter:
call: http.post
args:
url: FILTER_URL # TODO: Replace
auth:
type: OIDC
body:
bucket: ${bucket}
file: ${file}
result: filterResponse
- log_safety:
call: sys.log
args:
text: ${filterResponse.body.safe}
severity: INFO
- check_safety:
switch:
- condition: ${filterResponse.body.safe == true}
next: label
next: end
در مرحله label ، Workflows سرویس برچسبگذار را فراخوانی میکند و پاسخ (سه برچسب برتر) را دریافت میکند:
- label:
call: http.post
args:
url: LABELER_URL # TODO: Replace
auth:
type: OIDC
body:
bucket: ${bucket}
file: ${file}
result: labelResponse
در مرحلهی resize ، Workflows سرویس تغییر اندازه را فراخوانی میکند و پاسخ (باکت و فایل تصویر تغییر اندازه داده شده) را دریافت میکند:
- resize:
call: http.post
args:
url: RESIZER_URL # TODO: Replace
auth:
type: OIDC
body:
bucket: ${bucket}
file: ${file}
result: resizeResponse
در مرحله watermark ، Workflows سرویس واترمارک را با تصویر تغییر اندازه داده شده و برچسبها فراخوانی میکند و نتیجه (تصویر تغییر اندازه داده شده و واترمارک شده) را ثبت میکند:
- watermark:
call: http.post
args:
url: WATERMARKER_URL # TODO: Replace
auth:
type: OIDC
body:
bucket: ${resizeResponse.body.bucket}
file: ${resizeResponse.body.file}
labels: ${labelResponse.body.labels}
result: watermarkResponse
در مرحله final ، Workflowها کد وضعیت HTTP را از سرویسهای labeler، resizer و watermarker برمیگردانند:
- final:
return:
label: ${labelResponse.code}
resize: ${resizeResponse.code}
watermark: ${watermarkResponse.code}
استقرار
قبل از استقرار گردش کار، مطمئن شوید که URL های سرویس با URL های توابع مستقر شده به صورت دستی یا با استفاده از sed جایگزین شده اند:
در داخل پوشهی سطح بالای processing-pipelines ، به پوشهی image-v3 که فایل workflows.yaml در آن قرار دارد، بروید:
cd image-v3/
sed را اجرا کنید تا URL های جایگزین شده را با URL های واقعی سرویس های مستقر جایگزین کنید:
sed -i -e "s|FILTER_URL|${FILTER_URL}|" workflow.yaml
sed -i -e "s|LABELER_URL|${LABELER_URL}|" workflow.yaml
sed -i -e "s|RESIZER_URL|${RESIZER_URL}|" workflow.yaml
sed -i -e "s|WATERMARKER_URL|${WATERMARKER_URL}|" workflow.yaml
گردش کار را مستقر کنید:
WORKFLOW_NAME=image-processing
gcloud workflows deploy $WORKFLOW_NAME \
--source=workflow.yaml \
--location=$REGION
در عرض چند ثانیه، باید گردش کار مستقر شده در کنسول را مشاهده کنید:

۱۰. ایجاد تریگر
اکنون که گردش کار مستقر شده است، آخرین مرحله اتصال آن به رویدادهای ذخیرهسازی ابری با یک تریگر Eventarc است.
راهاندازی یکباره
ابتدا، سرویسهای مورد نیاز برای Eventarc را فعال کنید:
gcloud services enable \ eventarc.googleapis.com
یک حساب کاربری سرویس ایجاد کنید که در تریگر Eventarc از آن استفاده خواهید کرد.
SERVICE_ACCOUNT=eventarc-trigger-imageproc-sa gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Eventarc trigger image processing service account"
نقش workflows.invoker را اعطا کنید، تا حساب سرویس بتواند برای فراخوانی Workflows از Eventarc استفاده شود:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/workflows.invoker \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
نقش eventarc.eventReceiver را اعطا کنید، o حساب سرویس میتواند در ... استفاده شود.
محرک ذخیرهسازی ابری:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/eventarc.eventReceiver \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
نقش pubsub.publisher را به حساب سرویس Cloud Storage اعطا کنید. این برای فعالسازی Cloud Storage در Eventarc مورد نیاز است:
STORAGE_SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_ID)"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$STORAGE_SERVICE_ACCOUNT \
--role roles/pubsub.publisher
ایجاد کردن
برای ایجاد یک تریگر، دستور زیر را اجرا کنید. این تریگر رویدادهای ایجاد فایل جدید را از سطل ورودی فضای ذخیرهسازی ابری فیلتر میکند و آنها را به گردش کاری که قبلاً تعریف کردیم، منتقل میکند:
TRIGGER_NAME=trigger-image-processing gcloud eventarc triggers create $TRIGGER_NAME \ --location=$REGION \ --destination-workflow=$WORKFLOW_NAME \ --destination-workflow-location=$REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET1" \ --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
میتوانید ببینید که تریگر در بخش Eventarc از Cloud Console ایجاد و آماده شده است:

۱۱. خط لوله را آزمایش کنید
خط لوله پردازش تصویر آماده دریافت رویدادها از فضای ذخیرهسازی ابری است. برای آزمایش خط لوله، یک تصویر را در سطل ورودی بارگذاری کنید:
gsutil cp beach.jpg gs://$BUCKET1
به محض اینکه تصویر را آپلود کنید، باید اجرای Workflows را در حالت فعال مشاهده کنید:

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

اگر محتویات سطل خروجی را فهرست کنید، باید تصویر تغییر اندازه داده شده، تصویر تغییر اندازه داده شده و واترمارک شده و برچسبهای تصویر را ببینید:
gsutil ls gs://$BUCKET2 gs://$PROJECT_ID-images-output-$RANDOM/beach-400x400-watermark.jpeg gs://$PROJECT_ID-images-output-$RANDOM/beach-400x400.png gs://$PROJECT_ID-images-output-$RANDOM/beach-labels.txt
برای بررسی مجدد، میتوانید تصویر تغییر اندازه داده شده و واترمارک شده را باز کنید تا نتیجه را ببینید:

۱۲. تبریک
تبریک میگویم، شما codelab را تمام کردید!
آنچه ما پوشش دادهایم
- مروری بر Eventarc و گردشهای کاری
- نحوه استقرار سرویسهای Cloud Functions
- نحوه هماهنگسازی سرویسها با استفاده از گردشهای کاری
- چگونه با Eventarc، گردشهای کاری را به رویدادهای ذخیرهسازی ابری پاسخ دهیم؟