設定服務的密鑰

您的服務可能需要依附元件,這些元件需要 API 金鑰、密碼、憑證或其他機密資訊。針對 Cloud Run,Google 建議您將這類機密資訊儲存在 Secret Manager 中建立的機密中。

您可以透過下列兩種方式,讓機密資料提供給容器:

  • 將每個密鑰掛接為磁碟區,讓容器可透過檔案存取密鑰。讀取卷時,系統一律會從 Secret Manager 擷取密鑰值,因此可以搭配最新版本使用。這個方法也適用於機密金鑰輪替。
  • 使用環境變數傳遞密鑰。環境變數會在執行個體啟動時解析,因此如果您使用這個方法,Google 建議您將機密資料釘選至特定版本,而非使用「最新」

詳情請參閱 Secret Manager 的最佳做法文件。

如何在部署和執行階段檢查密鑰

在服務部署期間,系統會檢查所有使用的機密金鑰 (無論是做為環境變數或掛載為磁碟區),確保用於執行容器的服務帳戶有權存取這些機密金鑰。如果任何檢查失敗,服務部署作業就會失敗。

在執行期間,當執行個體啟動時:

  • 如果機密金鑰是環境變數,系統會在啟動執行個體前擷取機密金鑰的值,因此如果擷取機密金鑰失敗,執行個體就不會啟動。
  • 如果密鑰已掛接為磁碟區,執行個體啟動時就不會執行檢查作業。不過,如果在執行期間無法存取機密金鑰,嘗試讀取已掛載的磁碟區就會失敗。

不同執行環境和部署類型會有不同的音量擁有權

掛接 Secret 磁碟區時,擁有檔案和目錄的身分會因工作負載的執行環境和部署作業是否包含一個或多個容器而有所不同。

在第一代執行環境中,如果您要部署單一容器,密鑰磁碟區就會由用於容器的身分擁有。在其他所有情況下,則由 root 擁有。包括:

  • 第一代執行環境,您在其中部署多個容器
  • 第二代環境

事前準備

  1. Enable the Secret Manager API.

    Enable the API

  2. 使用現有的密鑰,或按照「 建立密鑰」一文的說明,在 Secret Manager 中建立密鑰。

必要的角色

如要取得設定機密金鑰所需的權限,請要求管理員授予您下列 IAM 角色:

  • Cloud Run 服務中的 Cloud Run 管理員 (roles/run.admin)
  • 服務身分上的「服務帳戶使用者」 (roles/iam.serviceAccountUser)

如要讓 Cloud Run 存取機密資料,服務身分識別資訊必須具備下列角色:

如需將服務身分主體新增至 Secret Manager 密鑰存取者角色的操作說明,請參閱「管理密鑰存取權」。

如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果您的 Cloud Run 服務會與Google Cloud API 互動 (例如 Cloud 用戶端程式庫),請參閱服務身分設定指南。如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。

讓 Cloud Run 存取密鑰

任何設定變更都會建立新的修訂版本。除非您明確做出更新,否則後續的修訂版本也會自動取得這個設定。

您可以使用 Google Cloud 主控台、Google Cloud CLI 或 YAML 檔案,在部署新的服務或更新現有服務,以及部署修訂版本時,讓服務存取機密。按一下所需分頁標籤:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 按一下「Deploy container」(部署容器),然後選取「Service」(服務) 來設定新服務。填寫初始服務設定頁面,然後點選「容器、磁碟區、網路與安全性」展開服務設定頁面。

  3. 如果您要設定現有服務,請按一下該服務,然後點選「編輯並部署新修訂版本」

  4. 請按照步驟將密鑰掛接為磁碟區,或將密鑰公開為環境變數。

    • 如要將密鑰做為環境變數公開,請按照下列步驟操作:

      1. 按一下「容器」分頁標籤。
      2. 在「變數和密鑰」分頁中,按一下「參照密鑰」
      3. 在「名稱 1」欄位中輸入環境變數的名稱。
      4. 從「Secret」清單中選取要使用的 Secret。
      5. 在「Version 1」清單中,選取要參照的秘密版本。
      6. 按一下 [完成]
      7. 按一下 [Create] (建立) 或 [Deploy] (部署)
    • 如要將密鑰掛接為磁碟區,請按照下列步驟操作:

      1. 按一下「Volumes」分頁標籤,然後選取「Add volume」
      2. 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(機密)
      3. 在「Volume name」 欄位中輸入名稱或接受預設名稱。
      4. 從「Secret」清單中選取要使用的 Secret。
      5. 在「Path 1」欄位中,輸入要掛載的檔案名稱。
      6. 在「Version 1」清單中,選取要參照的秘密版本。根據預設,系統會選取最新版本。您可以視需要選取特定版本。
      7. 按一下 [完成]
      8. 前往「容器」分頁,將密鑰掛接至容器。
      9. 在「Volume mounts」(磁碟區掛接) 分頁中,按一下「Mount volume」(掛接磁碟區)
      10. 從「Name 1」清單中選取音量名稱。
      11. 在「Mount path 1」欄位中,輸入這個機密金鑰的掛接路徑。這是所有密鑰版本的所在目錄。
      12. 按一下 [完成]
      13. 按一下 [Create] (建立) 或 [Deploy] (部署)

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。網址的形狀為 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。網址的形狀為 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_VARVERSION 和/或 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. 對於掛載為檔案路徑的 Secret,請視需要更新 MOUNT_PATHVOLUME_NAMEVERSIONFILENAME 和/或 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。網址的形狀為 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. 您可以透過掛接的檔案路徑或環境變數,從 Cloud Run 存取 Secret Manager 密鑰。

    1. 對於掛接為檔案路徑的密鑰,請在 volumes 參數中參照 Secret Manager 資源。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. 如要以環境變數形式公開密鑰,請在 env 參數中參照 Secret Manager 資源:

      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]
      }

參照其他專案中的密鑰

如要參照其他專案的密鑰,請確認專案的服務帳戶已取得密鑰的存取權

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 按一下「Deploy container」(部署容器),然後選取「Service」(服務) 來設定新服務。填寫初始服務設定頁面,然後點選「容器、磁碟區、網路與安全性」展開服務設定頁面。

  3. 如果您要設定現有服務,請按一下該服務,然後點選「編輯並部署新修訂版本」

  4. 請按照步驟將密鑰掛接為磁碟區,或將密鑰公開為環境變數。

    • 如要將密鑰做為環境變數公開,請按照下列步驟操作:

      1. 按一下「容器」分頁標籤。
      2. 在「變數和密鑰」分頁中,按一下「參照密鑰」
      3. 在「名稱 1」欄位中輸入環境變數的名稱。
      4. 在「密鑰」清單中,按一下「手動輸入密鑰」
      5. 請按照下列格式輸入密鑰的資源 ID:

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

        更改下列內容:

        • PROJECT_NUMBER 換成您的 Google Cloud 專案編號。如要進一步瞭解如何找出專案編號,請參閱「建立及管理專案」。

        • SECRET_NAME:Secret Manager 中的機密金鑰名稱。

      6. 在「Version 1」清單中,選取要參照的秘密版本。

      7. 按一下 [完成]

      8. 按一下 [Create] (建立) 或 [Deploy] (部署)

    • 如要將密鑰掛接為磁碟區,請按照下列步驟操作:

      1. 按一下「Volumes」分頁標籤,然後選取「Add volume」
      2. 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(機密)
      3. 在「Volume name」 欄位中輸入名稱或接受預設名稱。
      4. 在「密鑰」清單中,按一下「手動輸入密鑰」
      5. 請按照下列格式輸入密鑰的資源 ID:

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

        更改下列內容:

        • PROJECT_NUMBER 換成您的 Google Cloud 專案編號。如要進一步瞭解如何找出專案編號,請參閱「建立及管理專案」。

        • SECRET_NAME:Secret Manager 中的機密金鑰名稱。

      6. 在「Path 1」欄位中,輸入要掛載的檔案名稱。

      7. 在「Version 1」清單中,選取要參照的秘密版本。根據預設,系統會選取最新版本。您可以視需要選取特定版本。

      8. 按一下 [完成]

      9. 前往「容器」分頁,將密鑰掛接至容器。

      10. 在「Volume mounts」(磁碟區掛接) 分頁中,按一下「Mount volume」(掛接磁碟區)

      11. 從「Name 1」清單中選取音量名稱。

      12. 在「Mount path 1」欄位中,輸入這個機密金鑰的掛接路徑。這是所有密鑰版本的所在目錄。

      13. 按一下 [完成]

      14. 按一下 [Create] (建立) 或 [Deploy] (部署)

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。網址的形狀為 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。網址的形狀為 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. 對於掛載為檔案路徑的 Secret:

    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。網址的形狀為 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 指令」。

將下列內容新增至 Terraform 設定中的 google_cloud_run_v2_service 資源:

以環境變數形式公開的密鑰:

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "us-central1"

  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 工作名稱。
  • IMAGE_URL 與容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用的是 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的形狀為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • SECRET_NAME 與密鑰名稱,例如 mysecret
  • PROJECT_ID 與建立密鑰的專案 ID 搭配使用。
  • VERSION 與密鑰版本。請使用 latest 代表最新版本,或使用數字,例如 2

如果密鑰已掛載為檔案路徑:

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "us-central1"

  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 工作名稱。
  • IMAGE_URL 與容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用的是 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的形狀為 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 與建立密鑰的專案 ID 搭配使用。
  • SECRET_NAME 與密鑰名稱,例如 mysecret

查看密鑰設定

如要查看 Cloud Run 服務目前的機密資料設定,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 按一下您感興趣的服務,開啟「服務詳細資料」頁面。

  3. 按一下「Revisions」(修訂版本) 分頁標籤。

  4. 在右側的詳細資料面板中,「機密資料」設定會列在「容器」分頁下方。

gcloud

  1. 使用下列指令:

    gcloud run services describe SERVICE
  2. 在傳回的設定中找出密鑰設定。

從服務中移除密鑰

您可以使用 Google Cloud 控制台或 gcloud CLI 從服務中移除密鑰:

主控台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 從清單中選取服務,然後按一下「編輯並部署新版本」

  3. 按一下「容器」分頁標籤。

  4. 如要刪除已掛載為磁碟區的祕密,請選取「Volume mounts」分頁,將游標懸停在要移除的祕密上,然後按一下 「Delete」

  5. 如要刪除以環境變數形式公開的密鑰,請選取「變數和密鑰」分頁,將游標懸停在要移除的密鑰上,然後按一下 「刪除」

  6. 按一下 [Deploy] (部署)

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。網址的形狀為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • 如要指定要移除的 Secret 清單,請使用 --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。網址的形狀為 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 中掛接,且磁碟區掛接路徑中的最後一個目錄已存在,則無法存取現有目錄中的任何檔案或資料夾。

舉例來說,如果名為 my-secret 的機密資料掛載至路徑 /etc/app_dataapp_data 目錄內的所有內容都會遭到覆寫,唯一可見的檔案就是 /etc/app_data/my-secret

為避免覆寫現有目錄中的檔案,請建立新目錄來掛載機密,例如 /etc/app_data/secrets,這樣機密的掛載路徑就會是 /etc/app_data/secrets/my-secret