執行個體可能需要 API 金鑰、密碼、憑證或其他機密資訊,才能使用依附元件。對於 Cloud Run,Google 建議將這類機密資訊儲存在您在 Secret Manager 中建立的 Secret。
透過下列其中一種方式,讓容器存取 Secret:
- 將每個密鑰掛接為磁碟區時,Cloud Run 會以檔案形式將密鑰提供給容器。讀取磁碟區時,Cloud Run 一律會從 Secret Manager 擷取密鑰值,以便使用最新版本的值。這種方法也很適合用於 Secret 輪換。
- 使用環境變數傳遞密鑰。系統會在執行個體啟動時解析環境變數,因此如果使用這個方法,Google 建議您將 Secret 固定為特定版本,而非使用
latest做為版本。
詳情請參閱 Secret Manager 的最佳做法。
部署和執行階段如何檢查密鑰
部署執行個體時,Cloud Run 會檢查您使用的所有密鑰。這項檢查可確保執行容器的服務帳戶有權存取這些密鑰。
在執行階段,當執行個體啟動時:
- 如果密鑰是環境變數,Cloud Run 會在啟動執行個體前擷取密鑰值。如果密鑰擷取程序失敗,執行個體就不會啟動。
- 如果將密鑰掛載為磁碟區,Cloud Run 在執行個體啟動期間不會執行任何檢查。不過,在執行階段,如果無法存取密鑰,嘗試讀取已掛接磁碟區的作業就會失敗。
磁碟區擁有權
Cloud Run 密鑰磁碟區的擁有權會因執行環境和部署類型而異。
使用第二代執行環境 (執行個體一律使用此環境) 掛接密碼磁碟區時,磁碟區會由根目錄擁有。
事前準備
啟用 Secret Manager API。
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。- 使用現有的密鑰,或在 Secret Manager 中建立密鑰,如「 建立密鑰」一文所述。
必要的角色
如要取得設定密鑰所需的權限,請要求管理員授予您下列 IAM 角色:
- Cloud Run 系統管理員 (
roles/run.admin) 在 Cloud Run 執行個體上 - 服務身分上的服務帳戶使用者 (
roles/iam.serviceAccountUser)
如要允許 Cloud Run 存取密碼,服務身分必須具備下列角色:
- Secret Manager 密鑰存取者 (
roles/secretmanager.secretAccessor)
如要瞭解如何將服務身分主體新增至 Secret Manager 密鑰存取者角色,請參閱「管理密鑰存取權」。
如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run 執行個體與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。
讓 Cloud Run 存取 Secret
部署新執行個體或更新現有執行個體時,可以使用 Google Cloud CLI 或 YAML,讓執行個體存取 Secret:
gcloud
如要在部署執行個體時將 Secret 設為環境變數,請執行下列指令:
gcloud beta run instances deploy INSTANCE \ --image IMAGE_URL \ --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION
更改下列內容:
INSTANCE:執行個體的名稱。IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。ENV_VAR_NAME:要搭配密鑰使用的環境變數名稱。SECRET_NAME:同一專案中的 Secret 名稱,例如mysecret。VERSION:密鑰版本。使用latest代表最新版本,或使用數字 (例如2)。
如要同時更新多個 Secret,請以半形逗號分隔每個 Secret 的設定選項。下列指令會更新一個掛接為磁碟區的 Secret,以及另一個設為環境變數的 Secret。若要更新現有密鑰,請執行下列命令:
gcloud beta run instances deploy INSTANCE \ --image IMAGE_URL \ --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
如要清除現有密鑰,並讓執行個體存取新密鑰,請使用
--set-secrets旗標:gcloud beta run instances update INSTANCE \ --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"
YAML
如果您要建立新執行個體,請略過這個步驟。 如要更新現有執行個體,請下載其 YAML 設定:
gcloud beta run instances describe INSTANCE --format export > instance.yaml
以環境變數形式公開的密鑰:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA spec: containers: - image: IMAGE_URL env: - name: ENV_VAR valueFrom: secretKeyRef: key: SECRET_VERSION name: SECRET_NAME
更改下列內容:
- INSTANCE:Cloud Run 執行個體的名稱。
IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- ENV_VAR:環境變數的名稱。
- SECRET_VERSION:密鑰版本。使用
latest代表最新版本,或使用數字 (例如2)。 - SECRET_NAME:密鑰名稱,例如
mysecret。
對於以檔案路徑掛接的密鑰:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA 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
更改下列內容:
- INSTANCE:Cloud Run 執行個體的名稱。
IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- VOLUME_NAME:磁碟區的名稱。
- MOUNT_PATH:要掛接磁碟區的相對路徑,例如
/mnt/my-volume。 - SECRET_NAME:密鑰名稱,例如
mysecret。 - SECRET_VERSION:密鑰版本。使用
latest代表最新版本,或使用數字 (例如2)。
使用下列指令,以新設定取代執行個體:
gcloud beta run services replace service.yaml
參照其他專案中的密鑰
如要參照其他專案中的 Secret,請確認專案的執行個體帳戶已取得 Secret 存取權限。
gcloud
如要將 Secret 參照為環境變數,請執行下列指令:
gcloud beta run instances deploy INSTANCE \ --image IMAGE_URL \ --update-secrets=ENV_VAR_NAME=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
更改下列內容:
- INSTANCE:執行個體的名稱。
IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- PROJECT_NUMBER:建立 Secret 的專案編號。
- SECRET_NAME:密鑰名稱,例如
mysecret。 - VERSION:密鑰版本。使用
latest代表最新版本,或使用數字 (例如2)。
YAML
如果您要建立新執行個體,請略過這個步驟。 如要更新現有執行個體,請下載其 YAML 設定:
gcloud beta run instances describe INSTANCE --format export > instance.yaml
以環境變數形式公開的密鑰:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA 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
更改下列內容:
- INSTANCE:Cloud Run 執行個體的名稱。
- SECRET_LOOKUP_NAME:任何符合有效密鑰名稱語法的名稱,例如
my-secret,可以與 SECRET_NAME 相同。 - PROJECT_NUMBER:建立密鑰的專案專案編號。
- SECRET_NAME:密鑰名稱,例如
mysecret。 IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- ENV_VAR:環境變數的名稱。
- SECRET_VERSION:密鑰版本。使用
latest代表最新版本,或使用數字 (例如2)。
對於以檔案路徑掛接的密鑰:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA 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
更改下列內容:
- INSTANCE:Cloud Run 執行個體的名稱。
- SECRET_LOOKUP_NAME:任何具有有效密鑰名稱語法的名稱,例如
my-secret。可以與 SECRET_NAME 相同。 - PROJECT_NUMBER:建立密鑰的專案專案編號。
- SECRET_NAME:密鑰名稱,例如
mysecret。 IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- VOLUME_NAME:磁碟區的名稱。
- MOUNT_PATH:要掛接磁碟區的相對路徑,例如
/mnt/my-volume。 - SECRET_VERSION:密鑰版本。使用
latest代表最新版本,或使用數字 (例如2)。
使用下列指令,以新設定取代執行個體:
gcloud beta run instances replace instance.yaml
查看密鑰設定
如要查看 Cloud Run 執行個體的目前密鑰設定:
gcloud
使用下列指令:
gcloud beta run instances describe INSTANCE
在傳回的設定中找出密鑰設定。
從執行個體中移除密鑰
您可以使用 gcloud CLI 從執行個體移除 Secret:
gcloud
您可以移除執行個體的所有 Secret,或指定移除其中一或多個 Secret。
如要移除所有 Secret,請執行下列指令:
gcloud beta run instances deploy INSTANCE --image IMAGE_URL \ --clear-secrets
更改下列內容:
- INSTANCE:執行個體的名稱。
IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。
如需指定要移除的 Secret 清單,請使用 --remove-secrets 旗標。下列指令會移除一個掛接為磁碟區的 Secret,以及另一個設為環境變數的 Secret:
gcloud beta run instances deploy INSTANCE --image IMAGE_URL \ --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH
更改下列內容:
- INSTANCE:執行個體的名稱。
IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello: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 的密鑰掛接至路徑 /etc/app_data,app_data 目錄內的所有內容都會遭到覆寫,且只會顯示 /etc/app_data/my-secret 檔案。
為避免覆寫現有目錄中的檔案,請建立新目錄來掛接密鑰,例如 /etc/app_data/secrets,這樣密鑰的掛接路徑就會是 /etc/app_data/secrets/my-secret。