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

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

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

מומלץ להגדיר את Cloud Run כך שישלח תעבורת נתונים לרשת VPC באמצעות Direct VPC egress. עם זאת, יש לכם אפשרות ליצור מחבר.

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

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

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

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

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

אם אתם משתמשים בתעבורת נתונים יוצאת (egress) ישירה של VPC או במחבר של חיבור לרשת (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 עם תעבורת נתונים יוצאת (egress) ישירה של VPCאו עם מחבר Serverless VPC Access, ומגדירים את תעבורת הנתונים היוצאת (egress) של VPC לניתוב כל התעבורה דרך רשת ה-VPC:

gcloud

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

כדי לפרוס או לעדכן את שירות Cloud Run כך שישתמש בתעבורת נתונים יוצאת (egress) ישירה של 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) מאפליקציית serverless

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

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) מאפליקציית serverless.
  • 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

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

מחבר חיבור לרשת (VPC) מאפליקציית serverless

  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

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

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) מאפליקציית serverless

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

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 חיצונית סטטית.