אירוח יעדים של webhooks

במדריך הזה מוסבר איך לארח יעד של webhook בשירות Cloud Run.

‫Cloud Run מספק פתרונות טובים לאירוח של יעדי ה-webhook. ‫Cloud Run מספק גמישות רבה יותר ויכול להתמודד עם נפחים גדולים יותר של נתונים במקביל.

אירוח יעדי webhook בשירות Cloud Run אידיאלי עבור התרחישים הבאים:

  • אתם רוצים זמן קצובים יותר לבקשות (עד 60 דקות)
  • אתם מצפים לנפח גדול של נתונים וצריכים תמיכה בפעולות בו-זמניות (עד 1,000 בקשות בו-זמנית לכל מופע)

יצירת יעד של webhook ב-Cloud Run

באמצעות Cloud Run, אתם יכולים להגדיר יעד של webhook בכל שפה שתבחרו. צריך רק ליצור נקודת קצה (endpoint) של HTTP שיכולה לקבל את הנתונים. בדרך כלל עושים את זה עם POST, לדוגמה:

from flask import Flask, request
app = Flask(__name__)

@app.route('/', methods=['POST'])
def index():
    data = request.get_json()
    return ('', 200)

בדוגמה הזו, דף האינדקס של כתובת ה-URL מוגדר לקבל רק בקשות POST, והמערכת מצפה שהנתונים יועברו דרך מטען ייעודי (payload) של JSON.

שילוב עם ספק ה-webhook

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

@app.route('/', methods=['POST'])
def index():
    data = request.get_json()
    return data['challenge']

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

אישור בקשות

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

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

בעת אחסון עותק הסוד כמשתנה סביבה, לכל בקשה צריך להיות סוד או אסימון בכותרות הבקשה או במטען ה-JSON, ועליך לבדוק אותו כדי לוודא שהמקור תקין.

import os
from flask import request

@app.route('/', methods=['POST'])
def index():
    request_secret = request.headers.get('Secret')
    if request_secret != os.environ.get('SECRET'):
        return ('Unauthorized', 401)
    return ('', 200)

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

מענה לבקשות

רוב השירותים דורשים ממך להגיב לבקשה תוך פרק זמן מוגדר, כפי שצוין על ידי השירות. חלק מה-webhook כוללים שיטות מובנות לניסיון חוזר אם יש תגובת שגיאה, כמו קוד סטטוס של HTTP של 4xx או 5xx. לכן, צריך להחזיר קוד סטטוס של הצלחה (2xx) כדי שהשירות יידע שהאירוע עובד כמו שצריך.

@app.route('/', methods=['POST'])
def index():
    data = request.get_json()
    return ('', 200)

פסקי זמן

גם ל-Cloud Run וגם לספק ה-webhook יש פסק זמן. הקצר מבין השניים יחול על בקשתך. אם עיבוד הנתונים חורג מהזמן שהוקצה על ידי Cloud Run או ספק ה-webhook, תצטרכו להשתמש במוצר שמאפשר לכם להשלים את העיבוד באופן אסינכרוני, כמו Pub/Sub או Cloud Tasks. המוצרים האלה מאפשרים להעביר את הנתונים במהירות, להחזיר מיד תגובת הצלחה לספק ה-webhook ולהמשיך את העיבוד בלי לדאוג לגבי פסק זמן. אלו גם אפשרויות טובות לטיפול בכשלים ובניסיונות חוזרים.

תבניות נפוצות של תגובות לפעולות מאתרים אחרים (webhooks)

סוג דוגמאות
העברת נתונים שליחת הודעה באמצעות העברת הודעות בענן ב-Firebase בכל פעם שמתבצעת קריאה ל-webhook.
אחסון נתונים אחסון הנתונים ב-BigQuery לניתוח מאוחר יותר.
פעולות מפעילות ביצוע פעולות ב-Dialogflow, פרסום תגובות בטוויטר, או דחיפה לסביבת השלבים שלך בכל פעם שמתבצע קוד חדש ב-GitHub.

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