設定工作站集區的密鑰

工作站集區可能需要 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 在啟動執行個體時不會執行任何檢查。不過,在執行階段,如果無法存取 Secret,嘗試讀取已掛接磁碟區的作業就會失敗。

磁碟區擁有權

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

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

事前準備

  1. 啟用 Secret Manager API。

    啟用 API 時所需的角色

    如要啟用 API,您需要服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    啟用 API

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

必要的角色

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

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

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

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

如需與 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」(部署容器),設定新的工作站集區。填寫初始工作站集區設定頁面,然後點選「Containers, 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. 按一下「Volumes」(磁碟區) 分頁標籤。
      2. 按一下「掛接磁碟區」
      3. 按一下「密鑰」
      4. 在「Mount path」(掛接路徑) 欄位輸入此 Secret 的掛接路徑。所有 Secret 版本都會放置在此目錄下。
      5. 從「Secret」清單中選取要使用的 Secret。
      6. 在「Path 1」欄位中輸入要掛接的檔案名稱。
      7. 在「Version 1」清單中,選取要參照的 Secret 版本。系統預設會選取最新版本。如要選取特定版本,請點選該版本。
      8. 按一下 [儲存]
      9. 按一下 [Create] (建立) 或 [Deploy] (部署)

gcloud

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

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

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

YAML

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

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

    apiVersion: run.googleapis.com/v1
    kind: WorkerPool
    metadata:
      name: WORKER_POOL
    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. 對於以檔案路徑掛接的密鑰:

    apiVersion: run.googleapis.com/v1
    kind: WorkerPool
    metadata:
      name: WORKER_POOL
    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」(部署容器),設定新的工作站集區。填寫初始工作站集區設定頁面,然後點選「Containers, 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. 按一下「Volumes」(磁碟區) 分頁標籤。
      2. 按一下「掛接磁碟區」
      3. 按一下「密鑰」
      4. 在「Mount path」(掛接路徑) 欄位輸入此 Secret 的掛接路徑。所有 Secret 版本都會放置在此目錄下。
      5. 在「Secret」清單中,按一下「Enter secret manually」
      6. 請輸入 Secret 的資源 ID,格式如下:

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

        更改下列內容:

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

        • SECRET_NAME:Secret Manager 中的 Secret 名稱。

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

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

      9. 按一下 [儲存]

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

gcloud

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

gcloud 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 run worker-pools describe WORKER_POOL --format export > workerpool.yaml
  2. 以環境變數形式公開的密鑰:

    apiVersion: run.googleapis.com/v1
    kind: WorkerPool
    metadata:
      name: WORKER_POOL
    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. 對於以檔案路徑掛接的密鑰:

    apiVersion: run.googleapis.com/v1
    kind: WorkerPool
    metadata:
      name: WORKER_POOL
    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 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 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 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