Pic-a-day: Lab 6 — Orchestration with Workflows

1. بررسی اجمالی

در آزمایشگاه‌های قبلی، یک نسخه رویداد محور از برنامه Pic-a-daily ساخته‌اید که از یک عملکرد ابری راه‌اندازی Google Cloud Storage برای سرویس تجزیه و تحلیل تصویر، یک کانتینر Cloud Run با استفاده از GCS از طریق Pub/Sub برای سرویس تصویر بندانگشتی و Eventarc برای فعال کردن سرویس Image Garbage Collector در Cloud Run. همچنین یک سرویس کلاژ Cloud Scheduler فعال شد:

d93345bfc235f81e.png

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

b763efcbf5589747.png

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

  • موتور برنامه
  • Cloud Firestore
  • توابع ابری
  • Cloud Run
  • گردش کار

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

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID نامیده خواهد شد.

  1. در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورت‌حساب را در Cloud Console فعال کنید .

اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. حتماً دستورالعمل‌های موجود در بخش «تمیز کردن» را دنبال کنید که به شما توصیه می‌کند چگونه منابع را خاموش کنید تا بیش از این آموزش متحمل صورت‌حساب نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

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

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

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

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

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

3. مقدمه ای بر گردش کار

90fcd42d556e310e.jpeg

می‌توانید از Workflows برای ایجاد گردش‌های کاری بدون سرور استفاده کنید که مجموعه‌ای از وظایف بدون سرور را به ترتیبی که شما تعریف می‌کنید به یکدیگر پیوند می‌دهند. می‌توانید قدرت APIهای Google Cloud، محصولات بدون سرور مانند Cloud Functions و Cloud Run و تماس‌های APIهای خارجی را برای ایجاد برنامه‌های بدون سرور انعطاف‌پذیر ترکیب کنید.

همانطور که ممکن است از یک ارکستر انتظار داشته باشید، Workflows به شما این امکان را می دهد که جریان منطق کسب و کار خود را در یک زبان تعریف گردش کار مبتنی بر YAML/JSON تعریف کنید و یک Workflows Execution API و Workflows UI برای راه اندازی این جریان ها ارائه می دهد.

این چیزی بیش از یک ارکستر کننده صرف با این ویژگی های داخلی و قابل تنظیم است:

  • کنترل مجدد و خطای انعطاف پذیر بین مراحل برای اجرای مطمئن مراحل.
  • تجزیه JSON و عبور متغیر بین مراحل برای جلوگیری از چسب کد.
  • فرمول‌های بیان برای تصمیم‌گیری‌ها امکان اجرای گام‌های مشروط را می‌دهند.
  • جریان‌های فرعی برای گردش‌های کاری مدولار و قابل استفاده مجدد.
  • پشتیبانی از خدمات خارجی امکان هماهنگی سرویس‌ها را فراتر از Google Cloud فراهم می‌کند.
  • پشتیبانی از احراز هویت برای Google Cloud و خدمات خارجی برای اجرای ایمن مراحل.
  • اتصالات به سرویس‌های Google Cloud مانند Pub/Sub، Firestore، Tasks، Secret Manager برای ادغام آسان‌تر.

ناگفته نماند که Workflows یک محصول بدون سرور کاملاً مدیریت شده است. هیچ سروری برای پیکربندی یا مقیاس بندی وجود ندارد و شما فقط برای آنچه استفاده می کنید هزینه می پردازید.

4. API ها را فعال کنید

در این آزمایشگاه، خدمات Cloud Function و Cloud Run را با Workflows متصل خواهید کرد. شما همچنین از App Engine، Cloud Build، Vision API و سایر خدمات استفاده خواهید کرد.

در Cloud Shell، مطمئن شوید که تمام خدمات لازم فعال هستند:

gcloud services enable \
  appengine.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  compute.googleapis.com \
  firestore.googleapis.com \
  run.googleapis.com \
  vision.googleapis.com \
  workflows.googleapis.com \

پس از مدتی، باید عملیات را با موفقیت مشاهده کنید:

Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.

5. کد را دریافت کنید

اگر قبلاً در آزمایشگاه‌های کد قبلی نبوده‌اید، کد را دریافت کنید:

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop

شما ساختار پوشه زیر را خواهید داشت که مربوط به این آزمایشگاه است:

frontend
 |
workflows
 |
 ├── functions
 ├── |── trigger-workflow
 ├── |── vision-data-transform
 ├── services
 ├── |── collage
 ├── |── thumbnails
 ├── workflows.yaml

اینها پوشه های مربوطه هستند:

  • frontend شامل قسمت جلویی App Engine است که از آزمایشگاه 4 مجدداً استفاده خواهیم کرد.
  • functions شامل توابع ابری است که برای گردش کار ایجاد شده است.
  • services شامل سرویس های Cloud Run هستند که برای گردش کار اصلاح شده اند.
  • workflows.yaml فایل تعریف گردش کار است.

6. گردش کار YAML را کاوش کنید

workflows.yaml گردش کار را در یک سری مراحل تعریف می کند. بیایید آن را مرور کنیم تا آن را بهتر درک کنیم.

در ابتدای گردش کار، برخی از پارامترها وجود دارد که به آنها منتقل می شود. بعداً به این توابع خواهیم رسید، اما گردش کار به این صورت شروع می شود:

d44a5e18aa9d4660.png

در YAML، می‌توانید ببینید که این پارامترها به متغیرهایی در مرحله init مانند نام فایل و سطل که رویداد را راه‌اندازی می‌کنند، و آدرس‌های اینترنتی برخی از توابع Cloud و سرویس‌های Cloud Run که Workflows آنها را فراخوانی می‌کند، اختصاص می‌یابد:

main:
  params: [args]
  steps:
    - init:
        assign:
          - file: ${args.file}
          - bucket: ${args.bucket}
          - gsUri: ${"gs://" + bucket + "/" + file}
          - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
          - urls: ${args.urls}

سپس، Workflows نوع رویداد را بررسی می کند. 2 نوع رویداد پشتیبانی می شود: object.finalize (در صورت ذخیره یک فایل در سطل ذخیره سازی ابری منتشر می شود) و object.delete (با حذف فایل منتشر می شود). هر چیز دیگری رویدادی را ایجاد می کند که پشتیبانی نمی شود.

dd1f450983655619.png

در اینجا مرحله تعریف گردش کار YAML است که در آن نوع رویداد ذخیره سازی فایل را بررسی می کنیم:

    - eventTypeSwitch:
        switch:
            - condition: ${args.eventType == "google.storage.object.finalize"}
              next: imageAnalysisCall
            - condition: ${args.eventType == "google.storage.object.delete"}
              next: pictureGarbageCollectionGCS
    - eventTypeNotSupported:
        raise: ${"eventType " + args.eventType + " is not supported"}
        next: end

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

در مرحله بعد، بیایید نگاهی به imageAnalysisCall بیندازیم. این مجموعه‌ای از فراخوان‌های Workflows برای فراخوانی Vision API برای تجزیه و تحلیل تصویر، تبدیل داده‌های پاسخ Vision API برای مرتب‌سازی برچسب‌های چیزهای شناسایی‌شده در تصویر، انتخاب رنگ‌های غالب، بررسی ایمن بودن تصویر برای نمایش است و سپس ابرداده را در Cloud Firestore ذخیره کنید.

توجه داشته باشید که همه چیز در Workflow ها انجام می شود به جز Vision Transform Cloud Functions (که بعداً آن را اجرا خواهیم کرد):

ca2ad16b9cbb436.png

مراحل در YAML به این صورت است:

    - imageAnalysisCall:
        call: http.post
        args:
          url: https://vision.googleapis.com/v1/images:annotate
          headers:
            Content-Type: application/json
          auth:
            type: OAuth2
          body:
            requests:
            - image:
                source:
                  gcsImageUri: ${gsUri}
              features:
              - type: LABEL_DETECTION
              - type: SAFE_SEARCH_DETECTION
              - type: IMAGE_PROPERTIES
        result: imageAnalysisResponse
    - transformImageAnalysisData:
        call: http.post
        args:
          url: ${urls.VISION_DATA_TRANSFORM_URL}
          auth:
            type: OIDC
          body: ${imageAnalysisResponse.body}
        result: imageMetadata
    - checkSafety:
        switch:
          - condition: ${imageMetadata.body.safe == true}
            next: storeMetadata
        next: end
    - storeMetadata:
        call: http.request
        args:
          url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file + "?updateMask.fieldPaths=color&updateMask.fieldPaths=labels&updateMask.fieldPaths=created"}
          auth:
            type: OAuth2
          method: PATCH
          body:
            name: ${"projects/" + projectId + "/databases/(default)/documents/pictures/" + file}
            fields:
              color:
                stringValue: ${imageMetadata.body.color}
              created:
                timestampValue: ${imageMetadata.body.created}
              labels:
                arrayValue:
                  values: ${imageMetadata.body.labels}
        result: storeMetadataResponse

پس از تجزیه و تحلیل تصویر، دو مرحله بعدی ایجاد تصویر کوچک تصویر و کلاژی از جدیدترین تصاویر است. این کار با استقرار 2 سرویس Cloud Run و برقراری تماس با آنها از مراحل thumbnailCall و collageCall انجام می شود:

76f9179323c3144.png

مراحل در YAML:

   - thumbnailCall:
        call: http.post
        args:
          url: ${urls.THUMBNAILS_URL}
          auth:
            type: OIDC
          body:
              gcsImageUri: ${gsUri}
        result: thumbnailResponse
    - collageCall:
        call: http.get
        args:
          url: ${urls.COLLAGE_URL}
          auth:
            type: OIDC
        result: collageResponse

این شاخه از اجرا با بازگرداندن کدهای وضعیت از هر سرویس در مرحله finalizeCompleted به پایان می رسد:

    - finalizeCompleted:
        return:
          imageAnalysis: ${imageAnalysisResponse.code}
          storeMetadata: ${storeMetadataResponse.code}
          thumbnail: ${thumbnailResponse.code}
          collage: ${collageResponse.code}

شاخه دیگر اجرا زمانی است که یک فایل از سطل ذخیره اصلی حذف می شود که حاوی نسخه های با وضوح بالا از تصاویر است. در این شاخه، می‌خواهیم تصویر کوچک تصویر را در سطل حاوی ریز عکس‌ها حذف کرده و ابرداده آن را از Firestore حذف کنیم. هر دوی این موارد با تماس های HTTP از Workflows انجام می شود:

f172379274dcb3c2.png

مراحل در YAML:

    - pictureGarbageCollectionGCS:
        try:
          call: http.request
          args:
            url: ${"https://storage.googleapis.com/storage/v1/b/thumbnails-" + projectId + "/o/" + file}
            auth:
              type: OAuth2
            method: DELETE
          result: gcsDeletionResult
        except:
          as: e
          steps:
              - dummyResultInOutVar:
                  assign:
                      - gcsDeletionResult:
                          code: 200
                          body: "Workaround for empty body response"
    - pictureGarbageCollectionFirestore:
        call: http.request
        args:
          url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file}
          auth:
            type: OAuth2
          method: DELETE
        result: firestoreDeletionResult

شاخه حذف با بازگرداندن نتایج / کدهای هر مرحله به پایان می رسد:

    - deleteCompleted:
        return:
          gcsDeletion: ${gcsDeletionResult}
          firestoreDeletion: ${firestoreDeletionResult.code}

در مراحل زیر، تمام وابستگی های خارجی Workflow ها را ایجاد خواهیم کرد: سطل ها، توابع ابری، سرویس های Cloud Run و پایگاه داده Firestore.

7. سطل ها را ایجاد کنید

برای تصاویر به 2 سطل نیاز دارید: 1 برای ذخیره تصاویر اصلی با وضوح بالا و 1 سطل برای ذخیره ریز عکسها.

با استفاده از ابزار gsutil یک سطل عمومی منطقه ای (در این مورد در اروپا) با دسترسی یکسان برای آپلود تصاویر توسط کاربران ایجاد کنید:

export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
gsutil mb -l EU gs://${BUCKET_PICTURES}
gsutil uniformbucketlevelaccess set on gs://${BUCKET_PICTURES}
gsutil iam ch allUsers:objectViewer gs://${BUCKET_PICTURES}

یک سطل منطقه ای عمومی دیگر برای تصاویر کوچک ایجاد کنید:

export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
gsutil mb -l EU gs://${BUCKET_THUMBNAILS}
gsutil uniformbucketlevelaccess set on gs://${BUCKET_THUMBNAILS}
gsutil iam ch allUsers:objectViewer gs://${BUCKET_THUMBNAILS}

با مراجعه به بخش Cloud Storage در Cloud Console می‌توانید دوباره بررسی کنید که سطل‌ها ایجاد و عمومی شده‌اند:

15063936edd72f06.png

8. Vision Data Transform (عملکرد ابری)

Workflows.yaml با مراحل init ، eventTypeSwitch ، eventTypeNotSupported شروع می شود. اینها مطمئن می شوند که رویدادهایی که از سطل ها می آیند به مراحل صحیح هدایت می شوند.

برای رویداد object.finalize ، مرحله imageAnalysisCall با Vision API تماس می گیرد تا متادیتای تصویر ایجاد شده را استخراج کند. تمام این مراحل در Workflow ها انجام می شود:

daaed43a22d2b0d3.png

در مرحله بعد، قبل از اینکه بتوانیم آن را در Firestore ذخیره کنیم، باید داده های برگشتی از Vision API را تبدیل کنیم. به طور دقیق تر، ما باید:

  • برچسب های بازگشتی برای تصویر را فهرست کنید.
  • رنگ غالب تصویر را بازیابی کنید.
  • تعیین کنید که آیا تصویر ایمن است یا خیر.

این به صورت کد در یک Cloud Function انجام می شود و Workflows به سادگی این تابع را فراخوانی می کند:

5e120e70c67779cd.png

کد را کاوش کنید

به عملکرد ابری vision-data-transform می‌گویند. می توانید کد کامل آن را در index.js بررسی کنید. همانطور که می بینید، تنها هدف این تابع این است که تبدیل JSON به JSON را انجام دهد تا متادیتای تصویر را به راحتی در Firestore ذخیره کند.

استقرار در توابع ابری

به پوشه بروید:

cd workflows/functions/vision-data-transform/nodejs

منطقه مورد نظر خود را تنظیم کنید:

export REGION=europe-west1
gcloud config set functions/region ${REGION}

استقرار تابع با:

export SERVICE_NAME=vision-data-transform
gcloud functions deploy ${SERVICE_NAME} \
  --source=. \
  --runtime nodejs10 \
  --entry-point=vision_data_transform \
  --trigger-http \
  --allow-unauthenticated

هنگامی که تابع مستقر شد، مرحله Workflows transformImageAnalysisData می‌تواند این تابع را برای تبدیل داده Vision API فراخوانی کند.

9. پایگاه داده را آماده کنید

مرحله بعدی در Workflow ها بررسی ایمنی تصویر از داده های تصویر و سپس ذخیره اطلاعات مربوط به تصویر بازگردانده شده توسط Vision API در پایگاه داده Cloud Firestore ، یک پایگاه داده اسناد NoSQL سریع، کاملاً مدیریت شده، بدون سرور و ابری است:

6624c616bc7cd97f.png

هر دوی اینها در Workflows انجام می شود، اما شما باید پایگاه داده Firestore را برای ذخیره سازی ابرداده ایجاد کنید.

ابتدا، یک اپلیکیشن App Engine را در منطقه ای که می خواهید پایگاه داده Firestore ایجاد کنید (الزامی برای Firestore):

export REGION_FIRESTORE=europe-west2
gcloud app create --region=${REGION_FIRESTORE}

سپس پایگاه داده Firestore را در همان منطقه ایجاد کنید:

gcloud firestore databases create --region=${REGION_FIRESTORE}

اسناد به صورت برنامه نویسی در مجموعه ما ایجاد می شوند و شامل 4 فیلد خواهند بود:

  • name (string): نام فایل تصویر آپلود شده که کلید سند نیز می باشد
  • برچسب ها (آرایه رشته ها): برچسب های موارد شناسایی شده توسط Vision API
  • رنگ (رشته): کد رنگ هگزادسیمال رنگ غالب (یعنی #ab12ef)
  • ایجاد (تاریخ): مُهر زمانی ذخیره شدن فراداده این تصویر
  • تصویر بندانگشتی (بولی): یک فیلد اختیاری که در صورت ایجاد یک تصویر کوچک برای این تصویر وجود دارد و درست است.

از آنجایی که در Firestore برای یافتن تصاویری که دارای ریز عکس‌ها هستند جستجو می‌کنیم و بر اساس تاریخ ایجاد مرتب می‌کنیم، باید یک فهرست جستجو ایجاد کنیم. با دستور زیر می توانید ایندکس را ایجاد کنید:

gcloud firestore indexes composite create --collection-group=pictures \
  --field-config field-path=thumbnail,order=descending \
  --field-config field-path=created,order=descending

توجه داشته باشید که ایجاد ایندکس می تواند تا 10 دقیقه یا بیشتر طول بکشد.

پس از ایجاد ایندکس، می توانید آن را در Cloud Console ببینید:

43af1f5103bf423.png

مرحله storeMetadata Workflows می‌تواند هم‌اکنون فراداده تصویر را در Firestore ذخیره کند.

10. سرویس تصویر کوچک (Cloud Run)

بعدی در زنجیره ایجاد یک تصویر کوچک از یک تصویر است. این به صورت کد در یک سرویس Cloud Run انجام می شود و Workflows این سرویس را در مرحله thumbnailCall فراخوانی می کند:

84d987647f082b53.png

کد را کاوش کنید

سرویس Cloud Run thumbnails نامیده می شود. می توانید کد کامل آن را در index.js بررسی کنید.

تصویر ظرف را بسازید و منتشر کنید

Cloud Run کانتینرها را اجرا می کند اما ابتدا باید تصویر کانتینر را بسازید (تعریف شده در Dockerfile ). از Google Cloud Build می توان برای ساخت تصاویر کانتینر و سپس میزبانی در Google Container Registry استفاده کرد.

به پوشه بروید:

cd workflows/services/thumbnails/nodejs

ساخت:

export SERVICE_SRC=thumbnails
export SERVICE_NAME=${SERVICE_SRC}-service
gcloud builds submit \
  . \
  --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

پس از یک یا دو دقیقه، ساخت باید با موفقیت انجام شود و کانتینر در Google Container Registry مستقر می شود.

در Cloud Run مستقر شوید

چند متغیر و پیکربندی مورد نیاز را تنظیم کنید:

export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed

با دستور زیر مستقر کنید:

gcloud run deploy ${SERVICE_NAME} \
    --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
    --no-allow-unauthenticated \
    --memory=1Gi \
    --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}

هنگامی که سرویس مستقر شد، Workflows thumbnailCall step می‌تواند این سرویس را فراخوانی کند.

11. سرویس کلاژ (Cloud Run)

بعدی در زنجیره ایجاد یک کلاژ از جدیدترین تصاویر است. این به صورت کد در یک سرویس Cloud Run انجام می شود و Workflows این سرویس را در مرحله collageCall فراخوانی می کند:

591e36149066e1ba.png

کد را کاوش کنید

سرویس Cloud Run collage نامیده می شود. می توانید کد کامل آن را در index.js بررسی کنید.

تصویر ظرف را بسازید و منتشر کنید

Cloud Run کانتینرها را اجرا می کند اما ابتدا باید تصویر کانتینر را بسازید (تعریف شده در Dockerfile ). از Google Cloud Build می توان برای ساخت تصاویر کانتینر و سپس میزبانی در Google Container Registry استفاده کرد.

به پوشه بروید:

cd services/collage/nodejs

ساخت:

export SERVICE_SRC=collage
export SERVICE_NAME=${SERVICE_SRC}-service
gcloud builds submit \
  . \
  --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

پس از یک یا دو دقیقه، ساخت باید با موفقیت انجام شود و کانتینر در Google Container Registry مستقر می شود.

در Cloud Run مستقر شوید

چند متغیر و پیکربندی مورد نیاز را تنظیم کنید:

export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed

استقرار:

gcloud run deploy ${SERVICE_NAME} \
    --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
    --no-allow-unauthenticated \
    --memory=1Gi \
    --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}

پس از استقرار سرویس، می‌توانید بررسی کنید که هر دو سرویس در بخش Cloud Run در Cloud Console در حال اجرا هستند و مرحله Workflows collageCall قادر به فراخوانی این سرویس خواهد بود:

3ae9873f4cbbf423.png

12. استقرار گردش کار

ما تمام وابستگی های خارجی Workflow ها را مستقر کردیم. تمام مراحل باقی مانده ( finalizeCompleted ، pictureGarbageCollectionGCS ، pictureGarbageCollectionFirestore ، deleteCompleted ) را می توان توسط خود Workflows تکمیل کرد.

زمان استقرار Workflow ها فرا رسیده است!

به پوشه ای که حاوی فایل workflows.yaml است بروید و آن را با:

export WORKFLOW_REGION=europe-west4
export WORKFLOW_NAME=picadaily-workflows
gcloud workflows deploy ${WORKFLOW_NAME} \
  --source=workflows.yaml \
  --location=${WORKFLOW_REGION}

در چند ثانیه، Workflow باید مستقر شود و می‌توانید آن را در بخش Workflows در Cloud Console ببینید:

94a720149e5df9c5.png

در صورت تمایل می توانید روی Workflow کلیک کرده و آن را ویرایش کنید. در طول ویرایش، یک نمایش بصری خوب از گردش کار دریافت می کنید:

55441b158f6027f3.png

همچنین می توانید Workflow را از Cloud Console به صورت دستی با پارامترهای مناسب اجرا کنید. در عوض، ما آن را به صورت خودکار در پاسخ به رویدادهای Cloud Storage در مرحله بعد اجرا خواهیم کرد.

13. محرک های گردش کار (توابع ابری)

گردش کار مستقر و آماده است. اکنون، زمانی که فایلی در یک سطل ذخیره‌سازی ابری ایجاد یا حذف می‌شود، باید Workflows را فعال کنیم. اینها به ترتیب رویدادهای storage.object.finalize و storage.object.delete هستند.

گردش کار دارای API و کتابخانه های سرویس گیرنده برای ایجاد، مدیریت و اجرای گردش کار است که می توانید از آنها استفاده کنید. در این مورد، شما از Workflows Execution API و به طور خاص از کتابخانه مشتری Node.js آن برای راه اندازی Workflow استفاده خواهید کرد.

شما گردش‌های کاری را از عملکرد Cloud با گوش دادن به رویدادهای Cloud Storage فعال خواهید کرد. از آنجایی که یک Cloud Function فقط می تواند برای یک نوع رویداد گوش دهد، شما دو تابع Cloud را برای گوش دادن به رویدادها ایجاد و حذف می کنید:

c4d79646de729e4.png

کد را کاوش کنید

تابع Cloud را trigger-workflow می نامند. می توانید کد کامل آن را در index.js بررسی کنید.

استقرار در توابع ابری

به پوشه بروید:

cd workflows/functions/trigger-workflow/nodejs

چند متغیر و پیکربندی مورد نیاز را تنظیم کنید:

export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
export WORKFLOW_NAME=picadaily-workflows
export WORKFLOW_REGION=europe-west4
export COLLAGE_URL=$(gcloud run services describe collage-service --format 'value(status.url)')
export THUMBNAILS_URL=$(gcloud run services describe thumbnails-service --format 'value(status.url)')
export VISION_DATA_TRANSFORM_URL=$(gcloud functions describe vision-data-transform --format 'value(httpsTrigger.url)')
gcloud config set functions/region ${REGION}

برای نهایی کردن رویدادها، تابع پاسخگو را مستقر کنید:

export SERVICE_NAME=trigger-workflow-on-finalize
gcloud functions deploy ${SERVICE_NAME} \
  --source=. \
  --runtime nodejs10 \
  --entry-point=trigger_workflow \
  --trigger-resource=${BUCKET_PICTURES} \
  --trigger-event=google.storage.object.finalize \
  --allow-unauthenticated \
  --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}

تابع دوم را که به حذف رویدادها پاسخ می دهد، مستقر کنید:

export SERVICE_NAME=trigger-workflow-on-delete
gcloud functions deploy ${SERVICE_NAME} \
  --source=. \
  --runtime nodejs10 \
  --entry-point=trigger_workflow \
  --trigger-resource=${BUCKET_PICTURES} \
  --trigger-event=google.storage.object.delete \
  --allow-unauthenticated \
  --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}

وقتی استقرار کامل شد، می‌توانید هر دو عملکرد را در Cloud Console ببینید:

7d60c8b7851f39f5.png

14. Frontend (App Engine)

در این مرحله، یک صفحه وب در Google App Engine از Pic-a-daily ایجاد می‌کنید: آزمایشگاه 4 — یک صفحه وب ایجاد کنید که به کاربران امکان می‌دهد تصاویر را از برنامه وب آپلود کنند و همچنین تصاویر آپلود شده و تصاویر کوچک آنها را مرور کنند.

223fb2281614d053.png

می‌توانید درباره App Engine بیشتر بدانید و توضیحات کد را در Pic-a-daily بخوانید: Lab 4—Create a web frontend .

کد را کاوش کنید

برنامه App Engine را frontend می نامند. می توانید کد کامل آن را در index.js بررسی کنید.

استقرار در App Engine

به پوشه بروید:

cd frontend

منطقه مورد نظر خود را تنظیم کنید و همچنین GOOGLE_CLOUD_PROJECT را در app.yaml با شناسه پروژه واقعی خود جایگزین کنید:

export REGION=europe-west1
gcloud config set compute/region ${REGION}
sed -i -e "s/GOOGLE_CLOUD_PROJECT/${GOOGLE_CLOUD_PROJECT}/" app.yaml

استقرار:

gcloud app deploy app.yaml -q

پس از یک یا دو دقیقه، به شما گفته می شود که برنامه در حال ارائه ترافیک است:

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 8 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://GOOGLE_CLOUD_PROJECT.appspot.com]
You can stream logs from the command line by running:
  $ gcloud app logs tail -s default
To view your application in the web browser run:
  $ gcloud app browse

همچنین می‌توانید از بخش App Engine در Cloud Console دیدن کنید تا ببینید که برنامه مستقر است و ویژگی‌های App Engine مانند نسخه‌سازی و تقسیم ترافیک را بررسی کنید:

f4bd5f4de028bd83.png

15. گردش کار را آزمایش کنید

برای آزمایش، به URL پیش‌فرض App Engine برای برنامه ( https://<YOUR_PROJECT_ID>.appspot.com/ ) بروید و باید رابط کاربری frontend را ببینید که در حال اجراست!

1649ac060441099.png

یک عکس آپلود کنید این باید گردش‌های کاری را فعال کند و می‌توانید اجرای گردش کار را در حالت Active در کنسول Cloud ببینید:

b5a2a3d7a2bc094.png

هنگامی که گردش کار انجام شد، می توانید روی شناسه اجرا کلیک کنید و خروجی سرویس های مختلف را ببینید:

8959df5098c21548.png

آپلود 3 عکس دیگر همچنین باید تصویر کوچک و کلاژ تصاویر را در سطل‌های فضای ذخیره‌سازی ابری و قسمت جلویی App Engine به‌روزرسانی شده ببینید:

d90c786ff664a5dc.png

16. تمیز کردن (اختیاری)

اگر قصد ندارید برنامه را نگه دارید، می توانید با حذف کل پروژه، منابع را پاکسازی کنید تا در هزینه ها صرفه جویی کنید و در کل شهروند ابری خوبی باشید:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT} 

17. تبریک می گویم!

شما یک نسخه هماهنگ از برنامه را با استفاده از Workflows برای هماهنگی و تماس با خدمات ایجاد کردید.

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

  • موتور برنامه
  • Cloud Firestore
  • توابع ابری
  • Cloud Run
  • گردش کار