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

יכול להיות שהשירות שלכם ידרוש מפתחות 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, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    להפעלת ה-API

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

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

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

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

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

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

איך מאפשרים ל-Cloud Run לגשת לסוד

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

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

המסוף

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

    כניסה ל-Cloud Run

  2. בתפריט הניווט של Cloud Run, לוחצים על Services:

    1. אם אתם מגדירים שירות חדש, לוחצים על Deploy container וממלאים את דף הגדרות השירות הראשוני. לאחר מכן לוחצים על Containers, Networking, Security כדי להרחיב את דף הגדרת השירות.

    2. אם אתם מגדירים שירות קיים, לוחצים על השירות.

  3. פועלים לפי השלבים כדי לטעון את הסוד כנפח אחסון או לחשוף אותו כמשתנה סביבה.

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

      1. לוחצים על הכרטיסייה מאגרי תגים.
      2. בקטע Variables and Secrets, לוחצים על Reference a secret.
      3. בשדה Name 1, מזינים את השם של משתנה הסביבה.
      4. ברשימה Secret, בוחרים את הסוד שבו רוצים להשתמש.
      5. ברשימה Version 1, בוחרים את גרסת הסוד שאליה רוצים להפנות.
      6. לוחצים על סיום.
      7. כדי ליצור שירות חדש, לוחצים על יצירה. לוחצים על View diff & redeploy ואז על Deploy changes בשירות קיים.
    • כדי לטעון את הסוד כנפח:

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

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: נתיב הטעינה של ה-volume ושם הקובץ של הסוד. הוא חייב להתחיל בלוכסן, לדוגמה: /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. נכנסים ל-Cloud Run במסוף Google Cloud :

    כניסה ל-Cloud Run

  2. בתפריט הניווט של Cloud Run, לוחצים על Services:

    1. אם אתם מגדירים שירות חדש, לוחצים על Deploy container וממלאים את דף הגדרות השירות הראשוני. לאחר מכן לוחצים על Containers, Networking, Security כדי להרחיב את דף הגדרת השירות.

    2. אם אתם מגדירים שירות קיים, לוחצים על השירות.

  3. פועלים לפי השלבים כדי לטעון את הסוד כנפח אחסון או לחשוף אותו כמשתנה סביבה.

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

      1. אם אתם מגדירים שירות קיים, לחצו על הכרטיסייה Containers. אם יוצרים שירות חדש, לוחצים על Containers, Networking, Security כדי להרחיב את האפשרויות.
      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. לוחצים על View diff & redeploy ואז על Deploy changes.

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

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

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

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

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

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

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

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

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

      10. לוחצים על View diff & redeploy ואז על Deploy changes.

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: נתיב הטעינה של ה-volume ושם הקובץ של הסוד. הוא חייב להתחיל בלוכסן, לדוגמה: /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: נתיב הטעינה של ה-volume ושם הקובץ של הסוד. הוא חייב להתחיל בלוכסן, לדוגמה: /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: נתיב הטעינה של ה-volume ושם הקובץ של הסוד. הוא חייב להתחיל בלוכסן, לדוגמה: /etc/secrets/dbconfig/password, כאשר /etc/secrets/dbconfig/ הוא נתיב הטעינה של אמצעי האחסון ו-password הוא שם הקובץ של הסוד.
  • ‫PROJECT_ID: מזהה הפרויקט שבו נוצר הסוד.
  • ‫SECRET_NAME: שם הסוד, לדוגמה mysecret.

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

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

המסוף

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

    כניסה ל-Cloud Run

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

  3. לוחצים על הכרטיסייה מאגרי תגים כדי לראות את ההגדרות.

gcloud

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

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

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

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

המסוף

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

    כניסה ל-Cloud Run

  2. בוחרים את השירות מהרשימה.

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

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

  5. כדי ליצור שירות חדש, לוחצים על יצירה. לוחצים על View diff & redeploy ואז על Deploy changes בשירות קיים.

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.