קבלת אירועים מ-Pub/Sub בנקודת קצה (endpoint) פנימית של HTTP ברשת VPC

במדריך הזה נסביר איך ליצור נקודת קצה פנימית של HTTP ברשת של ענן וירטואלי פרטי (VPC) שמקבלת אירועים של הודעות Pub/Sub באמצעות Eventarc. מידע נוסף על יעד האירועים הזה זמין במאמר ניתוב אירועים לנקודת קצה פנימית של HTTP ברשת VPC.

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

מטרות

במדריך הזה תלמדו:

  1. יוצרים רשת VPC כדי לספק רשת למשאבים ולשירותים מבוססי-ענן. רשת VPC מבודדת באופן לוגי מרשתות אחרות ב- Google Cloud.
  2. יוצרים רשת משנה. כל רשת VPC מורכבת מטווח אחד או יותר של כתובות IP שנקראות תת-רשתות. תת-רשתות הן משאבים אזוריים, ויש להן טווחי כתובות IP שמשויכים אליהן.
  3. יוצרים כללי חומת אש ב-VPC כדי לאפשר או לחסום תעבורת נתונים אל מכונות וירטואליות (VM) ברשת ה-VPC או מהן.
  4. יוצרים קובץ מצורף לרשת שמאפשר לרשת VPC של יצרן ליזום חיבורים לרשת VPC של צרכן.
  5. יוצרים מכונה וירטואלית ב-Compute Engine ברשת ה-VPC.
  6. פורסים שרת אינטרנט כשירות לקבלת אירועים במופע של המכונה הווירטואלית.
  7. יוצרים טריגר Eventarc שמנתב אירועים של Pub/Sub למקלט האירועים במכונה הווירטואלית.
  8. יוצרים חיבור SSH למכונת ה-VM.
  9. מפרסמים הודעה בנושא Pub/Sub כדי ליצור אירוע, ומציגים את תוכן האירוע בכלי SSH בדפדפן.

עלויות

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

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

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

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

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

  1. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

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

  7. מפעילים את ממשקי ה-API של Compute Engine,‏ Eventarc ו-Pub/Sub, אם הם עדיין לא מופעלים:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable compute.googleapis.com eventarc.googleapis.com pubsub.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  10. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  11. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

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

  13. מפעילים את ממשקי ה-API של Compute Engine,‏ Eventarc ו-Pub/Sub, אם הם עדיין לא מופעלים:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable compute.googleapis.com eventarc.googleapis.com pubsub.googleapis.com
  14. מעדכנים את הרכיבים של Google Cloud CLI:
    gcloud components update
  15. נכנסים באמצעות החשבון:
    gcloud auth login
  16. מגדירים את משתני ההגדרה שבהם נעשה שימוש במדריך הזה להתחלה מהירה:
    REGION=us-central1
    ZONE=us-central1-a
  17. אם אתם יוצרי הפרויקט, מוקצה לכם תפקיד הבעלים הבסיסי (roles/owner). כברירת מחדל, תפקיד ניהול הזהויות והרשאות הגישה (IAM) הזה כולל את ההרשאות שנדרשות לגישה מלאה לרוב המשאבים Google Cloud, ואפשר לדלג על השלב הזה.

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

    ההרשאות הנדרשות

    כדי לקבל את ההרשאות שדרושות לביצוע ההפעלה המהירה הזו, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

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

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

  18. אם הפעלתם את סוכן השירות של Cloud Pub/Sub ב-8 באפריל 2021 או לפני כן, כדי לתמוך בבקשות push מאומתות של Pub/Sub, צריך להקצות לסוכן השירות את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator). אחרת, התפקיד הזה מוענק כברירת מחדל:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    מחליפים את מה שכתוב בשדות הבאים:
    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
    • ‫PROJECT_NUMBER: מספר הפרויקט ב- Google Cloud . אפשר לראות את מספר הפרויקט בדף Welcome במסוף Google Cloud או על ידי הרצת הפקודה הבאה:
      gcloud projects describe PROJECT_ID --format='value(projectNumber)'

יצירת רשת VPC במצב מותאם אישית

רשת VPC היא גרסה וירטואלית של רשת פיזית שמוטמעת בתוך רשת הייצור של Google. הוא מספק קישוריות למכונות הווירטואליות שלכם ב-Compute Engine.

כשיוצרים רשת VPC במצב מותאם אישית, לא נוצרות רשתות משנה באופן אוטומטי. סוג הרשת הזה מאפשר לכם שליטה מלאה ברשתות המשנה ובטווחים של כתובות ה-IP שלה.

gcloud compute networks create NETWORK_NAME \
    --subnet-mode=custom \
    --bgp-routing-mode=regional \
    --mtu=1460

מחליפים את NETWORK_NAME בשם של רשת ה-VPC.

שימו לב לנקודות הבאות:

  • לכל רשת חדשה שיוצרים צריך להיות שם ייחודי באותו פרויקט.
  • מצב הניתוב Border Gateway Protocol (BGP) קובע את ההתנהגות של נתבי Cloud ברשת, ויכול להיות global או regional. ערך ברירת המחדל הוא regional.
  • יחידת השידור המקסימלית (MTU) היא גודל החבילה הגדול ביותר ברשת. אפשר להגדיר את ה-MTU לכל ערך מ-1300 עד 8896. ערך ברירת המחדל הוא 1460. לפני שמגדירים את ה-MTU לערך גבוה מ-1460, כדאי לעיין במאמר בנושא יחידת שידור מקסימלית.

מידע נוסף זמין במאמר בנושא יצירה וניהול של רשתות VPC.

יצירת רשת משנה עם כתובות IPv4 בלבד

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

כשיוצרים רשת משנה, מגדירים שם, אזור ולפחות טווח כתובות IPv4 ראשי בהתאם לכללים של רשת המשנה. שימו לב: אי אפשר ליצור מופעים באזור שלא הוגדרה בו רשת משנה.

gcloud compute networks subnets create SUBNET_NAME \
    --region=$REGION \
    --network=NETWORK_NAME \
    --range=10.10.10.0/24

מחליפים את SUBNET_NAME בשם של רשת המשנה החדשה.

מידע נוסף זמין במאמר בנושא רשתות משנה.

יצירת כללים לחומת אש ב-VPC

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

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

  1. יוצרים כלל חומת אש לרשת ה-VPC שמאפשר תעבורת נתונים נכנסת (ingress) מכל כתובת IPv4 ‏(0.0.0.0/0) לכל מכונה ברשת באמצעות יציאה 22. הכלל הזה לא נדרש למסירת אירועים. עם זאת, לצורך המדריך הזה, צריך ליצור את הכלל כדי שתוכלו להתחבר למכונה הווירטואלית באמצעות SSH ולאשר את מסירת האירוע:

    gcloud compute firewall-rules create RULE_NAME_ONE \
        --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \
        --direction=INGRESS \
        --priority=65534 \
        --action=ALLOW \
        --source-ranges=0.0.0.0/0 \
        --rules=tcp:22
  2. יוצרים כלל חומת אש לרשת VPC שמאפשר תעבורת נתונים נכנסת (ingress) מטווח כתובות IP ספציפי לכל מכונה ברשת באמצעות יציאה 80 (כי תפרסו שרת אינטרנט במכונה הווירטואלית שמקשיב ביציאה 80):

    gcloud compute firewall-rules create RULE_NAME_TWO \
        --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \
        --direction=INGRESS \
        --priority=1000 \
        --action=ALLOW \
        --source-ranges=10.10.10.0/24 \
        --rules=tcp:80

    מחליפים את RULE_NAME_ONE ואת RULE_NAME_TWO בשמות ייחודיים לכללי חומת האש.

    שימו לב: השימוש ב---source-ranges הוא אופציונלי, והוא מציין רשימה של בלוקים של כתובות IP שמורשים ליצור חיבורים נכנסים שתואמים לכלל חומת האש למכונות ברשת. במקרה הזה, הטווח תואם לטווח שבו נעשה שימוש ברשת המשנה שיצרתם קודם.

    מומלץ להשתמש בדגל כדי להחיל את כלל חומת האש באופן ספציפי על התנועה ב-Eventarc. אם לא מציינים את --source-ranges ולא את --source-tags, ערך ברירת המחדל של --source-ranges הוא 0.0.0.0/0, כלומר הכלל חל על כל חיבורי IPv4 נכנסים מתוך הרשת או מחוצה לה.

מידע נוסף על שימוש בכללים של חומת האש ב-VPC

יצירת קובץ מצורף לרשת

צירוף רשת הוא משאב שמאפשר לרשת VPC של יצרן ליזום חיבורים לרשת VPC של צרכן דרך ממשק Private Service Connect.

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

אתם יכולים ליצור מחבר רשת שיקבל באופן אוטומטי חיבורים מכל ממשק Private Service Connect שמפנה למחבר הרשת. יוצרים את מחבר הרשת באותה רשת ובאותו אזור שמכילים את שירות היעד של HTTP.

gcloud compute network-attachments create ATTACHMENT_NAME \
    --region=$REGION \
    --subnets=SUBNET_NAME \
    --connection-preference=ACCEPT_AUTOMATIC

מחליפים את ATTACHMENT_NAME בשם של רכיב הרשת.

מידע נוסף זמין במאמר בנושא קובצי רשת מצורפים.

יצירת מכונה וירטואלית ברשת משנה ספציפית

מכונה וירטואלית ב-Compute Engine היא מכונה וירטואלית שמארחת בתשתית של Google. המונחים מכונה של Compute Engine ‏(Compute Engine instance), מכונת VM‏ (VM instance) ו-VM הם מילים נרדפות ומשמשים לסירוגין. מכונות וירטואליות כוללות אשכולות של Google Kubernetes Engine‏ (GKE), מכונות עם סביבה גמישה של App Engine ו Google Cloud מוצרים אחרים שנבנו על מכונות וירטואליות של Compute Engine.

יוצרים מכונה וירטואלית ב-Compute Engine ברשת ה-VPC שאליה אפשר לפרוס שירות לקבלת אירועים.

gcloud compute instances create INSTANCE_NAME \
      --zone=$ZONE \
      --machine-type=e2-medium \
      --subnet=SUBNET_NAME

מחליפים את INSTANCE_NAME בשם של המכונה הווירטואלית.

מידע נוסף זמין במאמר יצירה והפעלה של מכונה וירטואלית.

פריסת מקלט אירועים במכונה הווירטואלית

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

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

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

  2. בחלון הטרמינל של SSH בתוך הדפדפן, יוצרים קובץ טקסט עם שם הקובץ server.py שמכיל את קוד Python הבא:

    #!/usr/bin/env python3
    from http.server import BaseHTTPRequestHandler, HTTPServer
    import logging
    
    class S(BaseHTTPRequestHandler):
        def _set_response(self):
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
    
        def do_GET(self):
            logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
            self._set_response()
            self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))
    
        def do_POST(self):
            content_length = int(self.headers['Content-Length'])
            post_data = self.rfile.read(content_length)
            logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
                    str(self.path), str(self.headers), post_data.decode('utf-8'))
    
            self._set_response()
            self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
    
    def run(server_class=HTTPServer, handler_class=S, port=80):
        logging.basicConfig(level=logging.INFO)
        server_address = ('', port)
        http_server = server_class(server_address, handler_class)
        logging.info('Starting HTTP Server at port %d...\n', port)
        try:
            http_server.serve_forever()
        except KeyboardInterrupt:
            pass
        http_server.server_close()
        logging.info('Stopping HTTP Server...\n')
    
    if __name__ == '__main__':
        from sys import argv
    
        if len(argv) == 2:
            run(port=int(argv[1]))
        else:
            run()
  3. מפעילים את השרת ומשאירים אותו פועל לשלבים הבאים במדריך הזה:

    sudo python3 server.py
    

יצירת טריגר Eventarc

יוצרים טריגר Eventarc שיוצר נושא חדש ב-Pub/Sub ומנתב אירועים אל מקבל האירועים שנפרס במכונה הווירטואלית כשמתפרסמת הודעה בנושא ב-Pub/Sub.

אחרי שמפעילים את Compute Engine API, חשבון השירות שמוגדר כברירת מחדל הוא חשבון השירות של Compute Engine שמוגדר כברירת מחדל (PROJECT_NUMBER-compute@developer.gserviceaccount.com). לצורך בדיקות, הטריגר משתמש בחשבון השירות הזה שמוגדר כברירת מחדל לצורך הזדהות.

gcloud eventarc triggers create TRIGGER_NAME \
    --location=$REGION \
    --destination-http-endpoint-uri=http://INSTANCE_NAME.$ZONE.c.PROJECT_ID.internal \
    --network-attachment="projects/PROJECT_ID/regions/$REGION/networkAttachments/ATTACHMENT_NAME" \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

מחליפים את PROJECT_NUMBER במספר הפרויקט ב- Google Cloud. אפשר לראות את מספר הפרויקט בדף Welcome במסוף Google Cloud או על ידי הרצת הפקודה הבאה:

gcloud projects describe PROJECT_ID --format='value(projectNumber)'

מידע נוסף על הגדרת הטריגר זמין במאמר בנושא ניתוב אירועים לנקודת קצה פנימית של HTTP ברשת VPC.

יצירה והצגה של אירוע בנושא Pub/Sub

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

  1. מאתרים ומגדירים את נושא ה-Pub/Sub כמשתנה סביבה:

    export MY_TOPIC=$(gcloud eventarc triggers describe TRIGGER_NAME \
        --location=$REGION \
        --format='value(transport.pubsub.topic)')
  2. כדי ליצור אירוע, מפרסמים הודעה בנושא Pub/Sub:

    gcloud pubsub topics publish $MY_TOPIC --message "Hello World"

    הטריגר של Eventarc מעביר את האירוע לנקודת הקצה הפנימית של HTTP ברשת ה-VPC. בחלון הטרמינל של SSH בתוך הדפדפן, מוצג גוף האירוע. הוא אמור להיראות כך:

    Body:
    {
        "message": {
            "data": "SGVsbG8gV29ybGQ=",
            "messageId": "8795720366614192",
            "publishTime": "2023-08-26T13:09:48Z"
        }
    }
    
    10.10.10.3 - - [26/Aug/2023 13:09:49] "POST / HTTP/1.1" 200 -
    

    שימו לב שאם מפענחים את הערך data של SGVsbG8gV29ybGQ= מפורמט Base64, מוחזר הערך Hello World.

הצלחתם לפרוס שירות לקבלת אירועים לנקודת קצה פנימית של HTTP ברשת VPC, ליצור טריגר Eventarc, ליצור אירוע מ-Pub/Sub ולאשר שהאירוע הועבר כמצופה על ידי הטריגר לנקודת היעד.

הסרת המשאבים

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

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

    כדי למחוק Google Cloud פרויקט:

    gcloud projects delete PROJECT_ID

מחיקת משאבים בודדים

  1. מוחקים את הטריגר של Eventarc:
    gcloud eventarc triggers delete TRIGGER_NAME --location=$REGION
  2. מוחקים את המכונה:
    gcloud compute instances delete INSTANCE_NAME
  3. מוחקים את הקובץ המצורף לרשת:
    gcloud compute network-attachments delete ATTACHMENT_NAME --region=$REGION
  4. מוחקים את הכללים של חומת האש:
    gcloud compute firewall-rules delete RULE_NAME_ONE
    gcloud compute firewall-rules delete RULE_NAME_TWO
  5. מוחקים את תת-הרשת:
    gcloud compute networks subnets delete SUBNET_NAME --region=$REGION
  6. מחיקת רשת ה-VPC:
    gcloud compute networks delete NETWORK_NAME

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