服務可能需要 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 密鑰磁碟區的擁有權會因執行環境和部署類型而異。
掛接密鑰磁碟區時,檔案和目錄的擁有者身分會因工作負載的執行環境,以及部署作業是否包含一或多個容器而有所不同。
在部署單一容器的第一代執行環境中,您用於容器的身分擁有密鑰磁碟區。在所有其他情況下,磁碟區都屬於根目錄。包括:
- 您要部署多個容器的第一代執行環境
- 第二代環境
事前準備
-
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 theserviceusage.services.enablepermission. Learn how to grant roles. - 使用現有的密鑰,或按照「 建立密鑰」一文的說明,在 Secret Manager 中建立密鑰。
必要的角色
如要取得設定密鑰所需的權限,請要求管理員授予您下列 IAM 角色:
-
Cloud Run 管理員 (
roles/run.admin) 在 Cloud Run 服務上 -
服務帳戶使用者 (
roles/iam.serviceAccountUser) 服務身分
如要允許 Cloud Run 存取密鑰,服務身分必須具備下列角色:
- Secret Manager Secret Accessor (
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 控制台、Google Cloud CLI 或 YAML 檔案,讓服務存取 Secret。按一下所需的分頁標籤:
控制台
前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:
按一下「Deploy container」(部署容器),設定新服務。填寫初始服務設定頁面,然後按一下「Container(s), Volumes, Networking, Security」,展開服務設定頁面。
如要設定現有服務,請按一下該服務,然後按一下「編輯及部署新的修訂版本」。
按照步驟將 Secret 掛接為磁碟區,或將其設為環境變數。
將 Secret 設定為環境變數的方法如下:
- 按一下「容器」分頁標籤。
- 在「變數和密鑰」分頁中,按一下「參照密鑰」。
- 在「Name 1」欄位輸入環境變數的名稱。
- 從「Secret」清單中選取要使用的 Secret。
- 從「Version 1」清單中,選取要參照的 Secret 版本。
- 按一下 [完成]。
- 按一下 [Create] (建立) 或 [Deploy] (部署)。
如要將 Secret 掛接為磁碟區,請按照下列步驟操作:
- 按一下「磁碟區」分頁標籤,然後選取「新增磁碟區」。
- 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(密鑰)。
- 在「磁碟區名稱」欄位中輸入名稱,或接受預設名稱。
- 從「Secret」清單中選取要使用的 Secret。
- 在「Path 1」欄位中輸入要掛接的檔案名稱。
- 在「Version 1」清單中,選取要參照的 Secret 版本。系統預設會選取最新版本。如要選取特定版本,請點選該版本。
- 按一下 [完成]。
- 前往「容器」分頁,將密鑰掛接到容器。
- 在「Volume mounts」(磁碟區掛接) 分頁中,按一下「Mount volume」(掛接磁碟區)。
- 從「Name 1」(名稱 1) 清單中選取磁碟區名稱。
- 在「Mount path 1」(掛接路徑 1) 欄位中,輸入此密鑰的掛接路徑。 所有 Secret 版本都會放置在此目錄下。
- 按一下 [完成]。
- 按一下 [Create] (建立) 或 [Deploy] (部署)。
gcloud
如要讓服務存取 Secret,請輸入下列其中一個指令。
部署服務時,將 Secret 掛接為磁碟區的方法如下:
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必須REPO_NAME已建立。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG PATH:磁碟區的掛接路徑和 Secret 的檔案名稱。開頭必須為正斜線,例如:/etc/secrets/dbconfig/password,其中/etc/secrets/dbconfig/是磁碟區的掛接路徑,password則是 Secret 的檔案名稱。SECRET_NAME:同一專案中的密鑰名稱,例如mysecret。VERSION:密鑰版本。使用latest代表最新版本,或使用數字 (例如2)。
部署服務時,將 Secret 設定為環境變數的方法如下:
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必須REPO_NAME已建立。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。 ENV_VAR_NAME:要搭配密鑰使用的環境變數名稱。SECRET_NAME:同一專案中的密鑰名稱,例如mysecret。VERSION:密鑰版本。使用latest代表最新版本,或使用數字 (例如2)。
您可以同時更新多個 Secret。如要這麼做,請以半形逗號分隔每個密鑰的設定選項。下列指令會更新一個掛接為磁碟區的 Secret,以及另一個設為環境變數的 Secret。
如要更新現有 Secret,請輸入下列指令:
gcloud run deploy SERVICE --image IMAGE_URL \ --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
如要清除現有 Secret,並讓服務存取新的 Secret,請使用
--set-secrets旗標:gcloud run services update SERVICE \ --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"
YAML
如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定:
gcloud run services describe SERVICE --format export > service.yaml
如要以環境變數形式公開密鑰,請在
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
如要更新以檔案路徑形式裝載的密鑰,請視需要更新 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必須REPO_NAME已建立。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。 - REVISION,然後輸入新的修訂版本名稱,或刪除現有名稱。如果您提供新的修訂版本名稱,則必須符合下列條件:
- 開頭為「
SERVICE-」 - 只能包含小寫字母、數字和
- - 結尾不是
- - 不超過 63 個字元
- 開頭為「
使用下列指令,以新設定取代服務:
gcloud run services replace service.yaml
Terraform
建立密鑰和密鑰版本。
建立服務帳戶並授予存取密鑰的權限:
您可以透過掛接的檔案路徑或環境變數,從 Cloud Run 存取 Secret Manager 密鑰。
如要將密鑰掛接為檔案路徑,請在
volumes參數中參照 Secret Manager 資源。name對應volume_mounts參數中的項目:如要以環境變數形式公開密鑰,請在
env參數中參照 Secret Manager 資源:
參照其他專案中的密鑰
如要參照其他專案中的 Secret,請確認專案的服務帳戶已取得 Secret 存取權限。
控制台
前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:
按一下「Deploy container」(部署容器),設定新服務。填寫初始服務設定頁面,然後按一下「Container(s), Volumes, Networking, Security」,展開服務設定頁面。
如要設定現有服務,請按一下該服務,然後按一下「編輯及部署新的修訂版本」。
按照步驟將 Secret 掛接為磁碟區,或將其設為環境變數。
將 Secret 設定為環境變數的方法如下:
- 按一下「容器」分頁標籤。
- 在「變數和密鑰」分頁中,按一下「參照密鑰」。
- 在「Name 1」欄位輸入環境變數的名稱。
- 在「Secret」清單中,按一下「Enter secret manually」。
請輸入 Secret 的資源 ID,格式如下:
projects/PROJECT_NUMBER/secrets/SECRET_NAME更改下列內容:
將 PROJECT_NUMBER 改成您的 Google Cloud 專案編號。如需如何找出專案編號的詳細操作說明,請參閱「建立及管理專案」。
SECRET_NAME:Secret Manager 中的 Secret 名稱。
從「Version 1」清單中,選取要參照的 Secret 版本。
按一下 [完成]。
按一下 [Create] (建立) 或 [Deploy] (部署)。
如要將 Secret 掛接為磁碟區,請按照下列步驟操作:
- 按一下「磁碟區」分頁標籤,然後選取「新增磁碟區」。
- 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(密鑰)。
- 在「磁碟區名稱」欄位中輸入名稱,或接受預設名稱。
- 在「Secret」清單中,按一下「Enter secret manually」。
請輸入 Secret 的資源 ID,格式如下:
projects/PROJECT_NUMBER/secrets/SECRET_NAME更改下列內容:
將 PROJECT_NUMBER 改成您的 Google Cloud 專案編號。如需如何找出專案編號的詳細操作說明,請參閱「建立及管理專案」。
SECRET_NAME:Secret Manager 中的 Secret 名稱。
在「Path 1」欄位中輸入要掛接的檔案名稱。
在「Version 1」清單中,選取要參照的 Secret 版本。系統預設會選取最新版本。如要選取特定版本,請點選該版本。
按一下 [完成]。
前往「容器」分頁,將密鑰掛接到容器。
在「Volume mounts」(磁碟區掛接) 分頁中,按一下「Mount volume」(掛接磁碟區)。
從「Name 1」(名稱 1) 清單中選取磁碟區名稱。
在「Mount path 1」(掛接路徑 1) 欄位中,輸入此密鑰的掛接路徑。 所有 Secret 版本都會放置在此目錄下。
按一下 [完成]。
按一下 [Create] (建立) 或 [Deploy] (部署)。
gcloud
部署服務時,將 Secret 掛接為磁碟區的方法如下:
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必須REPO_NAME已建立。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。 PATH:磁碟區的掛接路徑和 Secret 的檔案名稱。開頭必須為正斜線,例如/etc/secrets/dbconfig/password,其中/etc/secrets/dbconfig/是磁碟區的掛接路徑,password則是 Secret 的檔案名稱。PROJECT_NUMBER替換為建立密鑰的專案編號。SECRET_NAME:密鑰名稱,例如mysecret。VERSION,並提供密鑰版本。使用latest代表最新版本,或使用數字 (例如2)。
YAML
如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定:
gcloud run services describe SERVICE --format export > service.yaml
由於 API 相容性限制,密鑰位置必須儲存在註解中。
以環境變數形式公開的密鑰:
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必須REPO_NAME已建立。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG ENV_VAR:環境變數的名稱。PROJECT_NUMBER:建立 Secret 的專案編號。SECRET_NAME:密鑰名稱,例如mysecret。VERSION:密鑰版本。使用latest代表最新版本,或使用數字 (例如2)。SECRET_LOOKUP_NAME:任何符合有效密鑰名稱語法的名稱,例如my-secret,可以與SECRET_NAME相同。
如要將 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必須REPO_NAME已建立。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。 PATH:磁碟區的掛接路徑和 Secret 的檔案名稱。開頭必須為正斜線,例如:/etc/secrets/dbconfig/password,其中/etc/secrets/dbconfig/是磁碟區的掛接路徑,password則是密鑰的檔案名稱。PROJECT_NUMBER:建立 Secret 的專案編號。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 = "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必須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 = "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必須REPO_NAME已建立。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG - VOLUME_NAME:任何名稱,例如
my-volume,可以與SECRET_NAME相同 - MOUNT_PATH:磁碟區的掛接路徑和 Secret 的檔案名稱。開頭必須為正斜線,例如
/etc/secrets/dbconfig/password,其中/etc/secrets/dbconfig/是磁碟區的掛接路徑,password則是 Secret 的檔案名稱。 - PROJECT_ID:建立密鑰的專案 ID。
- SECRET_NAME:密鑰名稱,例如
mysecret。
查看密鑰設定
如要查看 Cloud Run 服務目前的密鑰設定:
控制台
前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:
按一下感興趣的服務,開啟「服務詳細資料」頁面。
按一下「Revisions」(修訂版本) 分頁標籤。
在右側的詳細資料面板中,密鑰設定會列在「容器」分頁下方。
gcloud
使用下列指令:
gcloud run services describe SERVICE
在傳回的設定中找出密鑰設定。
從服務中移除 Secret
您可以使用 Google Cloud 控制台或 gcloud CLI,從服務中移除 Secret:
控制台
前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:
從清單中選取服務,然後按一下「編輯及部署新的修訂版本」。
按一下「容器」分頁標籤。
如要刪除以磁碟區形式掛接的 Secret,請選取「Volume mounts」(磁碟區掛接) 分頁標籤,將指標懸停在要移除的 Secret 上,然後按一下「Delete」(刪除) 。
如要刪除以環境變數形式公開的密鑰,請選取「變數與密鑰」分頁標籤,將指標懸停在要移除的密鑰上,然後按一下「刪除」圖示 。
點選「Deploy」(部署)。
gcloud
您可以移除服務的所有 Secret,或指定移除其中一或多個 Secret:
如要移除所有 Secret,請執行下列指令:
gcloud run deploy SERVICE --image IMAGE_URL \ --clear-secrets更改下列內容:
- SERVICE:服務名稱。
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則存放區 REPO_NAME必須REPO_NAME已建立。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。
如需指定要移除的 Secret 清單,請使用
--remove-secrets旗標。下列指令會移除一個掛接為磁碟區的 Secret,以及另一個設為環境變數的 Secret: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必須REPO_NAME已建立。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。 - 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或其子目錄中掛接密鑰。 - 如果您要在
/tmp上掛接密鑰,且使用第一代執行環境,請參閱在/tmp上掛接密鑰的已知問題。 - Cloud Run 不允許您在同一路徑掛接多個密鑰,因為兩個磁碟區掛接點無法掛接在同一位置。
區域性密鑰
Cloud Run 不支援區域性密鑰。
覆寫目錄
如果密鑰在 Cloud Run 中以磁碟區形式掛接,且磁碟區掛接路徑中的最後一個目錄已存在,則現有目錄中的任何檔案或資料夾都會無法存取。
舉例來說,如果名為 my-secret 的 Secret 掛接至路徑 /etc/app_data,app_data 目錄內的所有內容都會遭到覆寫,且只會顯示 /etc/app_data/my-secret 檔案。
為避免覆寫現有目錄中的檔案,請建立新目錄來掛接密鑰,例如 /etc/app_data/secrets,這樣密鑰的掛接路徑就會是 /etc/app_data/secrets/my-secret。