設定工作站集區的密鑰

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

透過下列其中一種方式,讓容器存取 Secret:

  • 將每個密鑰掛接為磁碟區時,Cloud Run 會以檔案形式將密鑰提供給容器。讀取磁碟區時,Cloud Run 一律會從 Secret Manager 擷取密鑰值,以便使用最新版本的值。這種方法也很適合用於 Secret 輪換。
  • 使用環境變數傳遞密鑰。系統會在執行個體啟動時解析環境變數,因此如果使用這個方法,Google 建議將 Secret 固定在特定版本,而非使用 latest 做為版本。

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

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

部署工作站集區時,Cloud Run 會檢查您使用的所有密鑰。這項檢查可確保執行容器的服務帳戶有權存取這些密鑰。

在執行階段,當執行個體啟動時:

  • 如果密鑰是環境變數,Cloud Run 會在啟動執行個體前擷取密鑰值。如果密鑰擷取程序失敗,執行個體就不會啟動。
  • 如果將密鑰掛接為磁碟區,Cloud Run 就不會在執行個體啟動期間執行任何檢查。不過,在執行階段,如果無法存取密鑰,嘗試讀取已掛接磁碟區的作業就會失敗。

磁碟區擁有權

Cloud Run 密鑰磁碟區的擁有權會因執行環境和部署類型而異。

使用第二代執行環境 (工作站集區一律使用此環境) 掛接祕密磁碟區時,磁碟區會由根目錄擁有。

事前準備

  1. Enable the Secret Manager API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

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

必要的角色

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

  • Cloud Run 管理員 (roles/run.admin) 在 Cloud Run worker 集區上
  • 服務帳戶使用者 (roles/iam.serviceAccountUser) 服務身分

如要允許 Cloud Run 存取密鑰,服務身分必須具備下列角色:

如要瞭解如何將服務身分主體新增至 Secret Manager 密鑰存取者角色,請參閱「管理密鑰存取權」。

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

讓 Cloud Run 存取 Secret

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

部署新的工作站集區或更新現有工作站集區,並部署修訂版本時,可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML,讓工作站集區存取 Secret。按一下所需的分頁標籤:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「工作站集區」頁面:

    前往 Cloud Run

  2. 按一下「Deploy container」(部署容器),設定新的工作站集區。填寫初始工作站集區設定頁面,然後按一下「Container(s), Volumes, Networking, Security」(容器、磁碟區、網路與安全性),展開設定頁面。

  3. 如要設定現有 worker 集區,請按一下該集區,然後按一下「Edit and deploy new revision」(編輯並部署新修訂版本)

  4. 按照步驟將 Secret 掛接為磁碟區,或將其設為環境變數。

    • 將 Secret 設定為環境變數的方法如下:

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

      1. 按一下「磁碟區」分頁標籤,然後選取「新增磁碟區」
      2. 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(密鑰)
      3. 在「磁碟區名稱」欄位中輸入名稱,或接受預設名稱。
      4. 從「Secret」清單中選取要使用的 Secret。
      5. 在「Path 1」欄位中輸入要掛接的檔案名稱。
      6. 在「Version 1」清單中,選取要參照的 Secret 版本。系統預設會選取最新版本。如要選取特定版本,請點選該版本。
      7. 按一下 [完成]
      8. 前往「容器」分頁,將密鑰掛接到容器。
      9. 在「Volume mounts」(磁碟區掛接) 分頁中,按一下「Mount volume」(掛接磁碟區)
      10. 從「Name 1」(名稱 1) 清單中選取磁碟區名稱。
      11. 在「Mount path 1」(掛接路徑 1) 欄位中,輸入此密鑰的掛接路徑。 所有 Secret 版本都會放置在此目錄下。
      12. 按一下 [完成]
      13. 按一下 [Create] (建立) 或 [Deploy] (部署)

gcloud

  • 如要在部署工作站集區時將 Secret 設為環境變數,請執行下列指令:

    gcloud beta run worker-pools deploy WORKER_POOL \
    --image IMAGE_URL \
    --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION

    更改下列內容:

    • WORKER_POOL:工作站集區的名稱。
    • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
    • ENV_VAR_NAME:要搭配密鑰使用的環境變數名稱。
    • SECRET_NAME:同一專案中的密鑰名稱,例如 mysecret
    • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字 (例如 2)。
  • 如要同時更新多個 Secret,請以半形逗號分隔每個 Secret 的設定選項。下列指令會更新一個掛接為磁碟區的 Secret,以及另一個設為環境變數的 Secret。如要更新現有密鑰,請執行下列指令:

    gcloud beta run worker-pools deploy WORKER_POOL \
    --image IMAGE_URL \
    --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
  • 如要清除現有密碼,並讓工作站集區存取新密碼,請使用 --set-secrets 旗標:

    gcloud beta run worker-pools update WORKER_POOL \
    --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"

YAML

  1. 如要建立新的工作站集區,請略過這個步驟。 如要更新現有工作站集區,請下載 YAML 設定

    gcloud beta run worker-pools describe WORKER_POOL --format export > workerpool.yaml
  2. 以環境變數形式公開的密鑰:

    apiVersion: run.googleapis.com/v1
    kind: WorkerPool
    metadata:
      name: WORKER_POOL
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
          - image: IMAGE_URL
            env:
            - name: ENV_VAR
              valueFrom:
                secretKeyRef:
                  key: SECRET_VERSION
                  name: SECRET_NAME

    更改下列內容:

    • WORKER_POOL:Cloud Run worker 集區的名稱。
    • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
    • ENV_VAR:環境變數的名稱。
    • SECRET_VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字 (例如 2)。
    • SECRET_NAME:密鑰名稱,例如 mysecret
  3. 如要將 Secret 掛接為檔案路徑,請按照下列步驟操作:

    apiVersion: run.googleapis.com/v1
    kind: WorkerPool
    metadata:
      name: WORKER_POOL
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - name: VOLUME_NAME
              mountPath: MOUNT_PATH
          volumes:
          - name: VOLUME_NAME
            secret:
              secretName: SECRET_NAME
              items:
              - key: SECRET_VERSION
                path: SECRET_NAME

    更改下列內容:

    • WORKER_POOL:Cloud Run worker 集區的名稱。
    • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
    • VOLUME_NAME:磁碟區的名稱。
    • MOUNT_PATH:要掛接磁碟區的相對路徑,例如 /mnt/my-volume
    • SECRET_NAME:密鑰名稱,例如 mysecret
    • SECRET_VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字 (例如 2)。
  4. 使用下列指令,以新設定取代服務:

    gcloud run services replace service.yaml

參照其他專案中的密鑰

如要參照其他專案中的 Secret,請確認專案的工作站集區帳戶已取得 Secret 存取權

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「工作站集區」頁面:

    前往 Cloud Run

  2. 按一下「Deploy container」(部署容器),設定新的工作站集區。填寫初始工作站集區設定頁面,然後按一下「Container(s), Volumes, Networking, Security」(容器、磁碟區、網路與安全性),展開設定頁面。

  3. 如要設定現有 worker 集區,請按一下該集區,然後按一下「Edit and deploy new revision」(編輯並部署新修訂版本)

  4. 按照步驟將 Secret 掛接為磁碟區,或將其設為環境變數。

    • 將 Secret 設定為環境變數的方法如下:

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

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

        更改下列內容:

        • PROJECT_NUMBER 改成您的 Google Cloud 專案編號。如需如何找出專案編號的詳細操作說明,請參閱「建立及管理專案」。

        • SECRET_NAME:Secret Manager 中的 Secret 名稱。

      6. 從「Version 1」清單中,選取要參照的 Secret 版本。

      7. 按一下 [完成]

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

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

      1. 按一下「磁碟區」分頁標籤,然後選取「新增磁碟區」
      2. 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(密鑰)
      3. 在「磁碟區名稱」欄位中輸入名稱,或接受預設名稱。
      4. 在「Secret」清單中,按一下「Enter secret manually」
      5. 請輸入 Secret 的資源 ID,格式如下:

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

        更改下列內容:

        • PROJECT_NUMBER 改成您的 Google Cloud 專案編號。如需如何找出專案編號的詳細操作說明,請參閱「建立及管理專案」。

        • SECRET_NAME:Secret Manager 中的 Secret 名稱。

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

      7. 在「Version 1」清單中,選取要參照的 Secret 版本。系統預設會選取最新版本。如要選取特定版本,請點選該版本。

      8. 按一下 [完成]

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

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

      11. 從「Name 1」(名稱 1) 清單中選取磁碟區名稱。

      12. 在「Mount path 1」(掛接路徑 1) 欄位中,輸入此密鑰的掛接路徑。 所有 Secret 版本都會放置在此目錄下。

      13. 按一下 [完成]

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

gcloud

如要將 Secret 參照為環境變數,請執行下列指令:

gcloud beta run worker-pools deploy WORKER_POOL \
--image IMAGE_URL \
--update-secrets=ENV_VAR_NAME=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION

更改下列內容:

  • WORKER_POOL:工作站集區的名稱。
  • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
  • PROJECT_NUMBER:建立 Secret 的專案編號。
  • SECRET_NAME:密鑰名稱,例如 mysecret
  • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字 (例如 2)。

YAML

  1. 如要建立新的工作站集區,請略過這個步驟。 如要更新現有工作站集區,請下載 YAML 設定

    gcloud beta run worker-pools describe WORKER_POOL --format export > workerpool.yaml
  2. 以環境變數形式公開的密鑰:

    apiVersion: run.googleapis.com/v1
    kind: WorkerPool
    metadata:
      name: WORKER_POOL
      annotations:
        run.googleapis.com/launch-stage: BETA
    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: SECRET_VERSION
                  name: SECRET_LOOKUP_NAME

    更改下列內容:

    • WORKER_POOL:Cloud Run worker 集區的名稱。
    • SECRET_LOOKUP_NAME:任何符合有效密鑰名稱語法的名稱,例如 my-secret,可以與 SECRET_NAME 相同。
    • PROJECT_NUMBER:建立密鑰的專案專案編號。
    • SECRET_NAME:密鑰名稱,例如 mysecret
    • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
    • ENV_VAR:環境變數的名稱。
    • SECRET_VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字 (例如 2)。
  3. 如要將 Secret 掛接為檔案路徑,請按照下列步驟操作:

    apiVersion: run.googleapis.com/v1
    kind: WorkerPool
    metadata:
      name: WORKER_POOL
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - name: VOLUME_NAME
              mountPath: MOUNT_PATH
          volumes:
          - name: VOLUME_NAME
            secret:
              secretName: SECRET_NAME
              items:
              - key: SECRET_VERSION
                path: SECRET_LOOKUP_NAME

    更改下列內容:

    • WORKER_POOL:Cloud Run worker 集區的名稱。
    • SECRET_LOOKUP_NAME:任何符合有效密鑰名稱語法的名稱,例如 my-secret。可以與 SECRET_NAME 相同。
    • PROJECT_NUMBER:建立密鑰的專案編號。
    • SECRET_NAME:密鑰名稱,例如 mysecret
    • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
    • VOLUME_NAME:磁碟區的名稱。
    • MOUNT_PATH:要掛接磁碟區的相對路徑,例如 /mnt/my-volume
    • SECRET_VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字 (例如 2)。
  4. 使用下列指令,以新設定取代服務:

    gcloud run services replace service.yaml

查看密鑰設定

如要查看 Cloud Run 工作站集區目前的 Secret 設定,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run 工作人員集區頁面:

    前往 Cloud Run worker 集區

  2. 按一下所需的工作站集區,開啟「工作站集區詳細資料」頁面。

  3. 按一下「編輯及部署新的修訂版本」

  4. 在設定詳細資料中找出密鑰設定。

gcloud

  1. 使用下列指令:

    gcloud beta run worker-pools describe WORKER_POOL
  2. 在傳回的設定中找出密鑰設定。

從工作站集區中移除 Secret

您可以使用 Google Cloud 控制台或 gcloud CLI,從工作站集區移除 Secret:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「工作站集區」頁面:

    前往 Cloud Run

  2. 從清單中選取 worker 集區,然後按一下「編輯並部署新修訂版本」

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

  4. 如要刪除以磁碟區形式掛接的 Secret,請選取「Volume mounts」(磁碟區掛接) 分頁標籤,將指標懸停在要移除的 Secret 上,然後按一下「Delete」(刪除)

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

  6. 點選「Deploy」(部署)

gcloud

您可以移除工作站集區的所有 Secret,或指定移除其中一或多個 Secret:

  • 如要移除所有 Secret,請執行下列指令:
  gcloud beta run worker-pools deploy WORKER_POOL --image IMAGE_URL \
  --clear-secrets

更改下列內容:

  • WORKER_POOL:工作站集區的名稱。
  • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest

  • 如需指定要移除的 Secret 清單,請使用 --remove-secrets 旗標。下列指令會移除一個掛接為磁碟區的 Secret,以及另一個設為環境變數的 Secret:

  gcloud beta run worker-pools deploy WORKER_POOL --image IMAGE_URL \
  --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH

更改下列內容:

  • WORKER_POOL:工作站集區的名稱。
  • IMAGE_URL:包含工作站集區的容器映像檔參照,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
  • ENV_VAR_NAME:環境變數的名稱。
  • SECRET_FILE_PATH:Secret 的完整路徑。以 /mnt/secrets/primary/latest 為例,/mnt/secrets/primary/ 是掛接路徑,latest 則是 Secret 路徑。您也可以分別指定掛接路徑和 Secret 路徑:

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

在程式碼中使用密鑰

如需在程式碼中以環境變數形式存取密鑰的範例,請參閱使用者驗證教學課程,特別是「使用 Secret Manager 處理機密設定」一節。

限制

以下各節說明掛接密鑰的限制。

不允許的路徑

  • Cloud Run 不允許您在 /dev/proc/sys 或其子目錄中掛接密鑰。
  • Cloud Run 不允許您在同一路徑掛接多個密鑰,因為兩個磁碟區掛接點無法掛接在同一位置。

區域性密鑰

Cloud Run 不支援區域性密鑰

覆寫目錄

如果密鑰在 Cloud Run 中以磁碟區形式掛接,且磁碟區掛接路徑中的最後一個目錄已存在,則現有目錄中的任何檔案或資料夾都會無法存取。

舉例來說,如果名為 my-secret 的 Secret 掛接至路徑 /etc/app_dataapp_data 目錄內的所有內容都會遭到覆寫,且只會顯示 /etc/app_data/my-secret 檔案。

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