הגדרת הגדרות רשת (דור ראשון)

הגדרות הרשת של פונקציות Cloud Run מאפשרות לכם לשלוט בתעבורת נתונים נכנסת (ingress) ויוצאת (egress) אל פונקציות בודדות ומפונקציות בודדות. לדוגמה, אפשר להשתמש בהגדרות הרשת בתרחישי השימוש הבאים:

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

פרטים נוספים על תרחישים לדוגמה מופיעים בקטע תרחישים לדוגמה.

הגדרות של תעבורת נתונים נכנסת (ingress)

הגדרות התעבורה הנכנסת (ingress) קובעות אם משאבים מחוץ לפרויקט Google Cloud או לגבולות גזרה לשירות VPC Service Controls יכולים להפעיל פונקציה.

כדי שמשאב יהיה כפוף למדיניות של היקף VPC Service Controls, הוא צריך להיות חלק מהשירות שרוצים להגביל. בפונקציות Cloud Run (דור ראשון), השירות המוגבל הוא Cloud Functions API.

מגבלות

אפשר להפעיל פונקציות מבוססות-HTTP שמוגבלות לשימוש פנימי רק באמצעות בקשות HTTP שנוצרות ברשת VPC, כמו בקשות מ-Kubernetes Engine, מ-Compute Engine, מהסביבה הגמישה של App Engine, או מבקשות שנוצרות על ידי Cloud Scheduler,‏ Cloud Tasks,‏ Workflows או משאבי BigQuery שנמצאים באותו פרויקט או באותו VPC Service Controls perimeter. המשמעות היא שבקשות HTTP שנוצרו על ידי או מנותבות דרך Pub/Sub או Eventarc לא יכולות להפעיל את הפונקציות האלה. טריגרים של אירועים נחשבים תמיד כ'פנימיים' ומותרים לשימוש ללא קשר להגדרת הכניסה.

הגדרת תעבורת נתונים נכנסת (ingress)

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

  • מתן הרשאה לכל התנועה: ברירת המחדל. כל הבקשות הנכנסות לפונקציה מותרות, גם מהאינטרנט וגם ממשאבים באותו פרויקט.
  • אפשרות גישה רק לתעבורה פנימית: מותרת רק תעבורה מ-Cloud Scheduler,‏ Cloud Tasks,‏ Eventarc,‏ Workflows,‏ BigQuery ורשתות VPC באותו פרויקט או בגבולות גזרה של VPC Service Controls. כל הבקשות האחרות נדחות עם השגיאה 404.

    אם הבקשות מגיעות מ-VPC משותף, חשוב לשים לב לנקודות הבאות:

    • התנועה נחשבת פנימית אם הפונקציה נפרסת בפרויקט המארח של ה-VPC המשותף.
    • תנועה נחשבת פנימית אם הפרויקט המארח של ה-VPC המשותף וכל פרויקטי השירות ממוקמים בתוך אותו perimeter של VPC Service Controls.
    • כל תעבורה אחרת מרשתות VPC משותפות נדחית.
  • אפשר לאפשר תעבורה פנימית ותעבורה מ-Cloud Load Balancing: תעבורה מ-Cloud Scheduler,‏ Cloud Tasks,‏ Eventarc,‏ Workflows,‏ BigQuery ורשתות VPC באותו פרויקט או בהיקף של VPC Service Controls מותרת. התנועה מ-Cloud Load Balancing מותרת.

אפשר לציין הגדרות של תעבורת נכנסת כשפורסים או מעדכנים את הפונקציה באמצעות מסוף Google Cloud ,‏ Google Cloud CLI או Terraform:

המסוף

  1. פותחים את הדף Functions Overview במסוף Google Cloud :

    כניסה לדף Cloud Run functions Overview

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

  3. לוחצים על Runtime, build ...‎ כדי להרחיב את ההגדרות המתקדמות.

  4. בקטע Connections (חיבורים), בוחרים ערך לIngress settings (הגדרות כניסה).

gcloud

משתמשים בפקודה gcloud functions deploy כדי לפרוס או לעדכן את הפונקציה ומציינים את הדגל --ingress-settings:

  gcloud functions deploy FUNCTION_NAME 
--trigger-http
--ingress-settings INGRESS_SETTINGS
FLAGS...

where:

  • FUNCTION_NAME הוא השם של הפונקציה.
  • INGRESS_SETTINGS הוא אחד מהערכים הנתמכים של הגדרות הכניסה. הערכים האפשריים הם:

    • all
    • internal-only
    • internal-and-gclb: מאפשר תנועה פנימית וגם תנועה שנשלחת לכתובת IP ציבורית שנחשפת על ידי Cloud Load Balancing. חסימת תנועה שנשלחת אל cloudfunctions.net או אל כל דומיין מותאם אישית שהוגדר באמצעות פונקציות של Cloud Run. ההגדרה מונעת מהמשתמשים לעקוף את אמצעי בקרת הגישה (Cloud Armor, ‏ IAP) שהם מגדירים באמצעות Cloud Load Balancing.
  • FLAGS... מתייחס לדגלים אחרים שמועברים אל הפקודה deploy.

Terraform

זה שינוי אופציונלי. כדי לעדכן את השדה של הגדרות הכניסה בקובץ main.tf של משאב Terraform, צריך לכלול את הארגומנט ingress_settings שרוצים לפרוס או לעדכן. ביצוע שינויים בהגדרות הכניסה יוצר מחדש את הפונקציה.

  1. בקובץ main.tf, מאתרים את המשאב שרוצים להגביל את הגדרות הכניסה שלו ומעדכנים אותו להגדרה הרצויה, לדוגמה:

    resource "google_cloudfunctions_function" "function" {
      name             = "function"
      location         = "us-central1"
      description      = "Sample function"
      ingress_settings = "INGRESS_SETTINGS"
    }

    כאשר INGRESS_SETTINGS הוא אחד מהערכים הנתמכים של הגדרות הכניסה. הערכים האפשריים הם:

    • ALLOW_ALL (ברירת מחדל): כל הבקשות הנכנסות לפונקציה מותרות, גם מהאינטרנט וגם ממשאבים באותו פרויקט.
    • ALLOW_INTERNAL_ONLY: מותרת רק תעבורה מ-Cloud Scheduler, מ-Cloud Tasks, מ-Eventarc, מ-Workflows ומ-VPC networks באותו פרויקט או בגבולות של VPC Service Controls.
    • ALLOW_INTERNAL_AND_GCLB: מאפשר תנועה פנימית וגם תנועה שנשלחת לכתובת IP ציבורית שנחשפת על ידי Cloud Load Balancing. חסימת תעבורת נתונים שנשלחת אל cloudfunctions.net או אל כל דומיין מותאם אישית שהוגדר באמצעות פונקציות Cloud Run. ההגדרה מונעת מהמשתמשים לעקוף את אמצעי בקרת הגישה (Cloud Armor, ‏ IAP) שהם מגדירים באמצעות Cloud Load Balancing.

אם אתם משתמשים ב-Google Cloud Armor עם Cloud Load Balancing, אתם יכולים ליצור מדיניות אבטחה שמסננת תנועה על סמך תנאים כמו כתובת ה-IP של בקשה נכנסת, טווח ה-IP, קוד האזור או כותרות הבקשה. מידע נוסף זמין במאמר סקירה כללית על מדיניות האבטחה של Google Cloud Armor.

הגדרות של תעבורת נתונים יוצאת (egress)

הגדרות היציאה קובעות את הניתוב של בקשות HTTP יוצאות מפונקציה. כדי לציין הגדרות של תעבורת נתונים יוצאת (egress), צריך לקשר את הפונקציה לרשת VPC באמצעות מחבר של חיבור לרשת (VPC) מאפליקציית serverless. הגדרות היציאה קובעות מתי התנועה מנותבת דרך המחבר ברשת ה-VPC.

מגבלות

  • חיבור לרשת (VPC) מאפליקציית serverless תומך רק בהפניית תנועה של IPv4. תעבורת IPv6 לא אפשרית, גם אם יש לכם מסלולי IPv6 ברשת ה-VPC.

  • מטעמי אבטחה, Google Cloud חבילות יוצאות חסומות בכתובות IP חיצוניות ביציאת יעד TCP ‏25.

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

קביעת הגדרות של תעבורת נתונים יוצאת (egress)

בהגדרות היציאה אפשר לציין את הפרטים הבאים:

  • הפניית בקשות רק לכתובות IP פרטיות דרך מחבר ה-VPC: ברירת המחדל. התנועה מנותבת דרך רשת ה-VPC רק אם ליעדים של החבילות שנושאות את התנועה יש התאמה לאפשרויות הבאות:

    מנות שמיועדות ליעד אחר מנותבות מפונקציות Cloud Run לאינטרנט ולא דרך רשת VPC כלשהי.

  • ניתוב כל התנועה דרך מחבר ה-VPC: התנועה תמיד מנותבת דרך רשת ה-VPC שמשויכת למחבר, לכל יעדי החבילות. חובה להשתמש באפשרות הזו במקרים הבאים:

    • אם אתם צריכים לשלוח תנועה לטווחים של רשתות משנה ב-VPC עם טווחים של כתובות IP חיצוניות לשימוש פרטי. מידע נוסף על טווחים של רשתות משנה ב-VPC זמין במאמר טווחים חוקיים של IPv4 בסקירה הכללית על רשתות משנה.
    • אם אתם צריכים לשלוח תעבורה לנקודת קצה של Private Service Connect לממשקי Google APIs, שהכתובת שלה היא כתובת IP חיצונית בשימוש פרטי. מידע נוסף על נקודות קצה (endpoints) של Private Service Connect ל-Google APIs זמין במאמר גישה ל-Google APIs דרך נקודות קצה.
    • אם אתם צריכים לשלוח תעבורה לכל יעד אחר של כתובת IP חיצונית שמשמשת באופן פרטי שאפשר לנתב ברשת ה-VPC של המחבר. דוגמאות ליעדים אחרים שכוללים כתובות IP חיצוניות לשימוש פרטי יכולות להיות טווחי כתובות של תת-רשתות בקישור, טווחי כתובות של תת-רשתות בקישור שנוצרו מטווחי כתובות IP שהוקצו לשירותים, ויעדים שאפשר לגשת אליהם באמצעות מסלולים מותאמים אישית ברשת ה-VPC.

    אם רשת ה-VPC כוללת נתיב ברירת מחדל, עדיין אפשר לנתב מנות לאינטרנט אחרי שהן עוברות עיבוד על ידי המחבר, אם מגדירים שער Cloud NAT כדי לספק שירותי NAT לרשת המשנה שבה המחבר משתמש. החבילות האלה כפופות לנתיבים ברשת ה-VPC ולכללי חומת האש שחלים על רשת ה-VPC. אתם יכולים להשתמש בהגדרות של נתיב וחומת אש כדי לשלוט בתעבורת נתונים יוצאת (egress) לאינטרנט של כל הבקשות היוצאות שנשלחות מהפונקציה שלכם דרך מחבר של חיבור לרשת (VPC) מאפליקציית serverless.

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

המסוף

  1. פותחים את הדף Functions Overview במסוף Google Cloud :

    כניסה לדף Cloud Run functions Overview

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

  3. לוחצים על Runtime, build ...‎ כדי להרחיב את ההגדרות המתקדמות.

  4. בקטע Connections (חיבורים), מתחת ל-Egress settings (הגדרות יציאה), בוחרים מחבר Serverless VPC Access.

  5. בוחרים את הגדרת היציאה המתאימה בהתאם לאופן שבו רוצים לנתב תנועה יוצאת דרך המחבר.

gcloud

משתמשים בפקודה gcloud functions deploy כדי לפרוס או לעדכן את הפונקציה ומציינים את הדגל --egress-settings:

  gcloud functions deploy FUNCTION_NAME 
--vpc-connector CONNECTOR_NAME
--egress-settings EGRESS_SETTINGS
FLAGS...

where:

  • FUNCTION_NAME הוא השם של הפונקציה.
  • CONNECTOR_NAME הוא השם של מחבר הגישה ל-VPC מאפליקציית serverless שבו רוצים להשתמש. מידע נוסף מופיע בgcloudמאמרי העזרה.

  • EGRESS_SETTINGS הוא אחד מהערכים הנתמכים להגדרות של תעבורת נתונים יוצאת. אפשר לעיין במסמכי התיעוד של gcloud.

  • FLAGS... מתייחס לדגלים אחרים שמועברים אל הפקודה deploy.

תרחישים לדוגמה

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

יצירת פונקציה שלא ניתן להפעיל על ידי לקוחות חיצוניים

כדי לאבטח את פונקציות ה-HTTP, אפשר לאפשר קריאה שלהן רק על ידי משאבים באותו Google Cloud פרויקט או ב-service perimeter של VPC Service Controls.

  1. פורסים את הפונקציה ומאפשרים רק תנועה פנימית. משתמשים במסוףGoogle Cloud או ב-Google Cloud CLI:

    המסוף

    1. פותחים את הדף Functions Overview במסוף Google Cloud :

      כניסה לדף Cloud Run functions Overview

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

    3. לוחצים על Runtime, build ...‎ כדי להרחיב את ההגדרות המתקדמות.

    4. בקטע Connections, מתחת לIngress settings, בוחרים באפשרות Allow internal traffic only.

    gcloud

    משתמשים בפקודה gcloud functions deploy:

    gcloud functions deploy FUNCTION_NAME \
    --ingress-settings internal-only \
    FLAGS...
    

אחרי שפורסים את הפונקציה, בקשות שמגיעות מחוץ לפרויקטGoogle Cloud נחסמות ולא מגיעות לפונקציה. אם משתמשים ב-VPC Service Controls, בקשות שמגיעות מחוץ לגבולות גזרה לשירות נחסמות. מופעי מכונות וירטואליות בתוך הפרויקט או היקף השירות עדיין יכולים לגשת לפונקציה על ידי שליחת בקשות לנקודת הקצה שלה ב-HTTPS.

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

שימוש בהגדרות של תעבורת נכנסת ותעבורה יוצאת כדי להגביל את הגישה

אתם יכולים לשלב גם תעבורת נתונים נכנסת (ingress) וגם תעבורת נתונים יוצאת (egress) בשירותים שלכם כדי להוסיף עוד שכבת הגבלה.

  1. משכפלים את מאגר cloud-run-sample ועוברים לספרייה vpc-sample:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    cd vpc-sample

  2. מתקינים את יחסי התלות של Python:

    pip3 install -r requirements.txt

  3. אפשר לפתוח את הקובץ main.py בספרייה vpc-sample כדי לראות את הפונקציה שפורסתם:

    def hello_world(request):
        return "Hello World!"

  4. פורסים את הפונקציה:

    gcloud functions deploy restricted-function 
    --runtime=python38
    --trigger-http
    --no-allow-unauthenticated
    --ingress-settings=internal-only
    --entry-point=hello_world

  5. הגדרת מחבר לחיבור לרשת (VPC) מאפליקציית serverless:

    gcloud compute networks vpc-access connectors create serverless-connector 
    --region=SERVICE_REGION
    --range=10.8.0.0/28

    כאשר SERVICE_REGION הוא אזור של המחבר. הוא חייב להיות זהה לאזור של שירות ללא שרת. אם השירות שלכם נמצא באזור us-central או europe-west, אתם צריכים להשתמש ב-us-central1 או ב-europe-west1.

  6. יוצרים את קובץ האימג' של הקונטיינר:

    gcloud builds submit --tag=gcr.io/PROJECT_ID/restricted-function-caller .

    כאשר PROJECT_ID הוא מזהה הפרויקט.

    הפעולה הזו יוצרת קובץ אימג' של קונטיינר שמפעיל את get_hello_world כשפורסים אותו מהקובץ main.py:

    import os
    import urllib
    
    import google.auth.transport.requests
    import google.oauth2.id_token
    
    
    def get_hello_world(request):
        try:
            url = os.environ.get("URL")
            req = urllib.request.Request(url)
    
            auth_req = google.auth.transport.requests.Request()
            id_token = google.oauth2.id_token.fetch_id_token(auth_req, url)
            req.add_header("Authorization", f"Bearer {id_token}")
    
            response = urllib.request.urlopen(req)
            return response.read()
    
        except Exception as e:
            print(e)
            return str(e)

  7. משתמשים בפקודה gcloud run deploy run-function כדי לפרוס את קונטיינר Cloud Run:

      gcloud run deploy run-function 
    --image gcr.io/PROJECT_ID/restricted-function-caller
    --no-allow-unauthenticated
    --update-env-vars=URL=https://SERVICE_REGION-PROJECT_ID.cloudfunctions.net/restricted-function-caller
    --vpc-egress=all
    --vpc-connector=serverless-connector
    --region=SERVICE_REGION

    where:

    • PROJECT_ID הוא מזהה הפרויקט.
    • SERVICE_REGION הוא אזור המחבר, והוא צריך להיות זהה לאזור של השירות ללא שרת. אם השירות שלכם נמצא באזור us-central או europe-west, אתם צריכים להשתמש ב-us-central1 או ב-europe-west1.

    שירות Cloud Run‏ run-function מוגדר עכשיו לשליחת בקשה GET ממחבר ה-VPC לפונקציה המוגבלת לרשת.

ניתוב יציאה של פונקציה דרך רשת ה-VPC

רשתות VPC ב- Google Cloud תומכות במגוון רחב של הגדרות ותכונות רישות. על ידי ניתוב תעבורת היציאה מהפונקציה לרשת ה-VPC, אתם יכולים לוודא שתעבורת היציאה מפונקציות Cloud Run תפעל לפי חומת האש, ה-DNS, הניתוב וכללים אחרים של רשת ה-VPC, ותוכלו להשתמש במוצרים כמו Cloud NAT.

  1. הגדרת רשת VPC מגדירים רשת VPC קיימת או יוצרים רשת חדשה לפי ההוראות במאמר שימוש ברשתות VPC.

  2. מגדירים מחבר של חיבור לרשת (VPC) מאפליקציית serverless. פונקציות Cloud Run צריכות מחבר של חיבור לרשת (VPC) מאפליקציית serverless כדי לנתב תעבורה לרשת ה-VPC. כדי ליצור מחבר ולהגדיר את ההרשאות המתאימות, פועלים לפי ההוראות במאמר חיבור לרשת VPC.

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

    המסוף

    1. פותחים את הדף Functions Overview במסוף Google Cloud :

      כניסה לדף Cloud Run functions Overview

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

    3. לוחצים על Runtime, build ...‎ כדי להרחיב את ההגדרות המתקדמות.

    4. בקטע Connections (חיבורים), בקטע Egress settings (הגדרות יציאה), בוחרים את מחבר הגישה לרשת ה-VPC של אפליקציית serverless ובוחרים באפשרות Route all traffic through the VPC connector (ניתוב כל התנועה דרך מחבר ה-VPC).

    gcloud

    משתמשים בפקודה gcloud functions deploy:

    gcloud functions deploy FUNCTION_NAME \
    --vpc-connector CONNECTOR_NAME \
    --egress-settings all \
    FLAGS...
    

אחרי שפורסים את הפונקציה, כל התנועה שמגיעה מהפונקציה מנותבת דרך רשת ה-VPC ופועלת בהתאם לכללים שמוגדרים ברשת ה-VPC. שימו לב: לפונקציה שלכם אין גישה לאינטרנט הציבורי אלא אם תגדירו Cloud NAT. בנוסף, כדי לכלול את רשת המשנה של המחבר במיפוי, צריך ש-Cloud NAT ימפה את כל טווחי כתובות ה-IP הראשיות והמשניות של כל רשתות המשנה לשער NAT.

שיוך של יציאה מפונקציה לכתובת IP סטטית

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

  1. העברת התנועה היוצאת של הפונקציה דרך רשת ה-VPC. פרטים נוספים זמינים בסעיף הקודם, ניתוב יציאה של פונקציית ניתוב דרך רשת ה-VPC.

  2. מגדירים Cloud NAT ומציינים כתובת IP סטטית. כדי להגדיר Cloud NAT עבור רשת המשנה שמשויכת למחבר Serverless VPC Access של הפונקציה, פועלים לפי המדריכים Specify subnet ranges for NAT ו-Specify IP addresses for NAT. ה-Cloud NAT שלכם חייב למפות את כל טווחי כתובות ה-IP הראשיים והמשניים של כל רשתות המשנה אל שער ה-NAT, כדי לכלול במיפוי את רשת המשנה של המחבר.

איזון עומסים במספר אזורים

אפשר לפרוס פונקציה באזורים שונים ולאפשר לשלוח את הבקשה לאזור הקרוב ביותר שפועל. כדי להשיג זאת, עליך להגדיר קבוצה של נקודות קצה (endpoint) ברשת (NEG) בלי שרת (serverless) עבור הפונקציה, ולחבר אותה למאזן עומסים, כפי שמתואר במאמר הגדרת מאזן עומסים מסוג HTTP(S) עם קבוצות של נקודות קצה (endpoint) ברשת (NEG) בלי שרת (serverless).