גישה פרטית מ-Cloud Run לנקודת קצה גלובלית ולנקודת קצה אזורית של Cloud Storage

1. מבוא

נקודת קצה ל-Google API

ממשקי Google Cloud API מציעים סוגים שונים של נקודות קצה לגישה לשירותים, בעיקר בהבדלים באופן הטיפול בניתוב בקשות, במיקום הנתונים ובבידוד האזורי.

מידע נוסף על סוגי נקודות קצה ל-API זמין במאמרי העזרה של המוצר.

פירוט של נקודות קצה גלובליות, אזוריות ומיקומיות:

  1. נקודות קצה גלובליות
  • פורמט: {service}.googleapis.com (למשל, storage.googleapis.com)
  • תיאור: נקודות הקצה האלה מספקות נקודת גישה גלובלית יחידה לשירות. הן לא מציינות אזור בכתובת ה-URL.
  • ניתוב: הבקשות מנותבות על ידי ממשקי קצה גלובליים של Google‏ (GFE) ואיזון עומסים גלובלי של שירותים, ובדרך כלל התעבורה מופנית לאזור הקרוב ביותר שפועל בצורה תקינה כדי למזער את זמן האחזור.
  • סיום TLS: מתרחש ב-GFE הכי קרוב ללקוח, שיכול להיות מחוץ לאזור Google Cloud שבו נמצאים הנתונים או המשאבים.
  • המיקום של נתונים: אין ערבויות לגבי נתונים במעבר. יכול להיות שהנתונים יעברו את הגבולות האזוריים אחרי שהם יפוענחו ב-GFE.
  • בידוד אזורי: מוגבל. למרות ששרתי הבק-אנד הם לרוב אזוריים, נקודת הכניסה ואיזון העומסים הם גלובליים, כלומר בעיות בחלק אחד של התשתית הגלובלית עלולות להשפיע על שירותים באזורים אחרים.
  • תרחיש לדוגמה: גישה למטרות כלליות שבה השהייה נמוכה עבור משתמשים שמפוזרים גיאוגרפית היא חשובה, והגבלת מיקום הנתונים במעבר היא לא דאגה עיקרית.
  1. נקודות קצה אזוריות (REP)
  • פורמט: {service}.{location}.rep.googleapis.com (לדוגמה, storage.us-east1.rep.googleapis.com)
  • תיאור: האזורים האלה נועדו לספק בידוד אזורי חזק והבטחות לגבי מיקום הנתונים. המיקום (אזור ספציפי ב-Google Cloud) מצוין כתת-דומיין. זהו התקן המודרני שמחליף את נקודות הקצה מבוססות-המיקום.
  • ניתוב: שימוש במערך אזורי לחלוטין של קצה קדמי, כולל מאזני עומסים אזוריים חיצוניים ואיזון עומסים אזורי של שירותים . כל נתיב הבקשה, מ-DNS ועד לקצה העורפי של השירות, נשאר באזור שצוין.
  • סיום TLS: מתרחש בתוך האזור שצוין במאזני עומסים חיצוניים אזוריים.
  • מיקום הנתונים: הנתונים נשארים באזור המיועד גם בזמן ההעברה וגם בזמן השימוש, ועומדים בדרישות מחמירות של תאימות וריבונות.
  • בידוד אזורי: חזק. כשלים בתשתית הקצה הקדמי של אזור אחד לא משפיעים על אזורים אחרים.
  • תרחיש שימוש: אפליקציות שנדרשת בהן שמירה קפדנית של נתונים במיקום מסוים, בידוד אזורי גבוה ותאימות.

חשוב לדעת שלא לכל Google API יש נקודת קצה אזורית. כאן אפשר לראות את כל נקודות הקצה האזוריות הנתמכות.

נקודות קצה אזוריות במספר אזורים (mREP) הן גם נקודות קצה אזוריות, כמו us (ארצות הברית), eu (האיחוד האירופי) וכו'. (לדוגמה, storage.us.rep.googleapis.com)

  1. נקודות קצה למיקום (LEP)
  • פורמט: {מיקום}-{שירות}.googleapis.com (למשל, us-east1-storage.googleapis.com)
  • תיאור: נקודות הקצה האלה היו גישה מוקדמת יותר למתן גישה ספציפית למיקום. המיקום הוא חלק משם המארח הראשי. הערה: נקודות קצה למיקום מוחלפות בנקודות קצה אזוריות.
  • ניתוב: עדיין מסתמך על ממשקי הקצה הגלובליים של Google.
  • סיום TLS: בדרך כלל מתרחש ב-GFE, שיכול להיות שלא נמצא באזור שצוין בשם המארח.
  • מיקום הנתונים: לא ניתן להבטיח שהנתונים יישארו באזור שצוין במהלך ההעברה של תנועת נתונים מהאינטרנט הציבורי.
  • בידוד אזורי: חלש יותר מנקודות קצה אזוריות כי הן משתמשות בתשתית גלובלית של קצה קדמי.
  • תרחיש שימוש: בעבר נעשה שימוש בשיטה הזו בתרחישים מסוימים של גישה אזורית, אבל עכשיו מומלץ להשתמש בנקודות קצה אזוריות כדי לקבל ערבויות חזקות יותר.

Private Service Connect ל-Google API

‫Private Service Connect היא יכולת של רשתות Google Cloud שמאפשרת לצרכנים לגשת לשירותים מנוהלים. האפשרות הזו כוללת את היכולת להתחבר ל-Google APIs דרך נקודת קצה פרטית שמארחת ב-VPC של המשתמש.

איך משתמשים בנקודת קצה (endpoint) של PSC כדי לגשת ל-Google API:

איך משתמשים בבק-אנד של PSC כדי לגשת ל-Google API:

תעבורה מ-Cloud Run לרשת VPC

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

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

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

2. מה תלמדו

  • איך יוצרים נקודת קצה של PSC עבור Global Google API.
  • איך יוצרים נקודת קצה של PSC עבור Regional Google API.
  • איך משנים את נקודת הקצה ל-API בקוד של Cloud Run ומגדירים את הרישות ליציאה.

3. ארכיטקטורת Lab כוללת

8f5328678688f210.png

4. שלבי ההכנה

תפקידי IAM שנדרשים כדי לעבוד על ה-Lab

מתחילים בהקצאת תפקידי IAM הנדרשים לחשבון GCP ברמת הפרויקט.

  • אדמין של רשת מחשוב (roles/compute.networkAdmin) התפקיד הזה מעניק לכם שליטה מלאה במשאבי הרשת של Compute Engine.
  • אדמין של יומנים (roles/logging.admin) התפקיד הזה נותן גישה לכל הרשאות הרישום ביומן ולהרשאות התלויות.
  • אדמין בממשק 'שימוש בשירות' (roles/serviceusage.serviceUsageAdmin) התפקיד הזה מאפשר להפעיל, להשבית ולבדוק את מצבי השירות, לבדוק פעולות ולצרוך מכסות וחיובים בפרויקט צרכן.
  • אדמין DNS‏ (roles/dns.admin) התפקיד הזה מספק לכם גישת קריאה וכתיבה לכל המשאבים של Cloud DNS
  • אדמין של Cloud Run‏ (roles/run.admin) התפקיד הזה מעניק לכם שליטה מלאה בכל המשאבים של Cloud Run.
  • אדמין אחסון (roles/storage.admin) התפקיד הזה נותן שליטה מלאה על אובייקטים וקטגוריות.

הפעלת ממשקי ה-API

ב-Cloud Shell, מוודאים שהפרויקט מוגדר בצורה נכונה ומגדירים את משתני הסביבה.

ב-Cloud Shell, מבצעים את הפעולות הבאות:

gcloud auth login
gcloud config set project <your project id>
export project_id=<your project id>
export region=<your region>
export zone=$region-a
echo $project_id
echo $region

מפעילים את כל ממשקי ה-API הנדרשים של Google בפרויקט. ב-Cloud Shell, מבצעים את הפעולות הבאות:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  compute.googleapis.com \
  dns.googleapis.com \
  servicedirectory.googleapis.com \
  networkconnectivity.googleapis.com

יצירת VPC

בפרויקט, יוצרים רשת VPC עם מצב תת-רשת מותאם אישית. מבצעים את הפעולות הבאות ב-Cloud Shell:

gcloud compute networks create mynet \
    --subnet-mode=custom

יצירת רשתות משנה

ב-Cloud Shell, מבצעים את הפעולות הבאות כדי ליצור תת-רשת IPv4:

gcloud compute networks subnets create mysubnet \
    --network=mynet \
    --range=10.0.0.0/24 \
    --region=$region

יצירה של Cloud NAT ו-Cloud Router

משתמשים ב-Cloud NAT כדי לאפשר לעבודות של Cloud Run להתחבר לאתרים חיצוניים.

gcloud compute routers create $region-cr \
   --network=mynet \
   --region=$region 
gcloud compute routers nats create $region-nat \
    --router=$region-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

5. יצירת נקודת קצה של PSC ל-Cloud Storage

תצטרכו ליצור שתי נקודות קצה (endpoints) מסוג PSC ל-Cloud Storage, אחת בהיקף גלובלי ואחת בהיקף אזורי.

יצירת נקודת קצה של PSC בהיקף גלובלי

באמצעות Private Service Connect, אתם יכולים ליצור נקודות קצה פרטיות בהיקף גלובלי באמצעות כתובות IP פנימיות גלובליות ברשת ה-VPC שלכם.

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

ב-Cloud Shell, מבצעים את הפעולות הבאות כדי ליצור כתובת IP. צריך לשנות את ‎–addresses=<pscendpointip>‎ כך שישתמש בכתובת ה-IP שהקצית.

gcloud compute addresses create pscglobalip \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=<pscendpointip> \
    --network=mynet
pscendpointip=$(gcloud compute addresses list --filter=name:pscglobalip --format="value(address)")
echo $pscendpointip

יוצרים כלל העברה כדי לקשר את נקודת הקצה לממשקי API ולשירותים של Google.

gcloud compute forwarding-rules create pscendpoint \
    --global \
    --network=mynet \
    --address=pscglobalip \
    --target-google-apis-bundle=all-apis

בדיקת p.googleapis.com ב-Cloud DNS

כשיוצרים נקודת קצה, נוצרות אוטומטית ההגדרות הבאות של DNS:

  • נוצר תחום DNS פרטי של Service Directory עבור p.googleapis.com.
  • רשומות DNS נוצרות ב-p.googleapis.com עבור חלק מממשקי Google APIs והשירותים הנפוצים של Google שזמינים באמצעות Private Service Connect ויש להם שמות DNS שמוגדרים כברירת מחדל ומסתיימים ב-googleapis.com.

נקודות קצה גלובליות רשומות בספריית השירותים. תשתמשו ב-storage-[psc endpoint name].p.googleapis.com כדי לגשת ל-Cloud Storage. פרטים נוספים זמינים במסמכי העזרה של המוצר.

מריצים את הפקודה כדי לבדוק אם האזור p.googleaps.com כבר נוצר.

gcloud dns managed-zones list

אם רוצים להשתמש בשם ה-DNS שמוגדר כברירת מחדל, storage.googleapis.com, צריך ליצור אזור פרטי storage.googleapis.com ב-Cloud DNS ולהוסיף רשומת apex שמפנה לנקודת הקצה (endpoint) של PSC של כתובת IP בהיקף גלובלי.

יצירת נקודת קצה של PSC בהיקף אזורי ל-Cloud Storage

תצטרכו כתובת IP אחת מרשת המשנה של ה-VPC. מריצים את הפקודה שלמטה, וכתובת IP מרשת המשנה תוקצה לנקודת הקצה של PSC.

gcloud network-connectivity regional-endpoints create psc-regional-endpoint \
    --region=$region \
    --network=projects/$project_id/global/networks/mynet \
    --subnetwork=projects/$project_id/regions/$region/subnetworks/mysubnet \
    --target-google-api=storage.us-central1.rep.googleapis.com

מקבלים את כתובת ה-IP של נקודת הקצה שנוצרה בשלב הקודם.

regionalip=$(gcloud network-connectivity regional-endpoints describe psc-regional-endpoint --region=$region --format="value(address)")
echo $regionalip

תשתמשו ב-storage.us-central1.rep.googleapis.com כדי לגשת ל-Cloud Storage. צריך ליצור אזור פרטי בשביל storage.us-central1.rep.googleapis.com ורשומת apex של כתובת ה-IP שזה עתה יצרתם בשביל נקודת הקצה האזורית ב-Cloud DNS.

יצירת אזור פרטי לנקודת קצה אזורית של Cloud Storage

תשתמשו ב-storage.[שם האזור].rep.googleapis.com כדי לגשת לנקודת קצה אזורית של Cloud Storage.

תצטרכו ליצור אזור פרטי ב-Cloud DNS ולהוסיף רשומת apex שמפנה לכתובת ה-IP של נקודת הקצה האזורית של Cloud Storage.

בפקודה שלמטה, us-central1 הוא האזור לדוגמה. צריך ליצור את התחום (zone) עם שם האזור.

gcloud dns managed-zones create psc-regional-endpoint-zone \
  --description="" \
  --dns-name="storage.us-central1.rep.googleapis.com" \
  --visibility="private" \
  --networks="mynet"

gcloud dns record-sets create storage.us-central1.rep.googleapis.com. \
  --rrdatas=$regionalip \
  --ttl=300 \
  --type=A \
  --zone=psc-regional-endpoint-zone

6. הגדרת משימת Cloud Run עם נקודת קצה של PSC בהיקף גלובלי

קבל את הקוד

קודם נבדוק אפליקציית Node.js כדי לצלם צילומי מסך של דפי אינטרנט ולאחסן אותם ב-Cloud Storage. בהמשך, יוצרים קובץ אימג' של קונטיינר לאפליקציה ומריצים אותו כמשימה ב-Cloud Run.

מריצים את הפקודה הבאה מ-Cloud Shell כדי לשכפל את קוד האפליקציה מהמאגר הזה:

git clone https://github.com/GoogleCloudPlatform/jobs-demos.git

עוברים לספרייה שמכילה את האפליקציה:

cd jobs-demos/screenshot

פריסת הקובץ אמורה להיראות כך:

|

├── Dockerfile

├── README.md

├── screenshot.js

├── package.json

הנה תיאור קצר של כל קובץ:

  • ‫screenshot.js מכיל את קוד Node.js של האפליקציה. האפליקציה מצלמת צילומי מסך של דפי אינטרנט ומאחסנת אותם ב-Cloud Storage.
  • הקובץ package.json מגדיר את יחסי התלות של הספרייה.
  • קובץ Dockerfile מגדיר את קובץ האימג' של הקונטיינר.

פותחים את הקוד screenshot.js ומשנים את apiEndpoint לנקודת קצה גלובלית של PSC. מחפשים את הקוד ומחליפים את const storage = new Storage(); בקוד הבא:

const storage = new Storage(
    {
      apiEndpoint:'https://storage-pscendpoint.p.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

פריסת משימה

לפני שיוצרים משימה, צריך ליצור חשבון שירות שישמש להרצת המשימה.

gcloud iam service-accounts create screenshot-sa --display-name="Screenshot app service account"

מעניקים לחשבון השירות את התפקיד storage.admin כדי שיהיה אפשר להשתמש בו ליצירת קטגוריות ואובייקטים.

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.admin \
  --member serviceAccount:screenshot-sa@$project_id.iam.gserviceaccount.com

נותנים לחשבון השירות של Compute Engine שמוגדר כברירת מחדל את התפקידים Storage Object User , ‏ Logs Writer ו-Artifact Registry Repository Administrator.

project_number=$(gcloud projects describe $project_id --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.objectUser \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/logging.logWriter \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/artifactregistry.repoAdmin \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

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

ב-Cloud Shell, מבצעים את הפעולות הבאות:

gcloud run jobs deploy screenshot-1 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$project_id-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

הרצת המשימה

ב-Cloud Shell, מבצעים את הפעולות הבאות:

gcloud run jobs execute screenshot-1 --region=$region

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

bae25d504ea20384.png

כדי לראות יומנים מפורטים של ביצוע המשימה, לוחצים על 'הצגת יומן' במשימה. יוצגו יומני עבודות דומים לאלה שמופיעים בהמשך.

aa0468dc463f4320.png

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

תוצאת הבדיקה מראה ש-Cloud Run ניגש באופן פרטי לנקודת הקצה הגלובלית של Cloud Storage ששיניתם במשימה של Cloud Run:

apiEndpoint:‘https://storage-pscendpoint.p.googleapis.com.'

7. הגדרת משימת Cloud Run עם נקודת קצה (endpoint) של PSC בהיקף אזורי

בקוד, משנים את apiEndpoint לנקודת קצה של PSC עם היקף אזורי.

מחפשים את הקוד ומחליפים את const storage = new Storage(); בקוד הבא ( השתמשנו ב-us-central1 כדוגמה). עליך לעבור לאזור שלך ( ) :

const storage = new Storage(
    {
      apiEndpoint:'https://storage.us-central1.rep.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

פריסת משימה

מוודאים שאתם נמצאים בספרייה שמכילה את האפליקציה (jobs-demos/screenshot).

pwd

מפעילים תעבורת נתונים יוצאת ישירה מ-VPC למשימות כדי לשלוח את כל התעבורה לרשת VPC.

ב-Cloud Shell, מבצעים את הפעולות הבאות:

gcloud run jobs deploy screenshot-2 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$PROJECT_ID-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

הרצת המשימה

ב-Cloud Shell, מבצעים את הפעולות הבאות:

gcloud run jobs execute screenshot-2 --region=$region

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

1065ce25136d355e.png

כדי לראות יומנים מפורטים של ביצוע המשימות, לוחצים על 'הצגת יומן'. יוצגו יומני עבודות דומים לאלה שמופיעים בהמשך.

837afb2f95a7049b.png

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

תוצאת הבדיקה מראה ש-Cloud Run ניגש באופן פרטי לנקודת קצה אזורית של Cloud Storage ששיניתם בעבודת Cloud Run:

apiEndpoint:‘https://storage.us-central1.rep.googleapis.com.'

8. הסרת המשאבים

ניקוי משימה ב-Cloud Run

gcloud run jobs delete screenshot-1 \
  --region=$region --quiet
gcloud run jobs delete screenshot-2 \
  --region=$region --quiet

gcloud iam service-accounts delete screenshot-sa@$project_id.iam.gserviceaccount.com --quiet

ניקוי נקודת קצה של PSC

gcloud compute forwarding-rules delete pscendpoint \
    --global --quiet
gcloud network-connectivity regional-endpoints delete psc-regional-endpoint \
    --region=$region --quiet
gcloud compute addresses delete pscglobalip \
    --global --quiet

ניקוי של Cloud NAT, ‏ Cloud Router ו-VPC

gcloud compute routers nats delete $region-nat \
    --router=$region-cr \
    --region=$region --quiet
gcloud compute routers delete $region-cr \
    --region=$region --quiet
gcloud compute networks subnets delete mysubnet \
    --region=$region --quiet
gcloud compute networks delete mynet --quiet

9. מזל טוב

בדקתם בהצלחה גישה פרטית מ-Cloud Run ל-Cloud Storage דרך נקודת קצה גלובלית ונקודת קצה אזורית.