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

۱. مقدمه

f2f35f5c40b91a3c.pngc637dcc97f298e7e.pngc4a9d5b95f111710.png

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

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

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

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

b75a14a4268cbe73.png

آنچه یاد خواهید گرفت

  • مروری بر Eventarc و گردش‌های کاری
  • نحوه استقرار سرویس‌های Cloud Functions
  • نحوه هماهنگ‌سازی سرویس‌ها با استفاده از گردش‌های کاری
  • چگونه با Eventarc، گردش‌های کاری را به رویدادهای ذخیره‌سازی ابری پاسخ دهیم؟

۲. تنظیمات و الزامات

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

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

۲۹۵۰۰۴۸۲۱bab6a87.png

37d264871000675d.png

۹۶d86d3d5655cdbe.png

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

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

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

فعال کردن پوسته ابری

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

تصویر صفحه ترمینال Google 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

۳. مرور کلی معماری

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

7b810e1505054c0c.png

  1. یک تصویر در یک سطل ورودی ذخیره می‌شود که رویداد ایجاد فضای ذخیره‌سازی ابری را ایجاد می‌کند.
  2. رویداد ایجاد فضای ذخیره‌سازی ابری توسط Eventarc از طریق یک تریگر فضای ذخیره‌سازی ابری خوانده می‌شود و به عنوان یک رویداد ابری (CloudEvent) به Workflows ارسال می‌شود.
  3. در اولین مرحله از گردش کار، فیلتر ، یک سرویس تابع ابری، از رابط برنامه‌نویسی کاربردی بینایی برای تعیین ایمن بودن تصویر استفاده می‌کند. اگر تصویر ایمن باشد، گردش‌های کاری با مراحل بعدی ادامه می‌یابند.
  4. در مرحله دوم گردش کار، Labeler ، یک سرویس Cloud Function، برچسب‌های تصویر را با Vision API استخراج کرده و برچسب‌ها را در مخزن خروجی ذخیره می‌کند.
  5. در مرحله سوم، Resizer ، یکی دیگر از سرویس‌های Cloud Function، با استفاده از ImageSharp تصویر را تغییر اندازه می‌دهد و تصویر تغییر اندازه یافته را در پوشه خروجی ذخیره می‌کند.
  6. در آخرین مرحله، 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)')

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

fe662925cb0121e9.png

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

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

ابتدا، سرویس‌های مورد نیاز برای 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

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

a5f537f2b3f3bd3.png

۱۰. ایجاد تریگر

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

a5f4301863d7d9e4.png

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

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

gsutil cp beach.jpg gs://$BUCKET1

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

2c914341950b5fde.png

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

9abba6c28c51a9b5.png

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

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

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

۴۶d375cb05a8aae4.jpeg

۱۲. تبریک

تبریک می‌گویم، شما codelab را تمام کردید!

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

  • مروری بر Eventarc و گردش‌های کاری
  • نحوه استقرار سرویس‌های Cloud Functions
  • نحوه هماهنگ‌سازی سرویس‌ها با استفاده از گردش‌های کاری
  • چگونه با Eventarc، گردش‌های کاری را به رویدادهای ذخیره‌سازی ابری پاسخ دهیم؟