您的工作可能需要 API 金鑰、密碼、憑證或其他機密資訊,才能滿足依附元件的需求。如果是 Cloud Run,Google 建議您將這類機密資訊儲存在 Secret Manager 中建立的密鑰。
透過下列其中一種方式,讓容器可存取密鑰:
- 將每個密鑰掛接為磁碟區後,Cloud Run 會以檔案形式將密鑰提供給容器。讀取磁碟區時,Cloud Run 一律會從 Secret Manager 擷取密鑰值,以便使用最新版本的值。這個方法也很適合用於密鑰輪替。
- 使用環境變數傳遞密鑰。系統會在執行個體啟動時解析環境變數,因此如果您使用這個方法,Google 建議您將密鑰固定在特定版本,而不是使用
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.enable
permission. Learn how to grant roles. - 使用現有的密鑰,或按照「 建立密鑰」一文的說明,在 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 存取密鑰
您可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML,讓工作存取密鑰:
控制台
前往 Google Cloud 控制台的 Cloud Run 作業頁面:
從選單中選取「工作」,然後按一下「部署容器」,填寫初始工作設定頁面。如要設定現有工作,請選取該工作,然後按一下「編輯」。
按一下「容器、磁碟區、連線與安全性」,展開工作屬性頁面。
按一下「變數與密鑰」分頁標籤。
- 在「變數與密鑰」分頁中:
如要以環境變數形式公開密鑰,請按照下列步驟操作:
- 按一下「容器」分頁標籤。
- 在「變數和密鑰」分頁中,按一下「參照密鑰」。
- 在「Name 1」(名稱 1) 欄位中,輸入環境變數的名稱。
- 從「祕密」清單中,選取要使用的祕密。
- 在「版本 1」清單中,選取要參照的密鑰版本。
- 按一下 [完成]。
- 按一下 [Create] (建立) 或 [Deploy] (部署)。
如要將密鑰掛接為磁碟區,請按照下列步驟操作:
- 按一下「磁碟區」分頁標籤,然後選取「新增磁碟區」。
- 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(密鑰)。
- 在「Volume name」(磁碟區名稱) 欄位中輸入名稱,或接受預設名稱。
- 從「祕密」清單中,選取要使用的祕密。
- 在「Path 1」欄位中,輸入要掛接的檔案名稱。
- 在「Version 1」清單中,選取要參照的密鑰版本。系統預設會選取最新版本。如要選取特定版本,請點選該版本。
- 按一下 [完成]。
- 前往「容器」分頁,將密鑰掛接到容器。
- 在「Volume mounts」(磁碟區掛接) 分頁中,按一下「Mount volume」(掛接磁碟區)。
- 從「名稱 1」清單中選取磁碟區名稱。
- 在「Mount path 1」(掛接路徑 1) 欄位中,輸入這個密鑰的掛接路徑。 這個目錄會存放所有版本的密鑰。
- 按一下 [完成]。
- 按一下「建立」或「部署」。
- 在「變數與密鑰」分頁中:
按一下「建立」或「更新」。
gcloud
如要在建立新工作時,於環境變數中指定密鑰,請按照下列步驟操作:
gcloud run jobs create JOB_NAME \ --image IMAGE_URL \ --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION
更改下列內容:
- JOB_NAME:工作名稱。
- ENV_VAR_NAME:用於密鑰的環境變數名稱。
- SECRET_NAME:同一專案中的密鑰名稱,例如
mysecret
。 - VERSION:密鑰版本。使用
latest
代表最新版本,或使用數字 (例如2
)。 - IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。
您可以使用以半形逗號分隔的清單,指定多個環境變數/密鑰組合。
如要在更新工作時,於環境變數中指定密鑰,請按照下列步驟操作:
gcloud run jobs update JOB_NAME \ --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION
如要在建立工作時將密鑰掛接為磁碟區,請按照下列步驟操作:
gcloud run jobs create JOB_NAME \ --image IMAGE_URL \ --set-secrets=PATH=SECRET_NAME:VERSION
更改下列內容:
- JOB_NAME:工作名稱。
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如
/etc/secrets/dbconfig/password
,其中/etc/secrets/dbconfig/
是磁碟區的掛接路徑,password
則是密鑰的檔案名稱。 - SECRET_NAME:同一專案中的密鑰名稱,例如
mysecret
。 - VERSION:密鑰版本。使用
latest
代表最新版本,或使用數字,例如2
。
如要更新現有工作中的密鑰:
gcloud run jobs update JOB_NAME \ --update-secrets=PATH=SECRET_NAME:VERSION
YAML
由於 API 相容性限制,密鑰位置必須儲存在註解中。
如果您要建立新工作,請略過這個步驟。 如要更新現有工作,請下載其 YAML 設定:
gcloud run jobs describe JOB_NAME --format export > job.yaml
以環境變數形式公開的密鑰:
apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB spec: template: spec: template: spec: containers: - env: - name: SECRET_NAME valueFrom: secretKeyRef: key: VERSION name: SECRET_LOOKUP_NAME image: IMAGE_URL
更改下列內容:
- JOB:工作名稱。
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - SECRET_NAME:密鑰名稱,例如
mysecret
。 - VERSION:密鑰版本。使用
latest
代表最新版本,或使用數字,例如2
。 - SECRET_LOOKUP_NAME:任何符合有效密鑰名稱語法的名稱,例如
my-secret
。可以與 SECRET_NAME 相同。
如要將密鑰掛接為檔案路徑,請按照下列步驟操作:
apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB_NAME spec: template: spec: template: 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
更改下列內容:
- JOB_NAME:工作名稱。
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - 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_job
資源:以環境變數形式公開的密鑰:
resource "google_cloud_run_v2_job" "default" {
name = "JOB_NAME"
location = "REGION"
template {
template {
containers {
image = "IMAGE_URL"
env {
name = "SECRET_NAME"
value_source {
secret_key_ref {
secret = "SECRET_NAME"
version = "VERSION"
}
}
}
}
}
}
}
更改下列內容:
- JOB_NAME:Cloud Run 工作的名稱。
- REGION: Google Cloud 區域。例如:
europe-west1
。 - IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - SECRET_NAME:密鑰名稱,例如
mysecret
。 - VERSION:密鑰版本。使用
latest
代表最新版本,或使用數字 (例如2
)。
對於以檔案路徑形式掛接的密鑰:
resource "google_cloud_run_v2_job" "default" {
name = "JOB_NAME"
location = "REGION"
template {
template {
containers {
image = "IMAGE_URL"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
volumes {
name = "VOLUME_NAME"
secret {
secret = "SECRET_NAME"
}
}
}
}
}
更改下列內容:
- JOB_NAME:Cloud Run 工作的名稱。
- REGION: Google Cloud 區域。例如:
europe-west1
。 - IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - VOLUME_NAME:任何名稱,例如
my-volume
。可以與SECRET_NAME
相同。 - MOUNT_PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如
/etc/secrets/dbconfig/password
,其中/etc/secrets/dbconfig/
是磁碟區的掛接路徑,password
則是密鑰的檔案名稱。 - SECRET_NAME:密鑰名稱,例如
mysecret
。
參照其他專案的密鑰
如果專案的服務帳戶已獲准存取密鑰,您就可以參照其他專案的密鑰。
控制台
前往 Google Cloud 控制台的 Cloud Run 作業頁面:
從選單中選取「工作」,然後按一下「部署容器」,填寫初始工作設定頁面。如要設定現有工作,請選取該工作,然後按一下「編輯」。
按一下「容器、磁碟區、連線與安全性」,展開工作屬性頁面。
按一下「變數與密鑰」分頁標籤。
- 在「變數與密鑰」分頁中:
如要以環境變數形式公開密鑰,請按照下列步驟操作:
- 按一下「容器」分頁標籤。
- 在「變數和密鑰」分頁中,按一下「參照密鑰」。
- 在「Name 1」(名稱 1) 欄位中,輸入環境變數的名稱。
- 在「密鑰」清單中,按一下「手動輸入密鑰」。
請輸入密鑰的資源 ID,格式如下:
projects/PROJECT_NUMBER/secrets/SECRET_NAME
更改下列內容:
將 PROJECT_NUMBER 改成您的 Google Cloud 專案編號。如需如何找出專案編號的詳細操作說明,請參閱「建立及管理專案」。
SECRET_NAME:Secret Manager 中的密碼名稱。
在「版本 1」清單中,選取要參照的密鑰版本。
按一下 [完成]。
按一下 [Create] (建立) 或 [Deploy] (部署)。
如要將密鑰掛接為磁碟區,請按照下列步驟操作:
- 按一下「磁碟區」分頁標籤,然後選取「新增磁碟區」。
- 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(密鑰)。
- 在「Volume name」(磁碟區名稱) 欄位中輸入名稱,或接受預設名稱。
- 在「密鑰」清單中,按一下「手動輸入密鑰」。
請輸入密鑰的資源 ID,格式如下:
projects/PROJECT_NUMBER/secrets/SECRET_NAME
更改下列內容:
將 PROJECT_NUMBER 改成您的 Google Cloud 專案編號。如需如何找出專案編號的詳細操作說明,請參閱「建立及管理專案」。
SECRET_NAME:Secret Manager 中的密碼名稱。
在「Path 1」欄位中,輸入要掛接的檔案名稱。
在「Version 1」清單中,選取要參照的密鑰版本。系統預設會選取最新版本。如要選取特定版本,請點選該版本。
按一下 [完成]。
前往「容器」分頁,將密鑰掛接到容器。
在「Volume mounts」(磁碟區掛接) 分頁中,按一下「Mount volume」(掛接磁碟區)。
從「名稱 1」清單中選取磁碟區名稱。
在「Mount path 1」(掛接路徑 1) 欄位中,輸入這個密鑰的掛接路徑。 這個目錄會存放所有版本的密鑰。
按一下 [完成]。
按一下「建立」或「部署」。
- 在「變數與密鑰」分頁中:
按一下「建立」或「更新」。
gcloud
如要在更新工作時將密鑰掛接為磁碟區,請進行以下操作:
gcloud run jobs update JOB_NAME \ --image IMAGE_URL \ --update-secrets=PATH=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
- JOB_NAME:工作名稱。
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如
/etc/secrets/dbconfig/password
,其中/etc/secrets/dbconfig/
是磁碟區的掛接路徑,password
則是密鑰的檔案名稱。 - PROJECT_NUMBER:建立密鑰的專案專案編號。
- SECRET_NAME:密鑰名稱,例如
mysecret
。 - VERSION:密鑰版本。使用
latest
代表最新版本,或使用數字,例如2
。
YAML
如果您要建立新工作,請略過這個步驟。 如要更新現有工作,請下載其 YAML 設定:
gcloud run jobs describe JOB_NAME --format export > job.yaml
由於 API 相容性限制,密鑰位置必須儲存在註解中。
以環境變數形式公開的密鑰:
apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB spec: template: metadata: annotations: run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME spec: template: spec: containers: - env: - name: SECRET_NAME valueFrom: secretKeyRef: key: VERSION name: SECRET_LOOKUP_NAME image: IMAGE_URL
更改下列內容:
- JOB:工作名稱。
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - SECRET_NAME:密鑰名稱,例如
mysecret
。 - VERSION:密鑰版本。使用
latest
代表最新版本,或使用數字,例如2
。 - PROJECT_NUMBER:建立密鑰的專案專案編號。
- SECRET_LOOKUP_NAME:任何符合有效密鑰名稱語法的名稱,例如
my-secret
。可以與 SECRET_NAME 相同。
如要將密鑰掛接為檔案路徑,請按照下列步驟操作:
apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB_NAME spec: template: metadata: annotations: run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME spec: template: 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
更改下列內容:
- JOB_NAME:工作名稱。
- IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - 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_job
資源:以環境變數形式公開的密鑰:
resource "google_cloud_run_v2_job" "default" {
name = "JOB_NAME"
location = "REGION"
template {
template {
containers {
image = "IMAGE_URL"
env {
name = "SECRET_NAME"
value_source {
secret_key_ref {
secret = "projects/PROJECT_ID/secrets/SECRET_NAME"
version = "VERSION"
}
}
}
}
}
}
}
更改下列內容:
- JOB_NAME:Cloud Run 工作的名稱。
- REGION: Google Cloud 區域。例如:
europe-west1
。 - IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - SECRET_NAME:密鑰名稱,例如
mysecret
。 - PROJECT_ID:建立密鑰的專案 ID。
- VERSION:密鑰版本。使用
latest
代表最新版本,或使用數字 (例如2
)。
對於以檔案路徑形式掛接的密鑰:
resource "google_cloud_run_v2_job" "default" {
name = "JOB_NAME"
location = "REGION"
template {
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"
}
}
}
}
}
更改下列內容:
- JOB_NAME:Cloud Run 工作的名稱。
- REGION: Google Cloud 區域,例如
europe-west1
。 - IMAGE_URL:容器映像檔的參照,例如
us-docker.pkg.dev/cloudrun/container/job:latest
。 - VOLUME_NAME:任何名稱,例如
my-volume
,可以與SECRET_NAME
相同。 - MOUNT_PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如
/etc/secrets/dbconfig/password
,其中/etc/secrets/dbconfig/
是磁碟區的掛接路徑,password
則是密鑰的檔案名稱。 - PROJECT_ID:建立密鑰的專案 ID。
- SECRET_NAME:密鑰名稱,例如
mysecret
。
查看密鑰設定
如要查看 Cloud Run 工作的目前密鑰設定,請按照下列步驟操作:
控制台
前往 Google Cloud 控制台的 Cloud Run 作業頁面:
按一下感興趣的工作,開啟「工作詳細資料」頁面。
按一下「查看及編輯工作設定」。
在設定詳細資料中找出密鑰設定。
gcloud
使用下列指令:
gcloud run jobs describe JOB_NAME
在傳回的設定中找出密鑰設定。
不允許的路徑和限制
掛接密鑰時,請注意以下限制:
- Cloud Run 不允許您在
/dev
、/proc
和/sys
或其子目錄中掛接密鑰。 - 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
。