با Eventarc و Workflows یک ارکستراسیون رویداد محور بسازید

1. مقدمه

cb762f29e9183a3f.png1c05e3d0c2bd2b45.pnga03f943ca09ac4c.png

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

Workflows یک پلت فرم ارکستراسیون کاملاً مدیریت شده است که خدمات را به ترتیبی که شما تعریف می کنید اجرا می کند: گردش کار. این گردش‌های کاری می‌توانند سرویس‌های میزبانی شده در Cloud Run یا Cloud Function، سرویس‌های Google Cloud مانند Cloud Vision AI و BigQuery و هر API مبتنی بر HTTP را ترکیب کنند.

در این نرم افزار کد، شما یک ارکستراسیون رویداد محور از میکروسرویس ها برای پردازش تصاویر ایجاد خواهید کرد. شما از Workflows برای هماهنگ کردن ترتیب، ورودی‌ها و خروجی‌های 4 عملکرد Cloud پردازش تصویر استفاده خواهید کرد. سپس ارکستراسیون را فعال می‌کنید تا با Eventarc به رویدادهای Cloud Storage پاسخ دهد.

در پایان، شما به یک معماری بدون سرور انعطاف پذیر و در عین حال ساختار یافته برای پردازش تصاویر خواهید رسید.

e372ceed8c26c5fb.png

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

  • مروری بر Eventarc و Workflows
  • نحوه استقرار خدمات Cloud Functions
  • چگونه خدمات را با استفاده از Workflow ها هماهنگ کنیم
  • چگونه با Eventarc کاری کنیم که Workflow ها به رویدادهای Cloud Storage پاسخ دهند

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 دلاری هستند.

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

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

gcloud را راه اندازی کنید

در Cloud Shell، شناسه پروژه و منطقه ای را که می خواهید برنامه خود را در آن مستقر کنید، تنظیم کنید. آنها را به عنوان متغیرهای PROJECT_ID و REGION ذخیره کنید. برای مناطق موجود، مکان‌های عملکردهای ابری را ببینید.

PROJECT_ID=your-project-id
gcloud config set project $PROJECT_ID

کد منبع را دریافت کنید

کد منبع برنامه در پوشه processing-pipelines مخزن eventtarc-samples قرار دارد.

کلون کردن مخزن:

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

به پوشه eventarc-samples/processing-pipelines بروید:

cd eventarc-samples/processing-pipelines

3. نمای کلی معماری

معماری اپلیکیشن به شرح زیر است:

6aa6fbc7721dd6b6.png

  1. یک تصویر در یک سطل ورودی ذخیره می شود که یک رویداد ایجاد فضای ذخیره سازی ابری ایجاد می کند.
  2. رویداد ایجاد Cloud Storage توسط Eventarc از طریق یک راه‌انداز Cloud Storage خوانده می‌شود و به عنوان یک CloudEvent به Workflows ارسال می‌شود.
  3. در مرحله اول گردش کار، Filter ، یک سرویس Cloud Function، از Vision API برای تعیین ایمن بودن تصویر استفاده می کند. اگر تصویر ایمن باشد، Workflows با مراحل بعدی ادامه می‌یابد.
  4. در مرحله دوم گردش کار، Labeler ، یک سرویس Cloud Function، برچسب‌های تصویر را با Vision API استخراج می‌کند و برچسب‌ها را در سطل خروجی ذخیره می‌کند.
  5. در مرحله سوم، Resizer ، یکی دیگر از سرویس‌های Cloud Function، اندازه تصویر را با استفاده از ImageSharp تغییر داده و اندازه تصویر را در سطل خروجی ذخیره می‌کند.
  6. در مرحله آخر، Watermarker ، یکی دیگر از خدمات Cloud Function، یک واترمارک از برچسب‌ها از Labeler را با استفاده از ImageSharp به تصویر تغییر اندازه می‌دهد و تصویر را در سطل خروجی ذخیره می‌کند.

برنامه توسط یک رویداد Cloud Storage راه اندازی می شود، از این رو رویداد محور است. پردازش تصاویر در یک گردش کار اتفاق می افتد، بنابراین یک ارکستراسیون است. در پایان، این یک ارکستراسیون رویداد محور برای یک معماری بدون سرور انعطاف پذیر و در عین حال ساختار یافته برای پردازش تصاویر است.

4. سطل ایجاد کنید

یک سطل ورودی برای آپلود تصاویر توسط کاربران و یک سطل خروجی برای خط لوله پردازش تصویر برای ذخیره تصاویر پردازش شده ایجاد کنید.

موارد زیر را در Cloud Shell اجرا کنید:

REGION=us-central1
BUCKET1=$PROJECT_ID-images-input
BUCKET2=$PROJECT_ID-images-output

gsutil mb -l $REGION gs://$BUCKET1
gsutil mb -l $REGION gs://$BUCKET2

5. استقرار سرویس فیلتر

بیایید با استقرار اولین سرویس شروع کنیم. این سرویس 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

هنگامی که تابع مستقر شد، URL سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:

FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

6. سرویس برچسب زنی را مستقر کنید

دومین سرویس 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

هنگامی که تابع مستقر شد، URL سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:

LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

7. سرویس resizer را مستقر کنید

این سرویس 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 2 دقیقه توجه کنید تا به عملکرد تغییر اندازه زمان اضافی برای پردازش اجازه دهید.

هنگامی که تابع مستقر شد، URL سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:

RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

8. سرویس واترمارکر را مستقر کنید

این سرویس 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

هنگامی که تابع مستقر شد، URL سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:

WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

در این مرحله، هر چهار تابع ابری باید مستقر و اجرا شوند:

76a218568982c90c.png

9. تعریف و استقرار گردش کار

از Workflows استفاده کنید تا خدمات فیلتر، برچسب، تغییر اندازه و واترمارکر را در یک گردش کار گرد هم بیاورید. گردش کار فراخوانی این سرویس ها را به ترتیب و با پارامترهایی که ما تعریف می کنیم هماهنگ می کند.

ابتدا خدمات مورد نیاز را برای Workflows فعال کنید:

gcloud services enable \
  workflows.googleapis.com \
  workflowexecutions.googleapis.com

تعریف کنید

Workflows یک CloudEvent را به عنوان پارامتر دریافت می کند. هنگامی که ما یک ماشه ایجاد کنیم، این از 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 با سرویس برچسب‌گذار تماس می‌گیرد و پاسخ را دریافت می‌کند (3 برچسب برتر):

  - 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 ، Workflows کد وضعیت HTTP را از سرویس‌های برچسب‌گذار، تغییر اندازه‌دهنده و واترمارکر برمی‌گرداند:

  - final:
      return:
        label: ${labelResponse.code}
        resize: ${resizeResponse.code}
        watermark: ${watermarkResponse.code}

مستقر کنید

قبل از استقرار گردش کار، مطمئن شوید که URL های سرویس با آدرس های توابع مستقر شده به صورت دستی یا با استفاده از sed جایگزین شده اند:

در داخل پوشه processing-pipelines سطح بالا، به پوشه image-v3 که فایل workflows.yaml در آن قرار دارد بروید:

cd image-v3/

sed را اجرا کنید تا نشانی‌های اینترنتی جای‌بانی را با نشانی‌های اینترنتی واقعی سرویس‌های مستقر جایگزین کنید:

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

در عرض چند ثانیه، باید گردش کار مستقر در کنسول را مشاهده کنید:

92cf4e758bdc3dde.png

10. ایجاد ماشه

اکنون که گردش کار مستقر شده است، آخرین مرحله اتصال آن به رویدادهای Cloud Storage با یک ماشه 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 را اعطا کنید، بنابراین از حساب سرویس می‌توان برای فراخوانی گردش‌های کاری از 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 اعطا کنید. این مورد برای راه‌انداز ذخیره‌سازی ابری 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 ایجاد و آماده است:

14330c4fa2451bc0.png

11. خط لوله را آزمایش کنید

خط لوله پردازش تصویر آماده دریافت رویدادها از Cloud Storage است. برای آزمایش خط لوله، یک تصویر را در سطل ورودی آپلود کنید:

gsutil cp beach.jpg gs://$BUCKET1

به محض آپلود تصویر، باید اجرای Workflows را در حالت فعال مشاهده کنید:

36d07cb63c39e7d9.png

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

229200c79d989c25.png

اگر محتویات سطل خروجی را فهرست کنید، باید اندازه تصویر تغییر سایز، تصویر تغییر اندازه و واترمارک شده و برچسب های تصویر را ببینید:

gsutil ls gs://$BUCKET2

gs://$PROJECT_ID-images-output/beach-400x400-watermark.jpeg
gs://$PROJECT_ID-images-output/beach-400x400.png
gs://$PROJECT_ID-images-output/beach-labels.txt

برای بررسی دوبار، می توانید تصویر تغییر اندازه و واترمارک شده را باز کنید تا نتیجه را ببینید:

75f3c0019ca842ce.jpeg

12. تبریک می گویم

تبریک می گویم، شما نرم افزار کد را تمام کردید!

آنچه را پوشش داده ایم

  • مروری بر Eventarc و Workflows
  • نحوه استقرار خدمات Cloud Functions
  • چگونه خدمات را با استفاده از Workflow ها هماهنگ کنیم
  • چگونه با Eventarc کاری کنیم که Workflow ها به رویدادهای Cloud Storage پاسخ دهند