המתנה לאירועים באמצעות קודים להתקשרות חזרה וטריגרים של Eventarc

יכול להיות שתהליך העבודה יצטרך להמתין לתהליך חיצוני. אתם יכולים להשתמש בקריאות חוזרות (callback) של HTTP כדי להמתין לשירות אחר שישלח בקשה לנקודת קצה של קריאה חוזרת. הבקשה הזו מפעילה מחדש את זרימת העבודה. אפשר גם לחכות באמצעות בדיקה חוזרת.

במקום להשתמש ב-polling, במדריך הזה נסביר איך אפשר להמתין לאירועים או להודעות Pub/Sub באמצעות קריאות חוזרות (callback) של HTTP וטריגרים של Eventarc. אף על פי שאפשר להפעיל תהליך עבודה באמצעות אירועים או הודעות Pub/Sub, יכול להיות שתרצו להשהות את ההפעלה כדי להמתין לאירוע אחר לפני שתמשיכו. לדוגמה, אירוע מפעיל תהליך עבודה כדי להתחיל תהליך, אבל תהליך העבודה צריך להמתין לאירוע אחר שמסמן שהתהליך הושלם. כדי להטמיע את זה, אפשר להגדיר שתהליך עבודה אחד יפעיל תהליך עבודה אחר.

מטרות

במדריך הזה:

  1. תהליך עבודה ראשי שצריך להמתין לאירועים נפרס ומופעל. הוא צריך להמתין להתרחשות האירועים, ולכן הוא מאחסן את פרטי הקריאה החוזרת במסד נתונים של Firestore כדי שתהליך העבודה המשני יוכל לאחזר את הפרטים. לאחר מכן, תהליך העבודה הראשי ממתין לקריאות ה-HTTP.

  2. תהליך עבודה משני מופעל על ידי האירועים, והוא מאחזר את פרטי הקריאה החוזרת ממסד הנתונים של Firestore כשהאירועים נוצרים. לאחר מכן, תהליך העבודה המשני מתקשר חזרה לתהליך העבודה הראשי, והביצוע שלו נמשך.

סקירה כללית של התהליך כולו:

המתנה לאירועים באמצעות קריאות חוזרות ותהליך עבודה ראשי ומשני

תהליך עבודה ראשי:

  1. callback-event-sample תהליך עבודה יוצר נקודות קצה של קריאה חוזרת לשני מקורות אירועים: נושא Pub/Sub וקטגוריה של Cloud Storage.
  2. בתהליך העבודה הזה, שתי נקודות הקצה של הקריאה החוזרת מאוחסנות במסמך Firestore.
  3. תהליך העבודה הזה מפסיק את ההרצה שלו וממתין לבקשות HTTP שיגיעו לנקודות הקצה (endpoints) של הקריאה החוזרת.

אירועים:

  1. מתרחשים אירועים: הודעה מתפרסמת בנושא Pub/Sub וקובץ מועלה לקטגוריה של Cloud Storage.

תהליך עבודה משני:

  1. ‫Eventarc מעביר את האירועים לתהליך העבודה callback-event-listener ומפעיל את ההרצה שלו.
  2. תהליך העבודה הזה מאחזר את כתובות ה-URL המתאימות של נקודות הקצה של הקריאה החוזרת ממסמך Firestore.
  3. תהליך העבודה הזה מפעיל את הקריאות החוזרות לנקודות הקצה המתאימות בתהליך העבודה לדוגמה.

תהליך עבודה ראשי:

  1. תהליך העבודה callback-event-sample מקבל את האירועים בנקודות הקצה של הקריאה החוזרת וממשיך את הביצוע.
  2. תהליך העבודה הזה מוחק את כתובות ה-URL של הקריאות החוזרות ממסמך Firestore ומשלים את הביצוע שלו.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

לפני שמתחילים

אפשר להריץ את הפקודות הבאות במסוף Google Cloud או באמצעות Google Cloud CLI בטרמינל או ב-Cloud Shell.

יכול להיות שהגבלות אבטחה שהוגדרו בארגון שלכם ימנעו מכם להשלים את השלבים הבאים. מידע לפתרון בעיות זמין במאמר פיתוח אפליקציות בסביבה מוגבלת. Google Cloud

המסוף

  1. בדף לבחירת הפרויקט במסוף Google Cloud , בוחרים פרויקט ב- Google Cloud או יוצרים אותו.

    כניסה לדף לבחירת הפרויקט

  2. מוודאים שהחיוב מופעל בפרויקט Google Cloud . כך בודקים אם החיוב מופעל בפרויקט

  3. מפעילים את ממשקי ה-API של App Engine,‏ Eventarc,‏ Firestore,‏ Pub/Sub ו-Workflows.

    הפעלת ממשקי ה-API

  4. יוצרים חשבון שירות כדי שהתהליך העסקי יוכל להשתמש בו לאימות עם שירותים אחרים Google Cloud ומקצים לו את התפקידים המתאימים:

    1. נכנסים לדף Service Accounts במסוף Google Cloud .

      לדף Service accounts

    2. כדי לעבור לדף Create חשבון שירות, בוחרים את הפרויקט.

    3. כותבים שם בשדה Service account name. השדה Service account ID ימולא במסוף Google Cloud בהתאם לשם הזה.

      כותבים תיאור בשדה Service account description. לדוגמה, Service account for tutorial.

    4. לוחצים על Create and continue.

    5. ברשימה Select a role, מסננים את התפקידים הבאים כדי להעניק אותם לחשבון השירות שמנוהל על ידי המשתמש שיצרתם בשלב הקודם:

      • משתמש Cloud Datastore: כדי לגשת לנתונים של Firestore במצב Datastore ‏ (Datastore).
      • Eventarc Event Receiver: כדי לקבל אירועים מספקי אירועים.
      • בעל הרשאת כתיבה של יומנים: כדי לכתוב יומנים.
      • Workflows Invoker: להפעלת תהליכי עבודה ולניהול ההפעלות.

      כדי להוסיף עוד תפקידים, לוחצים על Add another role ומוסיפים אותם אחד אחרי השני.

    6. לוחצים על Continue.

    7. כדי לסיים את יצירת החשבון, לוחצים על סיום.

  5. כדי ליצור טריגר Eventarc שמנתב אירועים מ-Cloud Storage, צריך להעניק את התפקיד 'פרסום הודעות ב-Pub/Sub' לסוכן השירות של Cloud Storage. בדרך כלל זה הנתיב service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com. אפשר לאחזר את כתובת האימייל של סוכן השירות של Cloud Storage.

    1. נכנסים לדף IAM במסוף Google Cloud .

      כניסה לדף IAM

    2. בשורה של סוכן השירות של Cloud Storage, לוחצים על Edit principal. (אם סוכן השירות לא מופיע ברשימה, עוברים לשלב הבא). נפתחת החלונית עריכת הגישה.

      1. לוחצים על Add another role ואז מחפשים את התפקיד Pub/Sub Publisher.
      2. בוחרים את התפקיד.
      3. לוחצים על Save.
    3. אם סוכן השירות לא מופיע ברשימה, לוחצים על Grant access (מתן גישה). נפתחת החלונית הענקת גישה.

      1. בשדה New principals, מזינים את כתובת האימייל של סוכן השירות.
      2. ברשימה Select a role, מחפשים את התפקיד Pub/Sub Publisher.
      3. בוחרים את התפקיד.
      4. לוחצים על Save.

gcloud

  1. במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

    בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. מוודאים שהחיוב מופעל בפרויקט Google Cloud . כך בודקים אם החיוב מופעל בפרויקט

  3. מפעילים את ממשקי ה-API של App Engine,‏ Eventarc,‏ Firestore,‏ Pub/Sub ו-Workflows.

    gcloud services enable \
        appengine.googleapis.com \
        eventarc.googleapis.com \
        firestore.googleapis.com \
        pubsub.googleapis.com \
        workflows.googleapis.com
  4. יוצרים חשבון שירות שהתהליך העסקי ישתמש בו לאימות מול שירותים אחרים Google Cloud ומקצים לו את התפקידים המתאימים.

    1. יוצרים את חשבון השירות:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      מחליפים את הערך SERVICE_ACCOUNT_NAME בשם שרוצים לתת לחשבון השירות.

    2. נותנים תפקידים לחשבון השירות בניהול המשתמשים שיצרתם בשלב הקודם. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:

      • roles/datastore.user: כדי לגשת לנתונים של Firestore במצב Datastore ‏ (Datastore).
      • roles/eventarc.eventReceiver: כדי לקבל אירועים מספקי אירועים.
      • roles/logging.logWriter: כדי לכתוב יומנים.
      • roles/workflows.invoker: להפעיל תהליכי עבודה ולנהל את ההפעלות.
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE

      מחליפים את מה שכתוב בשדות הבאים:

      • PROJECT_ID: מזהה הפרויקט שבו יצרתם את חשבון השירות
      • ROLE: התפקיד שאתם רוצים לתת
  5. כדי ליצור טריגר Eventarc שמנתב אירועים מ-Cloud Storage, צריך להעניק את התפקיד 'פרסום הודעות ב-Pub/Sub' לסוכן השירות של Cloud Storage. בדרך כלל זה הנתיב service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com. משתמשים ב-gcloud storage service-agent כדי לאחזר את סוכן השירות של Cloud Storage.

    SERVICE_ACCOUNT_STORAGE="$(gcloud storage service-agent --project=PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$SERVICE_ACCOUNT_STORAGE \
        --role=roles/pubsub.publisher

יצירה של מסד נתונים ב-Firestore

ב-Firestore, הנתונים נשמרים במסמכים שמכילים שדות שממופים לערכים. המסמכים האלה מאוחסנים בקולקציות, שהן קונטיינרים של המסמכים שבהם אפשר להשתמש כדי לארגן את הנתונים ולבנות שאילתות. מידע נוסף על Firestore

שימו לב: כל פרויקט מוגבל למסד נתונים אחד של Firestore. Google Cloud אם אתם צריכים ליצור מסד נתונים חדש, אתם צריכים לבצע את השלבים הבאים.

המסוף

  1. נכנסים לדף Get started של Firestore במסוף Google Cloud .

    איך מתחילים

  2. לוחצים על בחירת מצב מותאם.

    לקבלת הנחיות לבחירת מצב מסד נתונים והשוואה בין התכונות, אפשר לעיין במאמר בנושא בחירה בין מצב מקורי למצב Datastore.

  3. ברשימה Select a location (בחירת מיקום), בוחרים באפשרות nam5 (United States) (ארה"ב).

    המיקום חל על מסד הנתונים של Firestore ועל אפליקציית App Engine בפרויקט Google Cloud . אחרי שיוצרים את מסד הנתונים, אי אפשר לשנות את המיקום.

  4. לוחצים על יצירת מסד נתונים.

gcloud

כדי ליצור מסד נתונים של Firestore, קודם צריך ליצור אפליקציית App Engine ואז להריץ את הפקודה gcloud firestore databases create:

gcloud app create --region=us-central
gcloud firestore databases create --region=us-central

אפשר להתעלם מהאזהרה us-central is not a valid Firestore location. ‫App Engine ו-Firestore תומכים באותם מיקומים, אבל האזור us-central (איווה) ב-App Engine ממופה לאזור nam5 (ארצות הברית) ב-Firestore.

יוצרים נושא Pub/Sub

במדריך הזה משתמשים ב-Pub/Sub כמקור אירועים. יוצרים נושא Pub/Sub כדי לפרסם בו הודעה. מידע נוסף על יצירה וניהול של נושאים

המסוף

  1. נכנסים לדף Topics של Pub/Sub במסוף Google Cloud .

    לדף Topics

  2. לוחצים על Create topic.

  3. בשדה Topic ID (מזהה הנושא), מזינים את הערך topic-callback.

  4. מאשרים את שאר הגדרות ברירת המחדל.

  5. לוחצים על יצירת נושא.

gcloud

כדי ליצור נושא, מריצים את הפקודה gcloud pubsub topics create:

gcloud pubsub topics create topic-callback

יצירת קטגוריה של Cloud Storage

במדריך הזה נעשה שימוש ב-Cloud Storage כמקור אירועים. יוצרים קטגוריה של Cloud Storage כדי להעלות אליה קובץ. מידע נוסף על יצירת מאגרי אחסון

המסוף

  1. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

    כניסה ל-Cloud Storage

  2. לוחצים על Create.

  3. בשדה Name (שם) של הקטגוריה, מזינים PROJECT_ID-bucket-callback.

    מזהה הפרויקט משמש בתהליך העבודה של callback-event-sample לזיהוי הקטגוריה.

  4. לוחצים על Continue.

  5. בקטע Location type, בוחרים באפשרות Region ואז באפשרות us-central1 (Iowa).

  6. מאשרים את שאר הגדרות ברירת המחדל.

  7. לוחצים על יצירה.

gcloud

כדי ליצור קטגוריה, מריצים את הפקודה gcloud storage buckets create:

gcloud storage buckets create gs://PROJECT_ID-bucket-callback \
    --location=us-central1

מזהה הפרויקט משמש בתהליך העבודה של callback-event-sample לזיהוי הקטגוריה.

אחרי שיוצרים את מקורות האירועים, אפשר לפרוס את תהליך העבודה של מקלט האירועים.

פריסת תהליך עבודה שמקשיב לאירועים

תהליך העבודה callback-event-listener מופעל כשמפרסמים הודעה בנושא Pub/Sub או כשמעלים קובץ לקטגוריה של Cloud Storage. תהליך העבודה מקבל את האירוע, מאחזר את פרטי הקריאה החוזרת המתאימים ממסד הנתונים של Firestore, ואז שולח בקשת HTTP לנקודת הקצה של הקריאה החוזרת.

המסוף

  1. נכנסים לדף Workflows במסוף Google Cloud :

    כניסה לדף Workflows

  2. לוחצים על Create.

  3. מזינים שם לתהליך העבודה החדש: callback-event-listener.

  4. ברשימה Region בוחרים באפשרות us-central1.

  5. בוחרים את חשבון השירות שיצרתם קודם.

  6. לוחצים על הבא.

  7. בעורך תהליכי העבודה, מזינים את ההגדרה הבאה לתהליך העבודה:

    main:
      params: [event]
      steps:
        - log_event:
            call: sys.log
            args:
              text: ${event}
              severity: INFO
        - init:
            assign:
              - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
              - event_source_tokens: ${text.split(event.source, "/")}
              - event_source_len: ${len(event_source_tokens)}
              - event_source: ${event_source_tokens[event_source_len - 1]}
              - doc_name: ${database_root + event_source}
        - get_document_for_event_source:
            try:
              call: googleapis.firestore.v1.projects.databases.documents.get
              args:
                name: ${doc_name}
              result: document
            except:
                as: e
                steps:
                    - known_errors:
                        switch:
                        - condition: ${e.code == 404}
                          return: ${"No callbacks for event source " + event_source}
                    - unhandled_exception:
                        raise: ${e}
        - process_callback_urls:
            steps:
              - check_fields_exist:
                  switch:
                  - condition: ${not("fields" in document)}
                    return: ${"No callbacks for event source " + event_source}
                  - condition: true
                    next: processFields
              - processFields:
                  for:
                      value: key
                      in: ${keys(document.fields)}
                      steps:
                          - extract_callback_url:
                              assign:
                                  - callback_url: ${document.fields[key]["stringValue"]}
                          - log_callback_url:
                              call: sys.log
                              args:
                                text: ${"Calling back url " + callback_url}
                                severity: INFO
                          - http_post:
                              call: http.post
                              args:
                                  url: ${callback_url}
                                  auth:
                                      type: OAuth2
                                  body:
                                      event: ${event}
  8. לוחצים על פריסה.

gcloud

  1. יוצרים קובץ קוד מקור לתהליך העבודה:

    touch callback-event-listener.yaml
  2. בכלי לעריכת טקסט, מעתיקים את זרימת העבודה הבאה לקובץ קוד המקור:

    main:
      params: [event]
      steps:
        - log_event:
            call: sys.log
            args:
              text: ${event}
              severity: INFO
        - init:
            assign:
              - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
              - event_source_tokens: ${text.split(event.source, "/")}
              - event_source_len: ${len(event_source_tokens)}
              - event_source: ${event_source_tokens[event_source_len - 1]}
              - doc_name: ${database_root + event_source}
        - get_document_for_event_source:
            try:
              call: googleapis.firestore.v1.projects.databases.documents.get
              args:
                name: ${doc_name}
              result: document
            except:
                as: e
                steps:
                    - known_errors:
                        switch:
                        - condition: ${e.code == 404}
                          return: ${"No callbacks for event source " + event_source}
                    - unhandled_exception:
                        raise: ${e}
        - process_callback_urls:
            steps:
              - check_fields_exist:
                  switch:
                  - condition: ${not("fields" in document)}
                    return: ${"No callbacks for event source " + event_source}
                  - condition: true
                    next: processFields
              - processFields:
                  for:
                      value: key
                      in: ${keys(document.fields)}
                      steps:
                          - extract_callback_url:
                              assign:
                                  - callback_url: ${document.fields[key]["stringValue"]}
                          - log_callback_url:
                              call: sys.log
                              args:
                                text: ${"Calling back url " + callback_url}
                                severity: INFO
                          - http_post:
                              call: http.post
                              args:
                                  url: ${callback_url}
                                  auth:
                                      type: OAuth2
                                  body:
                                      event: ${event}
  3. מריצים את הפקודה הבאה כדי לפרוס את תהליך העבודה:

    gcloud workflows deploy callback-event-listener \
        --source=callback-event-listener.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    מחליפים את SERVICE_ACCOUNT_NAME בשם של חשבון השירות שיצרתם קודם.

פריסת תהליך עבודה שממתין לאירועים

תהליך העבודה callback-event-sample שומר את פרטי הקריאה החוזרת במסד נתונים של Firestore, מפסיק את ההפעלה וממתין להתרחשות של אירועים ספציפיים.

המסוף

  1. נכנסים לדף Workflows במסוף Google Cloud :

    כניסה לדף Workflows

  2. לוחצים על Create.

  3. מזינים שם לתהליך העבודה החדש: callback-event-sample.

  4. ברשימה Region בוחרים באפשרות us-central1.

  5. בוחרים את חשבון השירות שיצרתם קודם.

  6. לוחצים על הבא.

  7. בעורך תהליכי העבודה, מזינים את ההגדרה הבאה לתהליך העבודה:

    main:
      steps:
        - init:
            assign:
              - pubsub_topic: topic-callback
              - storage_bucket: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "-bucket-callback"}
        - await_pubsub_message:
            call: await_callback_event
            args:
              event_source: ${pubsub_topic}
            result: pubsub_event
        - await_storage_bucket:
            call: await_callback_event
            args:
              event_source: ${storage_bucket}
            result: storage_event
        - return_events:
            return:
                pubsub_event: ${pubsub_event}
                storage_event: ${storage_event}
    
    await_callback_event:
        params: [event_source]
        steps:
            - init:
                assign:
                  - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
                  - doc_name: ${database_root + event_source}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
                  - firestore_key: ${"exec_" + text.split(execution_id, "-")[0]}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
                  body:
                    fields:
                      ${firestore_key}:
                        stringValue: ${callback_details.url}
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting 1hr for an event from source " + event_source}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for an event from source " + event_source}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - delete_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
            - check_null_event:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${callback_request.http_request.body.event}
            - return_event:
                return: ${callback_request.http_request.body.event}
  8. לוחצים על פריסה.

gcloud

  1. יוצרים קובץ קוד מקור לתהליך העבודה:

    touch callback-event-sample.yaml
  2. בכלי לעריכת טקסט, מעתיקים את זרימת העבודה הבאה לקובץ קוד המקור:

    main:
      steps:
        - init:
            assign:
              - pubsub_topic: topic-callback
              - storage_bucket: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "-bucket-callback"}
        - await_pubsub_message:
            call: await_callback_event
            args:
              event_source: ${pubsub_topic}
            result: pubsub_event
        - await_storage_bucket:
            call: await_callback_event
            args:
              event_source: ${storage_bucket}
            result: storage_event
        - return_events:
            return:
                pubsub_event: ${pubsub_event}
                storage_event: ${storage_event}
    
    await_callback_event:
        params: [event_source]
        steps:
            - init:
                assign:
                  - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
                  - doc_name: ${database_root + event_source}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
                  - firestore_key: ${"exec_" + text.split(execution_id, "-")[0]}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
                  body:
                    fields:
                      ${firestore_key}:
                        stringValue: ${callback_details.url}
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting 1hr for an event from source " + event_source}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for an event from source " + event_source}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - delete_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
            - check_null_event:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${callback_request.http_request.body.event}
            - return_event:
                return: ${callback_request.http_request.body.event}
  3. מריצים את הפקודה הבאה כדי לפרוס את תהליך העבודה:

    gcloud workflows deploy callback-event-sample \
        --source=callback-event-sample.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    מחליפים את SERVICE_ACCOUNT_NAME בשם של חשבון השירות שיצרתם קודם.

יצירת טריגר Eventarc לניתוב אירועים של Pub/Sub

טריגר Eventarc מאפשר לכם לנתב אירועים על ידי ציון מסננים לטריגר, כולל מקור האירוע ותהליך העבודה של היעד. יוצרים טריגר Eventarc כדי להפעיל את תהליך העבודה callback-event-listener כתוצאה מפרסום הודעה בנושא Pub/Sub. מידע נוסף על הפעלת תהליך עבודה

המסוף

  1. נכנסים לדף Eventarc במסוף Google Cloud .

    מעבר אל Eventarc

  2. לוחצים על Create trigger (יצירת ביטוי להפעלה).

  3. מקלידים Trigger name.

    לדוגמה, trigger-pubsub-events-listener.

  4. ברשימה Event provider, בוחרים באפשרות Cloud Pub/Sub.

  5. ברשימה Event (אירוע), בקטע Custom (מותאם אישית), בוחרים באפשרות google.cloud.pubsub.topic.v1.messagePublished.

  6. ברשימה Select a Cloud Pub/Sub topic, בוחרים את הנושא שיצרתם קודם.

  7. ברשימה Region, בוחרים באפשרות us-central1 (Iowa).

  8. אם מתבקשים, מקצים את התפקיד iam.serviceAccountTokenCreator לחשבון השירות של Pub/Sub.

  9. בוחרים את חשבון השירות שיצרתם קודם.

  10. ברשימה Event destination בוחרים באפשרות Workflows.

  11. ברשימה Select a workflow, בוחרים את זרימת העבודה callback-event-listener.

  12. לוחצים על יצירה.

gcloud

כדי ליצור טריגר, מריצים את הפקודה gcloud eventarc triggers create:

gcloud eventarc triggers create trigger-pubsub-events-listener \
    --location=us-central1 \
    --destination-workflow=callback-event-listener \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --transport-topic=topic-callback \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

האירועים עוברים טרנספורמציה ומועברים להרצת תהליך העבודה כארגומנטים של זמן הריצה. שימו לב: יכול להיות שיחלפו עד 2 דקות עד שהטריגר החדש יהפוך לפעיל.

יצירת טריגר Eventarc לניתוב אירועים של Cloud Storage

טריגר Eventarc מאפשר לכם לנתב אירועים על ידי ציון מסננים לטריגר, כולל מקור האירוע ותהליך העבודה של היעד. יוצרים טריגר Eventarc כדי להפעיל את תהליך העבודה callback-event-listener כתוצאה מהעלאת קובץ לקטגוריה של Cloud Storage. מידע נוסף על הפעלת תהליך עבודה

המסוף

  1. נכנסים לדף Eventarc במסוף Google Cloud .

    מעבר אל Eventarc

  2. לוחצים על Create trigger (יצירת ביטוי להפעלה).

  3. מקלידים Trigger name.

    לדוגמה, trigger-storage-events-listener.

  4. ברשימה Event provider, בוחרים באפשרות Cloud Storage.

  5. ברשימת האירועים, בקטע ישיר, בוחרים באפשרות google.cloud.storage.object.v1.finalized.

  6. ברשימה Bucket, מחפשים את הקטגוריה שיצרתם קודם ובוחרים אותה.

  7. ברשימה Region, בהתאם לקטגוריה של Cloud Storage, מאשרים את ברירת המחדל us-central1 (Iowa).

  8. אם תתבקשו, תצטרכו להקצות את התפקיד iam.serviceAccountTokenCreator לחשבון השירות של Pub/Sub.

  9. בוחרים את חשבון השירות שיצרתם קודם.

  10. ברשימה Event destination בוחרים באפשרות Workflows.

  11. ברשימה Select a workflow, בוחרים את זרימת העבודה callback-event-listener.

  12. לוחצים על יצירה.

gcloud

כדי ליצור טריגר, מריצים את הפקודה gcloud eventarc triggers create:

gcloud eventarc triggers create trigger-storage-events-listener \
    --location=us-central1 \
    --destination-workflow=callback-event-listener \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=PROJECT_ID-bucket-callback" \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

האירועים עוברים טרנספורמציה ומועברים להרצת תהליך העבודה כארגומנטים של זמן הריצה. שימו לב: יכול להיות שיחלפו עד 2 דקות עד שהטריגר החדש יהפוך לפעיל.

הפעלת תהליך העבודה הראשי

כשמריצים תהליך עבודה, מופעלת ההגדרה הנוכחית של תהליך העבודה שמשויכת ל-workflow. מפעילים את תהליך העבודה callback-event-sample. זהו תהליך העבודה הראשי, והוא ממתין להתרחשות של אירועים ספציפיים. הוא ימשיך לפעול רק כשבתהליך העבודה המשני יתבצעו בקשות מתאימות להחזרת נתונים.

המסוף

  1. נכנסים לדף Workflows במסוף Google Cloud .

    כניסה לדף Workflows

  2. בדף Workflows (תהליכי עבודה), לוחצים על תהליך העבודה callback-event-sample כדי לעבור לדף הפרטים שלו.

  3. בדף פרטי תהליך העבודה, לוחצים על הפעלה.

  4. לוחצים שוב על Execute.

    הביצוע של תהליך העבודה מתחיל. במהלך ההרצה, אמור להופיע מצב ההרצה Running ורשומה ביומן שדומה לזו: Started waiting 1hr for an event from source topic-callback.

gcloud

כדי להפעיל תהליך עבודה, מריצים את הפקודה gcloud workflows run:

gcloud workflows run callback-event-sample \
    --location=us-central1

הביצוע של תהליך העבודה מתחיל. במהלך הביצוע, אמור להופיע סטטוס ביצוע שדומה לזה:

Waiting for execution [a848a164-268a-449c-b2fe-396f32f2ed66] to complete...working...

יצירת אירועים ובדיקת סטטוס הביצוע

כדי לוודא שהתוצאות הן כמו שציפיתם, אתם יכולים ליצור אירועים, לצפות ברשומות ביומן ולבדוק את סטטוס ההפעלה של תהליך העבודה.

פרסום הודעה

מפרסמים הודעה בנושא Pub/Sub שיצרתם קודם.

המסוף

  1. נכנסים לדף Topics של Pub/Sub במסוף Google Cloud .

    לדף Topics

  2. לוחצים על topic-callback.

  3. לוחצים על הכרטיסייה הודעות.

  4. לוחצים על פרסום ההודעה.

  5. בשדה גוף ההודעה, מזינים Hello World.

  6. לוחצים על פרסום.

gcloud

כדי לפרסם הודעה, משתמשים בפקודה gcloud pubsub topics publish:

gcloud pubsub topics publish topic-callback \
    --message="Hello World"

העלאת אובייקט

מעלים קובץ לקטגוריה של Cloud Storage שיצרתם קודם.

המסוף

  1. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

    כניסה לדף Buckets

  2. לוחצים על שם הקטגוריה שיצרתם קודם.

  3. בכרטיסייה Objects, מבצעים אחת מהפעולות הבאות:

    • גוררים את הקובץ הרצוי משולחן העבודה או ממנהל הקבצים ומשחררים אותו בחלונית הראשית של Google Cloud המסוף.

    • לוחצים על העלאת קבצים, בוחרים את הקובץ שרוצים להעלות ואז לוחצים על פתיחה.

gcloud

כדי להעלות קובץ, מריצים את הפקודה gcloud storage cp:

gcloud storage cp OBJECT_LOCATION gs://PROJECT_ID-bucket-callback/

מחליפים את OBJECT_LOCATION בנתיב המקומי לאובייקט. לדוגמה, random.txt.

הצגת רשומות ביומן וסטטוס הביצוע

מוודאים שתהליך העבודה callback-event-sample הושלם בהצלחה.

המסוף

  1. נכנסים לדף Workflows במסוף Google Cloud .

    כניסה לדף Workflows

  2. בדף Workflows (תהליכי עבודה), לוחצים על תהליך העבודה callback-event-sample כדי לעבור לדף הפרטים שלו.

  3. בדף פרטי תהליך העבודה, כדי לאחזר את הפרטים של ביצוע מסוים, לוחצים על מזהה הביצוע המתאים.

    מצב ההפעלה צריך להיות Succeeded, ובחלונית Output אמורים להופיע האירועים שהתקבלו מ-Pub/Sub ומ-Cloud Storage.

gcloud

  1. מסננים את רשומות היומן ומחזירים את הפלט בפורמט JSON:

    gcloud logging read "resource.type=workflows.googleapis.com/Workflow AND textPayload:calling OR textPayload:waiting" \
        --format=json
  2. מחפשים רשומות ביומן שדומות ל:

    "textPayload": "Stopped waiting for an event from source..."
    "textPayload": "Calling back url https://workflowexecutions.googleapis.com/v1/projects/..."
    "textPayload": "Started waiting 1hr for an event from source..."
    
  3. בודקים את הסטטוס של ניסיון ההפעלה האחרון:

    gcloud workflows executions wait-last

    התוצאה אמורה להיות דומה לזו:

    Using cached execution name: projects/1085953646031/locations/us-central1/workflows/callback-event-sample/executions/79929e4e-82c1-4da1-b068-f828034c01b7
    Waiting for execution [79929e4e-82c1-4da1-b068-f828034c01b7] to complete...done.
    [...]
    state: SUCCEEDED
    

הסרת המשאבים

אם יצרתם פרויקט חדש בשביל המדריך הזה, תמחקו את הפרויקט. אם השתמשתם בפרויקט קיים ואתם רוצים לשמור אותו בלי השינויים שנוספו במדריך הזה, תצטרכו למחוק את המשאבים שנוצרו לצורך המדריך.

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת משאבים שנוצרו במדריך הזה

  1. מחיקת נתונים מ-Firestore

  2. מחיקה של נושא Pub/Sub

  3. מחיקת קטגוריה של Cloud Storage.

  4. מחיקת טריגר של Eventarc

  5. מחיקת תהליך עבודה

המאמרים הבאים