הגדרת סודות לשירותים

יכול להיות שהשירות שלכם יצטרך מפתחות API, סיסמאות, אישורים או מידע רגיש אחר בשביל התלות שלו. ב-Cloud Run,‏ Google ממליצה לאחסן את המידע הרגיש הזה בסוד שיוצרים ב-Secret Manager.

אפשר להפוך סוד לזמין למאגרי התגים באחת מהדרכים הבאות:

  • כשמציבים כל סוד כנפח, Cloud Run הופך את הסוד לזמין לקונטיינר כקובץ. כשקוראים נפח, Cloud Run תמיד מאחזר את ערך הסוד מ-Secret Manager כדי להשתמש בערך עם הגרסה האחרונה. השיטה הזו מתאימה גם לרוטציה של סודות.
  • העברת סוד באמצעות משתני סביבה. משתני סביבה נפתרים בזמן הפעלת המופע, ולכן אם משתמשים בשיטה הזו, Google ממליצה להצמיד את הסוד לגרסה מסוימת במקום להשתמש ב-latest כגרסה.

מידע נוסף זמין במאמר בנושא שיטות מומלצות לשימוש ב-Secret Manager.

איך מתבצעת בדיקה של סודות בזמן הפריסה ובזמן הריצה

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

במהלך זמן הריצה, כשהמופעים מופעלים:

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

בעלות על נפח

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

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

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

  • סביבת הפעלה מהדור הראשון שבה אתם פורסים כמה קונטיינרים
  • הסביבה של הדור השני

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

  1. מפעילים את Secret Manager API.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    להפעלת ה-API

  2. משתמשים בסוד קיים או יוצרים סוד ב-Secret Manager, כמו שמתואר במאמר יצירת סוד.

התפקידים הנדרשים

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

כדי לאפשר ל-Cloud Run לגשת לסוד, לזהות השירות צריכה להיות ההרשאה הבאה:

הוראות להוספת חשבון המשתמש של השירות לתפקיד Secret Accessor ב-Secret Manager מופיעות במאמר ניהול הגישה לסודות.

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

הפיכת סוד לנגיש ל-Cloud Run

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

אפשר להפוך סוד לנגיש לשירות באמצעות מסוף Google Cloud,‏ Google Cloud CLI או קובץ YAML כשפורסים שירות חדש או מעדכנים שירות קיים ופורסים גרסה. Google Cloud לוחצים על הכרטיסייה הרצויה:

המסוף

  1. נכנסים לדף Services של Cloud Run במסוף Google Cloud :

    כניסה ל-Cloud Run

  2. לוחצים על Deploy container (פריסת מאגר) כדי להגדיר שירות חדש. ממלאים את הדף של הגדרות השירות הראשוניות, ואז לוחצים על Containers, Networking, Security (קונטיינרים, רשתות, אבטחה) כדי להרחיב את דף הגדרות השירות.

  3. אם אתם מגדירים שירות קיים, לוחצים על השירות ואז על עריכה ופריסה של גרסה חדשה.

  4. פועלים לפי השלבים להצגת הסוד כמשתנה סביבה או להוספת הסוד כנפח.

    • כדי לחשוף את הסוד כמשתנה סביבה:

      1. לוחצים על הכרטיסייה Container(s) (מאגרי תגים).
      2. בכרטיסייה Variables and Secrets (משתנים וסודות), לוחצים על Reference a secret (הפניה לסוד).
      3. בשדה Name 1, מזינים את השם של משתנה הסביבה.
      4. ברשימה Secret, בוחרים את הסוד שרוצים להשתמש בו.
      5. ברשימה Version 1, בוחרים את הגרסה של הסוד שאליה רוצים להפנות.
      6. לוחצים על סיום.
      7. לוחצים על יצירה או על פריסה.
    • כדי לטעון את הסוד כנפח:

      1. לוחצים על הכרטיסייה Volumes (נפחים).
      2. לוחצים על Mount volume (התקנת אמצעי אחסון).
      3. לוחצים על Secret (סוד).
      4. בשדה Mount path (נתיב ההרכבה), מזינים את נתיב ההרכבה של הסוד הזה. זוהי הספרייה שבה ממוקמות כל הגרסאות של הסוד.
      5. ברשימה Secret, בוחרים את הסוד שרוצים להשתמש בו.
      6. בשדה נתיב 1, מזינים את שם הקובץ להרכבה.
      7. ברשימה Version 1, בוחרים את הגרסה של הסוד שאליה רוצים להפנות. כברירת מחדל, הגרסה האחרונה נבחרת. אם רוצים, אפשר לבחור גרסה ספציפית.
      8. לוחצים על Save.
      9. לוחצים על יצירה או על פריסה.

gcloud

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

  • כדי לטעון את הסוד כנפח כשפורסים שירות:

    gcloud run deploy SERVICE --image IMAGE_URL  \
    --update-secrets=PATH=SECRET_NAME:VERSION

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

    • SERVICE: השם של השירות.
    • 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
    • PATH: נתיב ההרכבה של אמצעי האחסון ושם הקובץ של הסוד. הוא חייב להתחיל בקו נטוי מוביל – לדוגמה: /etc/secrets/dbconfig/password, כאשר /etc/secrets/dbconfig/ הוא נתיב ההרכבה של אמצעי האחסון, ו-password הוא שם הקובץ של הסוד.
    • SECRET_NAME: שם הסוד באותו פרויקט, לדוגמה mysecret.
    • VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.
  • כדי לחשוף את הסוד כמשתנה סביבה כשפורסים שירות:

    gcloud run deploy SERVICE \
    --image IMAGE_URL \
    --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION

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

    • SERVICE: השם של השירות.
    • 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 .
    • ENV_VAR_NAME: השם של משתנה הסביבה שרוצים להשתמש בו עם הסוד.
    • SECRET_NAME: שם הסוד באותו פרויקט, לדוגמה mysecret.
    • VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.
  • אפשר לעדכן כמה סודות בו-זמנית. כדי לעשות את זה, מפרידים בין אפשרויות ההגדרה של כל סוד באמצעות פסיק. הפקודה הבאה מעדכנת סוד אחד שמוטמע כנפח וסוד אחר שמוצג כמשתנה סביבתי.

    כדי לעדכן סודות קיימים, מזינים את הפקודה הבאה:

    gcloud run deploy SERVICE --image IMAGE_URL \
    --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
  • כדי לנקות סודות קיימים ולהפוך סוד חדש לנגיש לשירות, משתמשים בדגל --set-secrets:

    gcloud run services update SERVICE \
    --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. אם הסודות נחשפים כמשתני סביבה, בקטע env, מעדכנים את ENV_VAR, VERSION ו/או SECRET_NAME לפי הצורך. אם יש לכם כמה סודות שמוצמדים כמשתני סביבה, יהיו לכם כמה עותקים של המאפיינים האלה.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION
        spec:
          containers:
          - image: IMAGE_URL
            env:
            - name: ENV_VAR
              valueFrom:
                secretKeyRef:
                  key: VERSION
                  name: SECRET_NAME
  3. אם הסודות מותקנים כנתיבי קבצים, מעדכנים את MOUNT_PATH, VOLUME_NAME, VERSION, FILENAME ו/או SECRET_NAME לפי הצורך. אם יש לכם כמה סודות שמוצמדים כנתיבי קבצים, יהיו לכם כמה עותקים של המאפיינים האלה.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: MOUNT_PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            secret:
              items:
              - key: VERSION
                path: FILENAME
              secretName: SECRET_NAME

    הערה: אפשר להגדיר ל-VOLUME_NAME כל שם.

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

    • SERVICE: השם של שירות 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 .
    • REVISION עם שם חדש לגרסה או למחוק אותה (אם היא קיימת). אם מספקים שם חדש לגרסה, חובה שהוא יעמוד בקריטריונים הבאים:
      • מתחיל ב-SERVICE-
      • מכיל רק אותיות קטנות, מספרים ו-
      • לא מסתיים ב--
      • לא חורג מ-63 תווים
  4. מחליפים את השירות בהגדרה החדשה שלו באמצעות הפקודה הבאה:

    gcloud run services replace service.yaml

Terraform

  1. יוצרים סוד וגרסת סוד.

    resource "google_secret_manager_secret" "default" {
      secret_id = "my-secret"
      replication {
        auto {}
      }
    }
    
    resource "google_secret_manager_secret_version" "default" {
      secret      = google_secret_manager_secret.default.name
      secret_data = "this is secret data"
    }
  2. יוצרים חשבון שירות ומעניקים לו גישה לסוד:

    resource "google_service_account" "default" {
      account_id   = "cloud-run-service-account"
      display_name = "Service account for Cloud Run"
    }
    
    resource "google_secret_manager_secret_iam_member" "default" {
      secret_id = google_secret_manager_secret.default.id
      role      = "roles/secretmanager.secretAccessor"
      # Grant the new deployed service account access to this secret.
      member     = "serviceAccount:${google_service_account.default.email}"
      depends_on = [google_secret_manager_secret.default]
    }
  3. אפשר לגשת לסודות ב-Secret Manager מ-Cloud Run כנתיבי קבצים שצורפו או כמשתני סביבה.

    1. לסודות שמוצמדים כנתיבי קבצים, מציינים את המשאב Secret Manager בפרמטר volumes. הערך name תואם לרשומה בפרמטר volume_mounts:

      resource "google_cloud_run_v2_service" "mounted_secret" {
        name     = "service-with-mounted-secret"
        location = "us-central1"
        ingress  = "INGRESS_TRAFFIC_ALL"
      
        deletion_protection = false # set to "true" in production
      
        template {
          volumes {
            name = "my-service-volume"
            secret {
              secret = google_secret_manager_secret.default.secret_id
              items {
                version = "latest"
                path    = "my-secret"
                mode    = 0 # use default 0444
              }
            }
          }
          containers {
            image = "us-docker.pkg.dev/cloudrun/container/hello"
            volume_mounts {
              name       = "my-service-volume"
              mount_path = "/secrets"
            }
          }
          service_account = google_service_account.default.email
        }
        depends_on = [google_secret_manager_secret_version.default]
      }
    2. כדי להשתמש בסודות שמוצגים כמשתני סביבה, צריך להפנות למשאב Secret Manager בפרמטר env:

      resource "google_cloud_run_v2_service" "env_variable_secret" {
        name     = "service-with-env-var-secret"
        location = "us-central1"
        ingress  = "INGRESS_TRAFFIC_ALL"
      
        deletion_protection = false # set to "true" in production
      
        template {
          containers {
            image = "us-docker.pkg.dev/cloudrun/container/hello"
            env {
              name = "MY_SECRET"
              value_source {
                secret_key_ref {
                  secret  = google_secret_manager_secret.default.secret_id
                  version = "latest"
                }
              }
            }
          }
          service_account = google_service_account.default.email
        }
        depends_on = [google_secret_manager_secret_version.default]
      }

פיתוח נייטיב

כדי לציין סודות בקובץ compose.yaml, מוסיפים את המאפיין secrets להגדרת השירות. פעולה כזו יוצרת סוד ב-Secret Manager לאחסון הנתונים האלה על סמך הערך בקובץ המקומי.

  services:
    web:
      image: IMAGE
      secrets:
        - SECRET_NAME
  secrets:
    SECRET_NAME:
      file: SECRET_FILE_PATH

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

  • IMAGE: כתובת ה-URL של תמונת המאגר.
  • SECRET_NAME: שם הסוד, לדוגמה, mysecret.
  • SECRET_FILE_PATH: הנתיב לקובץ המקומי שמכיל את ערך הסוד.

פריסת השירות

  1. כדי לפרוס את השירותים, מריצים את הפקודה gcloud run compose up:

    gcloud run compose up compose.yaml
  2. מגיבים y לכל ההנחיות להתקנת רכיבים נדרשים או להפעלת ממשקי API.

  3. אופציונלי: הפיכת השירות לציבורי אם רוצים לאפשר גישה לשירות ללא אימות.

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

הפניה לסודות מפרויקטים אחרים

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

המסוף

  1. נכנסים לדף Services של Cloud Run במסוף Google Cloud :

    כניסה ל-Cloud Run

  2. לוחצים על Deploy container (פריסת מאגר) כדי להגדיר שירות חדש. ממלאים את הדף של הגדרות השירות הראשוניות, ואז לוחצים על Containers, Networking, Security (קונטיינרים, רשתות, אבטחה) כדי להרחיב את דף הגדרות השירות.

  3. אם אתם מגדירים שירות קיים, לוחצים על השירות ואז על עריכה ופריסה של גרסה חדשה.

  4. פועלים לפי השלבים להצגת הסוד כמשתנה סביבה או להוספת הסוד כנפח.

    • כדי לחשוף את הסוד כמשתנה סביבה:

      1. לוחצים על הכרטיסייה Container(s) (מאגרי תגים).
      2. בכרטיסייה Variables and Secrets (משתנים וסודות), לוחצים על Reference a secret (הפניה לסוד).
      3. בשדה Name 1, מזינים את השם של משתנה הסביבה.
      4. ברשימה Secret, לוחצים על Enter secret manually (הזנת סוד באופן ידני).
      5. מזינים את מזהה המשאב של הסוד בפורמט הבא:

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

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

        • PROJECT_NUMBER במספר הפרויקט. Google Cloud הוראות מפורטות לאיתור מספר הפרויקט זמינות במאמר יצירה וניהול של פרויקטים.

        • SECRET_NAME: השם של הסוד ב-Secret Manager.

      6. ברשימה Version 1, בוחרים את הגרסה של הסוד שאליה רוצים להפנות.

      7. לוחצים על סיום.

      8. לוחצים על יצירה או על פריסה.

    • כדי לטעון את הסוד כנפח:

      1. לוחצים על הכרטיסייה Volumes (נפחים).
      2. לוחצים על Mount volume (התקנת אמצעי אחסון).
      3. לוחצים על Secret (סוד).
      4. בשדה Mount path (נתיב ההרכבה), מזינים את נתיב ההרכבה של הסוד הזה. זוהי הספרייה שבה ממוקמות כל הגרסאות של הסוד.
      5. ברשימה Secret, לוחצים על Enter secret manually (הזנת סוד באופן ידני).
      6. מזינים את מזהה המשאב של הסוד בפורמט הבא:

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

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

        • PROJECT_NUMBER במספר הפרויקט. Google Cloud הוראות מפורטות לאיתור מספר הפרויקט זמינות במאמר יצירה וניהול של פרויקטים.

        • SECRET_NAME: השם של הסוד ב-Secret Manager.

      7. בשדה נתיב 1, מזינים את שם הקובץ להרכבה.

      8. ברשימה Version 1, בוחרים את הגרסה של הסוד שאליה רוצים להפנות. כברירת מחדל, הגרסה האחרונה נבחרת. אם רוצים, אפשר לבחור גרסה ספציפית.

      9. לוחצים על Save.

      10. לוחצים על יצירה או על פריסה.

gcloud

  • כדי לטעון סוד כנפח כשפורסים שירות:

    gcloud run deploy SERVICE --image IMAGE_URL  \
    --update-secrets=PATH=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION

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

    • SERVICE: השם של השירות.
    • 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 .
    • PATH: נתיב ההרכבה של אמצעי האחסון ושם הקובץ של הסוד. הוא חייב להתחיל בקו נטוי מוביל – לדוגמה: /etc/secrets/dbconfig/password, כאשר /etc/secrets/dbconfig/ הוא נתיב ההרכבה של אמצעי האחסון, ו-password הוא שם הקובץ של הסוד.
    • PROJECT_NUMBER: מספר הפרויקט שבו נוצר הסוד.
    • SECRET_NAME: שם הסוד, לדוגמה, mysecret.
    • VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml

בגלל מגבלות שקשורות לתאימות API, צריך לאחסן את מיקומי הסודות בהערה.

  1. לסודות שנחשפים כמשתני סביבה:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          containers:
          - image: IMAGE_URL
            env:
            - name: ENV_VAR
              valueFrom:
                secretKeyRef:
                  key: VERSION
                  name: SECRET_LOOKUP_NAME

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

    • SERVICE: השם של השירות.
    • 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
    • ENV_VAR: השם של משתנה הסביבה.
    • PROJECT_NUMBER: מספר הפרויקט שבו נוצר הסוד.
    • SECRET_NAME: שם הסוד, לדוגמה, mysecret.
    • VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.
    • SECRET_LOOKUP_NAME: כל שם עם תחביר תקין של שם סוד, לדוגמה my-secret. יכול להיות שזה יהיה אותו שם כמו SECRET_NAME.
  2. לסודות שמוצמדים כנתיבי קבצים:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: MOUNT_PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            secret:
              items:
              - key: VERSION
                path: FILENAME
              secretName: SECRET_LOOKUP_NAME

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

    • SERVICE: השם של השירות.
    • 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 .
    • PATH: נתיב ההרכבה של אמצעי האחסון ושם הקובץ של הסוד. הוא חייב להתחיל בקו נטוי מוביל – לדוגמה: /etc/secrets/dbconfig/password, כאשר /etc/secrets/dbconfig/ הוא נתיב ההרכבה של אמצעי האחסון, ו-password הוא שם הקובץ של הסוד.
    • PROJECT_NUMBER: מספר הפרויקט שבו נוצר הסוד.
    • SECRET_NAME: שם הסוד, לדוגמה, mysecret.
    • VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.
    • SECRET_LOOKUP_NAME: כל שם עם תחביר תקין של שם סוד, לדוגמה my-secret. יכול להיות שזה יהיה אותו שם כמו SECRET_NAME.
    • VOLUME_NAME: כל שם – לדוגמה, my-volume. יכול להיות שזה יהיה אותו שם כמו SECRET_NAME.

Terraform

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

מוסיפים את השורות הבאות למשאב google_cloud_run_v2_service בתצורת Terraform:

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

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "REGION"

  template {
    containers {
      image = "IMAGE_URL"
      env {
        name = "SECRET_NAME"
        value_source {
          secret_key_ref {
            secret = "projects/PROJECT_ID/secrets/SECRET_NAME"
            version = "VERSION"
          }
        }
      }
    }
  }
}

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

  • SERVICE_NAME: השם של המשימה ב-Cloud Run.
  • REGION: Google Cloud האזור. לדוגמה: europe-west1.
  • 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 .
  • SECRET_NAME: שם הסוד, לדוגמה mysecret.
  • PROJECT_ID: מזהה הפרויקט שבו נוצר הסוד.
  • VERSION: גרסת הסוד. משתמשים ב-latest לגרסה העדכנית ביותר, או במספר – לדוגמה, 2.

לסודות שמוצמדים כנתיבי קבצים:

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "REGION"

  template {
    containers {
      image = "IMAGE_URL"

      volume_mounts {
        name       = "VOLUME_NAME"
        mount_path = "MOUNT_PATH"
      }
    }

    volumes {
      name = "VOLUME_NAME"
      secret {
        secret = "projects/PROJECT_ID/secrets/SECRET_NAME"
      }
    }
  }
}

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

  • SERVICE_NAME: השם של המשימה ב-Cloud Run.
  • REGION עם האזור Google Cloud . לדוגמה: europe-west1.
  • 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
  • VOLUME_NAME: כל שם – למשל, my-volume. יכול להיות שזה יהיה אותו שם כמו SECRET_NAME
  • MOUNT_PATH: נתיב ההרכבה של אמצעי האחסון ושם הקובץ של הסוד. הוא חייב להתחיל בקו נטוי מוביל – לדוגמה: /etc/secrets/dbconfig/password, כאשר /etc/secrets/dbconfig/ הוא נתיב ההרכבה של אמצעי האחסון, ו-password הוא שם הקובץ של הסוד.
  • PROJECT_ID: מזהה הפרויקט שבו נוצר הסוד.
  • SECRET_NAME: שם הסוד, לדוגמה mysecret.

הצגת הגדרות הסודות

כדי לראות את הגדרות הסודות הנוכחיות בשירות Cloud Run:

המסוף

  1. נכנסים לדף Services של Cloud Run במסוף Google Cloud :

    כניסה ל-Cloud Run

  2. לוחצים על השירות שרוצים לראות כדי לפתוח את הדף פרטי השירות.

  3. לוחצים על הכרטיסייה עדכונים.

  4. בחלונית הפרטים שמשמאל, הגדרת הסודות מופיעה בכרטיסייה Container.

gcloud

  1. משתמשים בפקודה הבאה:

    gcloud run services describe SERVICE
  2. מאתרים את הגדרת הסודות בתצורה שמוחזרת.

הסרת סודות משירות

אפשר להסיר סודות משירות באמצעות Google Cloud המסוף או ה-CLI של gcloud:

המסוף

  1. נכנסים לדף Services של Cloud Run במסוף Google Cloud :

    כניסה ל-Cloud Run

  2. בוחרים את השירות מהרשימה ולוחצים על עריכה ופריסה של עדכון חדש.

  3. לוחצים על הכרטיסייה Container(s) (מאגרי תגים).

  4. כדי למחוק סודות שצורפו כנפח, בוחרים בכרטיסייה Volume mounts, מעבירים את מצביע העכבר מעל הסוד שרוצים להסיר ולוחצים על Delete.

  5. כדי למחוק סודות שנחשפו כמשתנה סביבתי, בוחרים בכרטיסייה Variables and secrets, מעבירים את מצביע העכבר מעל הסוד שרוצים להסיר ולוחצים על Delete.

  6. לוחצים על פריסה.

gcloud

אפשר להסיר את כל הסודות משירות או לציין סוד אחד או יותר להסרה:

  • כדי להסיר את כל הסודות, מריצים את הפקודה הבאה:

    gcloud run deploy SERVICE --image IMAGE_URL \
    --clear-secrets
    

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

    • SERVICE: השם של השירות.
    • 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 .
  • כדי לציין רשימה של סודות להסרה, משתמשים בדגל --remove-secrets. הפקודה הבאה מסירה סוד אחד שמוטמע כנפח וסוד אחר שמוצג כמשתנה סביבה:

    gcloud run deploy SERVICE --image IMAGE_URL \
    --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH
    

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

    • SERVICE: השם של השירות.
    • 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 .
    • ENV_VAR_NAME: השם של משתנה הסביבה.
    • SECRET_FILE_PATH: הנתיב המלא של הסוד. לדוגמה, /mnt/secrets/primary/latest, כאשר /mnt/secrets/primary/ הוא נתיב ההרכבה ו-latest הוא נתיב הסוד. אפשר גם לציין את הנתיבים של הנקודה לחיבור ושל הסוד בנפרד:

          --set-secrets MOUNT_PATH:SECRET_PATH=SECRET:VERSION
      

שימוש בסודות בקוד

דוגמאות לגישה לסודות בקוד כמשתני סביבה מופיעות במדריך בנושא אימות משתמשי קצה, במיוחד בקטע טיפול בהגדרות רגישות באמצעות Secret Manager.

מגבלות

בקטעים הבאים מתוארות המגבלות שחלות על צירוף סודות.

נתיבים אסורים

  • ב-Cloud Run אי אפשר לטעון סודות בנתיבים /dev, /proc ו-/sys, או בספריות המשנה שלהם.
  • אם אתם מטמיעים סודות ב-/tmp ואתם משתמשים בסביבת הפעלה מהדור הראשון, כדאי לעיין בבעיה המוכרת בנושא הטמעת סודות ב-/tmp.
  • ב-Cloud Run אי אפשר לטעון כמה סודות באותה נתיב, כי אי אפשר לטעון שני כרכים באותו מיקום.

סודות אזוריים

‫Cloud Run לא תומך בסודות אזוריים.

שינוי של ספרייה

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

לדוגמה, אם סוד בשם my-secret מותקן בנתיב /etc/app_data, כל התוכן בספרייה app_data יידרס, והקובץ היחיד שיוצג הוא /etc/app_data/my-secret.

כדי להימנע משכתוב של קבצים בספרייה קיימת, יוצרים ספרייה חדשה להרכבת הסוד, למשל /etc/app_data/secrets, כך שנתיב ההרכבה של הסוד יהיה /etc/app_data/secrets/my-secret.