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

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

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

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

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

כדי לאפשר לשירות 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)

אם אתם משתמשים ביציאה ישירה של תעבורה מרשת ה-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 באמצעות תעבורת נתונים יוצאת ישירה מ-VPCאו מחבר גישה ל-VPC מאפליקציית serverless, ומגדירים את תעבורת הנתונים היוצאת מ-VPC לניתוב כל התעבורה דרך רשת ה-VPC:

gcloud

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

כדי לפרוס או לעדכן את שירות Cloud Run כך שישתמש בתעבורת נתונים יוצאת ישירה מ-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 כך שישתמש במחבר Serverless VPC Access וינתב דרכו את כל תנועת היציאה, מריצים את הפקודה הבאה:

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

מחבר חיבור לרשת (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

Terraform

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

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