כתובת IP סטטית יוצאת

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

כדאי להגדיר את עומסי העבודה ב-Cloud Run לניתוב בקשות יוצאות באמצעות כתובת IP סטטית ייעודית במצבים הבאים:

  • אתם מתחברים למסד נתונים חיצוני או ל-API שמשתמש ברשימת היתרים של כתובות IP או בחומת אש.
  • אתם מתחברים לנקודות קצה חיצוניות שרגישות למוניטין, כמו שערי תשלום, מסדי נתונים שמתארחים או ממשקי API של שותפים שמוגנים על ידי חומות אש של צד שלישי ליישומי אינטרנט (WAF). תעבורת נתונים רועשת מדייר אחר במאגר כתובות ה-IP המשותף שמוגדר כברירת מחדל עלולה לפגוע במוניטין של כתובת ה-IP, ולגרום ל-WAF חיצוניים לחסום או להגביל את הבקשות שלכם.
  • אתם מריצים עומסי עבודה של סריקת רשת מורשית, ספירת יציאות, טביעת אצבע של מארח, בדיקת פגיעויות, גירוד נתונים מהאינטרנט או בדיקת עומסים.

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

סקירה כללית של המשימה

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

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

ניתוב התנועה דרך Cloud NAT לא מוסיף עוד דילוג במקבץ הרשת (network stack), כי שער Cloud NAT ו-Cloud Router מספקים רק מישור בקרה, והחבילות לא עוברות דרך שער ה-NAT או Cloud Router.

הגדרת תרגום כתובת רשת (NAT)

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

gcloud

  1. יוצרים Cloud Router חדש כדי לתכנת שער Cloud NAT:

    gcloud compute routers create ROUTER_NAME \
      --network=NETWORK_NAME \
      --region=REGION

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫ROUTER_NAME: שם למשאב של Cloud Router שרוצים ליצור.
    • ‫NETWORK_NAME: השם של רשת ה-VPC שמצאתם קודם.
    • ‫REGION: האזור שבו רוצים ליצור שער Cloud NAT.
  2. שמירת כתובת IP סטטית. משאב של כתובת IP שמורה שומר על כתובת ה-IP הבסיסית כשהמשאב שמשויך אליה נמחק ונוצר מחדש:

    gcloud compute addresses create ORIGIN_IP_NAME --region=REGION

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫ORIGIN_IP_NAME: השם שרוצים להקצות למשאב של כתובת ה-IP.
    • ‫REGION: האזור שבו יפעל הנתב של Cloud NAT. כדי לצמצם את זמן האחזור ואת עלויות הרשת, השתמשו באותו אזור שבו נמצאים עומסי העבודה של Cloud Run.
  3. יוצרים הגדרה של שער Cloud NAT בנתב הזה כדי לנתב את התנועה שמגיעה מרשת ה-VPC באמצעות כתובת ה-IP הסטטית שיצרתם:

    gcloud compute routers nats create NAT_NAME \
      --router=ROUTER_NAME \
      --region=REGION \
      --nat-custom-subnet-ip-ranges=SUBNET_NAME \
      --nat-external-ip-pool=ORIGIN_IP_NAME

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫NAT_NAME: שם למשאב של שער Cloud NAT שרוצים ליצור.
    • ‫ROUTER_NAME: השם של Cloud Router.
    • ‫REGION: האזור שבו רוצים ליצור שער Cloud NAT.
    • ‫SUBNET_NAME: השם של רשת המשנה.
    • ‫ORIGIN_IP_NAME: השם של משאב כתובת ה-IP השמורה שיצרתם בשלב הקודם.

Terraform

כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

  1. יוצרים Cloud Router חדש כדי לתכנת שער Cloud NAT:

    resource "google_compute_router" "default" {
      name    = "cr-static-ip-router"
      network = google_compute_network.default.name
      region  = google_compute_subnetwork.default.region
    }

    מחליפים את cr-static-ip-router בשם של רשת המשנה.

  2. שמירת כתובת IP סטטית. משאב של כתובת IP שמורה שומר על כתובת ה-IP הבסיסית כשהמשאב שמשויך אליה נמחק ונוצר מחדש:

    resource "google_compute_address" "default" {
      name   = "cr-static-ip-addr"
      region = google_compute_subnetwork.default.region
    }

    מחליפים את cr-static-ip-addr בשם של רשת המשנה.

  3. יוצרים הגדרה של שער Cloud NAT בנתב הזה כדי לנתב את התנועה שמגיעה מרשת ה-VPC באמצעות כתובת ה-IP הסטטית שיצרתם:

    resource "google_compute_router_nat" "default" {
      name   = "cr-static-nat"
      router = google_compute_router.default.name
      region = google_compute_subnetwork.default.region
    
      nat_ip_allocate_option = "MANUAL_ONLY"
      nat_ips                = [google_compute_address.default.self_link]
    
      source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
      subnetwork {
        name                    = google_compute_subnetwork.default.id
        source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
      }
    }

    מחליפים את cr-static-nat בשם של שער Cloud NAT.

ניתוב תנועה ב-Cloud Run דרך רשת ה-VPC

אחרי שמגדירים את Cloud NAT, פורסים או מעדכנים את עומס העבודה ב-Cloud Run באמצעות תעבורת נתונים יוצאת ישירה של VPCאו מחבר של גישה ל-VPC ללא שרת (serverless), ומגדירים את תעבורת הנתונים היוצאת של VPC כך שכל התנועה תנותב דרך רשת ה-VPC. בדוגמאות הבאות נפרס שירות Cloud Run. במשימות, במאגרי Worker או במכונות, צריך להעביר את אותה רשת VPC ואת אותן הגדרות תעבורת נתונים יוצאת של all-traffic כשיוצרים או מעדכנים את המשאב:

gcloud

תעבורת נתונים יוצאת ישירה ל-VPC

כדי לפרוס או לעדכן את שירות Cloud Run כך שישתמש ב-Direct VPC וינתב דרכה את כל תעבורת הנתונים היוצאת, מריצים את הפקודה הבאה:

gcloud run deploy SERVICE_NAME \
--image=IMAGE_URL \
--network=NETWORK \
--subnet=SUBNET \
--region=REGION \
--vpc-egress=all-traffic

מחליפים את מה שכתוב בשדות הבאים:

  • ‫SERVICE_NAME: השם של שירות Cloud Run שרוצים לפרוס.
  • ‫IMAGE_URL: הפניה לקובץ האימג' של הקונטיינר, לדוגמה us-docker.pkg.dev/cloudrun/container/hello:latest. אם אתם משתמשים ב-Artifact Registry, המאגר REPO_NAME כבר צריך להיות קיים. הפורמט של כתובת ה-URL הוא LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  • ‫NETWORK: השם של רשת ה-VPC
  • ‫SUBNET: השם של רשת המשנה.
  • ‫REGION: אזור לשירות.

חיבור לרשת VPC ללא שרת

כדי לפרוס או לעדכן את שירות Cloud Run כך שישתמש במחבר של חיבור לרשת (VPC) מאפליקציית serverless וינתב דרכו את כל תעבורת הנתונים היוצאת, מריצים את הפקודה הבאה:

gcloud run deploy SERVICE_NAME \
--image=IMAGE_URL \
--vpc-connector=CONNECTOR_NAME \
--region=REGION \
--vpc-egress=all-traffic

מחליפים את מה שכתוב בשדות הבאים:

  • ‫SERVICE_NAME: השם של שירות Cloud Run שרוצים לפרוס.
  • ‫IMAGE_URL: הפניה לקובץ האימג' של הקונטיינר, לדוגמה us-docker.pkg.dev/cloudrun/container/hello:latest. אם אתם משתמשים ב-Artifact Registry, המאגר REPO_NAME כבר צריך להיות קיים. הפורמט של כתובת ה-URL הוא LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  • ‫CONNECTOR_NAME: השם של המחבר לגישה ל-VPC ללא שרת.
  • ‫REGION: אזור לשירות.

YAML

תעבורת נתונים יוצאת ישירה ל-VPC

  1. אם אתם יוצרים שירות חדש, דלגו על השלב הזה. אם אתם מעדכנים שירות קיים, הורידו את הגדרת ה-YAML שלו:

    gcloud run services describe SERVICE --format export > service.yaml
  2. מעדכנים לפי הצורך.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET"}]'
            run.googleapis.com/vpc-access-egress: all-traffic
        spec:
          containers:
          - image: IMAGE_URL

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫SERVICE: השם של שירות Cloud Run.
    • ‫NETWORK: השם של רשת ה-VPC
    • ‫SUBNET: השם של רשת המשנה.
    • ‫IMAGE_URL: כתובת ה-URL של קובץ האימג' של קונטיינר השירות.
  3. יוצרים או מעדכנים את השירות באמצעות הפקודה הבאה:

    gcloud run services replace service.yaml

    כברירת מחדל, הפקודה gcloud run services replace משתמשת בקובץ service.yaml אם הוא קיים.

חיבור לרשת VPC ללא שרת

  1. אם אתם יוצרים שירות חדש, דלגו על השלב הזה. אם אתם מעדכנים שירות קיים, הורידו את הגדרת ה-YAML שלו:

    gcloud run services describe SERVICE --format export > service.yaml
  2. מעדכנים לפי הצורך.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/vpc-access-connector: CONNECTOR_NAME
        spec:
          containers:
          - image: IMAGE_URL

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫SERVICE: השם של שירות Cloud Run.
    • ‫CONNECTOR_NAME: השם של רשת הגישה ל-VPC ללא שרת.
    • ‫IMAGE_URL: הפניה לקובץ האימג' של הקונטיינר, לדוגמה us-docker.pkg.dev/cloudrun/container/hello:latest. אם אתם משתמשים ב-Artifact Registry, המאגר REPO_NAME כבר צריך להיות קיים. הפורמט של כתובת ה-URL הוא LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  3. יוצרים או מעדכנים את השירות באמצעות הפקודה הבאה:

    gcloud run services replace service.yaml

    כברירת מחדל, הפקודה gcloud run services replace משתמשת בקובץ service.yaml אם הוא קיים.

Terraform

כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

תעבורת נתונים יוצאת ישירה ל-VPC

שירות Cloud Run הזה משתמש ב-Direct VPC egress ומנתב דרכו את כל תעבורת הנתונים היוצאת:

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    vpc_access {
      network_interfaces {
        network    = "default"
        subnetwork = "default"
        tags       = ["tag1", "tag2", "tag3"]
      }
    }
  }
}

חיבור לרשת VPC ללא שרת

שירות Cloud Run הזה משתמש במחבר VPC ומנתב דרכו את כל תעבורת הנתונים היוצאת:

resource "google_cloud_run_v2_service" "default" {
  name     = "cr-static-ip-service"
  location = google_compute_subnetwork.default.region

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # Replace with the URL of your container
      #   gcr.io/<YOUR_GCP_PROJECT_ID>/<YOUR_CONTAINER_NAME>
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    scaling {
      max_instance_count = 5
    }
    vpc_access {
      connector = google_vpc_access_connector.default.id
      egress    = "ALL_TRAFFIC"
    }
  }
  ingress = "INGRESS_TRAFFIC_ALL"

}

מחליפים את us-docker.pkg.dev/cloudrun/container/hello בהפניה לקובץ האימג' של הקונטיינר.

אימות כתובת ה-IP החיצונית הסטטית

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

כדי לאמת את ההתנהגות הזו ולאשר את כתובת ה-IP המקורית שבה משתמש עומס העבודה, אתם יכולים לשלוח בקשה ל-API או לאתר כמו curlmyip.org שמציג את כתובת ה-IP המקורית.

מחיקת כתובת ה-IP החיצונית הסטטית

אם אתם לא צריכים יותר כתובת IP חיצונית סטטית, קראו את המאמר שחרור כתובת IP חיצונית סטטית.