הפעלת IAP לקטגוריות של Cloud Storage

במאמר הזה מוסבר איך להציג תוכן סטטי מאובטח מ-Cloud Storage באמצעות Cloud Run ו-Identity-Aware Proxy.

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

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

לפני שמתחילים

כדי לבצע את ההוראות במאמר הזה, צריך:

  • Google Cloud פרויקט שהחיוב בו מופעל. כניסה למסוף Google Cloud
  • קטגוריה פרטית של Cloud Storage שמכילה את הקבצים הסטטיים (לדוגמה, index.html, CSS ותמונות). מוודאים שהקטגוריה לא גלויה לכולם.
  • Google Cloud CLI מותקן.

מתן גישה לקטגוריית Cloud Storage

ל-Cloud Run נדרשת הרשאה לקרוא קבצים מהקטגוריה הפרטית שלכם ב-Cloud Storage. צריך להקצות לזהות השירות של Cloud Run את התפקיד 'צפייה באובייקט אחסון' (roles/storage.objectViewer) בקטגוריה.

מומלץ להשתמש בחשבון שירות שמשתמש מנהל בשביל שירות Cloud Run, במקום בחשבון השירות שמוגדר כברירת מחדל של Compute Engine.

  1. יוצרים חשבון שירות לשימוש כזהות השירות:

    gcloud iam service-accounts create RUN_SERVICE_ACCOUNT \
        --description="Service account for Cloud Run serving Cloud Storage" \
        --display-name="Cloud Run Cloud Storage Reader"
    
  2. מקצים לחשבון השירות את התפקיד 'צפייה באובייקט אחסון' (roles/storage.objectViewer) בקטגוריה:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member="serviceAccount:RUN_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectViewer"
    

פריסת שירות Cloud Run

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

כדי לטעון את הקטגוריה, פורסים את השירות עם דגלי עוצמת הקול:

gcloud run deploy SERVICE_NAME \
    --image=nginx \
    --port=80 \
    --execution-environment=gen2 \
    --service-account=RUN_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \
    --add-volume=name=static,type=cloud-storage,bucket=BUCKET_NAME,readonly=true \
    --add-volume-mount=volume=static,mount-path=/usr/share/nginx/html \
    --no-allow-unauthenticated

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

  • SERVICE_NAME: השם של שירות Cloud Run
  • RUN_SERVICE_ACCOUNT: חשבון השירות שיצרתם בשלב הקודם
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  • BUCKET_NAME: שם הקטגוריה של Cloud Storage

הקטגוריה מותקנת ב-/usr/share/nginx/html, שהיא ספריית ברירת המחדל שבה NGINX מחפש נכסים סטטיים. המשמעות היא שהקבצים ב-bucket ממופים ישירות לנתיב הבסיסי של השירות. לדוגמה, אפשר לגשת לקובץgs://BUCKET_NAME/index.html שמאוחסן בכתובת https://SERVICE_URL/index.html.

כדי לאמת את הפריסה, בודקים שהשירות חוסם גישה לא מאומתת ומחזיר סטטוס 403 Forbidden כשניגשים אליו ללא פרטי כניסה:

curl -I SERVICE_URL

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

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

מחליפים את SERVICE_URL בכתובת ה-URL של שירות Cloud Run.

הפעלת IAP

אחרי שפורסים את שירות Cloud Run, אפשר להפעיל את IAP כדי לאבטח אותו.

מומלץ להפעיל IAP ישירות בשירות Cloud Run. הוראות מפורטות זמינות במאמר הגדרת IAP ל-Cloud Run.

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

שמירה במטמון וביצועים

כשמשתמשים בטעינת נפח של Cloud Storage, כל קובץ שנקרא על ידי Cloud Run מתורגם לקריאה ל-API של Cloud Storage. כדי לצמצם את זמן האחזור ואת עלויות ה-API, אפשר להגדיר שמירה במטמון בשרת האינטרנט (לדוגמה, באמצעות הוראות שמירה במטמון של NGINX) או להגדיר אפשרויות טעינה של Cloud Storage FUSE.

אם משתמשים במאזן עומסים חיצוני מסוג HTTPS, אפשר גם להפעיל את Cloud CDN בשירות הקצה העורפי. ‫IAP לא תואם ל-Cloud CDN באותו שירות backend, לכן אם אתם צריכים את שניהם, יכול להיות שתצטרכו להתאים את מבנה הארכיטקטורה שלכם.

מגבלות

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

תרחישים אחרים לדוגמה

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

  • פונקציות מבוססות-אירוע: פונקציה קוראת קבצים שהועלו ישירות ממערכת הקבצים.
  • אפליקציות AI גנרטיבי: אפליקציה טוענת מסד נתונים וקטורי (כמו Chroma) מקטגוריה של Cloud Storage באמצעות קריאות סטנדרטיות של מערכת קבצים.

חלופה: טעינת נפחי NFS

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