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

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

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

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

  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

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

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

    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 באותו פרויקט או בהיקף של 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 יוצאות מפונקציה. כדי לציין הגדרות של תעבורת יציאה, צריך לקשר את הפונקציה לרשת VPC באמצעות מחבר Serverless VPC Access. הגדרות היציאה קובעות מתי התנועה מנותבת דרך המחבר ברשת ה-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 עבור ממשקי API של Google, שהכתובת שלה היא כתובת IP חיצונית בשימוש פרטי. מידע נוסף על נקודות קצה (endpoints) של Private Service Connect ל-Google APIs זמין במאמר גישה ל-Google APIs דרך נקודות קצה.
    • אם אתם צריכים לשלוח תעבורה לכל יעד אחר של כתובת IP חיצונית שמשמשת באופן פרטי שאפשר לנתב ברשת ה-VPC של המחבר. דוגמאות ליעדים אחרים שכוללים כתובות IP חיצוניות לשימוש פרטי יכולות להיות טווחי כתובות של רשתות משנה בקישור בין רשתות שכנות (peering), טווחי כתובות של רשתות משנה בקישור בין רשתות שכנות (peering) שנוצרו מטווחי כתובות שהוקצו לשירותים, ויעדים שאפשר לגשת אליהם באמצעות מסלולים מותאמים אישית ברשת ה-VPC.

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

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

המסוף

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

    כניסה לדף סקירה כללית של פונקציות Cloud Run

  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

    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, בקשות שמגיעות מחוץ לגבולות גזרה לשירות נחסמות. מופעי VM בתוך הפרויקט או גבולות גזרה לשירות עדיין יכולים לגשת לפונקציה על ידי שליחת בקשות לנקודת הקצה שלה ב-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 הוא אזור של המחבר, והוא צריך להיות זהה לאזור של שירות בלי שרת (serverless). אם השירות שלכם נמצא באזור 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 הוא אזור של המחבר; הוא חייב להיות זהה לאזור של השירות בלי שרת (serverless). אם השירות שלכם נמצא באזור us-central או europe-west, אתם צריכים להשתמש ב-us-central1 או ב-europe-west1.

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

ניתוב יציאה של פונקציה דרך רשת ה-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

    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 עבור רשת המשנה שמשויכת למחבר Serverless VPC Access של הפונקציה, פועלים לפי ההנחיות במאמרים הגדרת טווחי כתובות של רשתות משנה ל-NAT והגדרת כתובות IP ל-NAT. כל טווחי כתובות ה-IP הראשיים והמשניים של כל רשתות המשנה צריכים להיות ממופים לשער ה-NAT ב-Cloud NAT, כדי שרשת המשנה של המחבר תיכלל במיפוי.

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

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