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

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

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

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

הגדרות של תעבורת נתונים נכנסת (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)

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

  • Allow all traffic (התרת כל התנועה): ברירת המחדל. כל הבקשות הנכנסות לפונקציה מותרות, גם מהאינטרנט וגם ממשאבים באותו פרויקט.
  • אפשרות גישה רק לתעבורה פנימית: מותרת רק תעבורה מ-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)

בהגדרות תעבורת נתונים יוצאת (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.

אפשר לציין הגדרות של תעבורת נתונים יוצאת (egress) כשפורסים או מעדכנים את הפונקציה באמצעות המסוף 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 פרויקט או ב-גבולות גזרה לשירות של 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 לפונקציה המוגבלת לרשת.

ניתוב תעבורת נתונים יוצאת (egress) של פונקציה דרך רשת ה-VPC

רשתות VPC ב- Google Cloud תומכות במגוון רחב של הגדרות ותכונות רישות. על ידי ניתוב תעבורת נתונים יוצאת (egress) מהפונקציה לרשת ה-VPC, אתם יכולים לוודא שתעבורת נתונים יוצאת (egress) מפונקציות 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. בנוסף, צריך למפות את כל טווחי כתובות ה-IP הראשיים והמשניים של כל רשתות המשנה לשער NAT, כדי לכלול את רשת המשנה של המחבר במיפוי.

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

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

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

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

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

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