本文說明如何使用 Secret Manager 密鑰,保護要為 Batch 工作指定的機密資料。
Secret Manager 密碼 透過加密保護私密資料。 在批次工作中,您可以指定一或多個現有密鑰,安全地傳遞其中包含的機密資料,並用於執行下列操作:
安全地定義含有機密資料的自訂環境變數。
安全地指定 Docker Registry 的登入憑證,讓工作可執行檔存取私人容器映像檔。
事前準備
- 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
- 建立密鑰或找出密鑰,以安全地為工作指定機密資料。
-
如要取得建立作業所需的權限,請要求管理員授予下列 IAM 角色:
-
批次工作編輯者 (
roles/batch.jobsEditor) 專案 -
服務帳戶使用者 (
roles/iam.serviceAccountUser) 在作業的服務帳戶上,預設為預設 Compute Engine 服務帳戶
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
批次工作編輯者 (
-
為確保作業的服務帳戶具備存取密鑰的必要權限,請要求管理員將密鑰的「Secret Manager 密鑰存取者」 (
roles/secretmanager.secretAccessor) IAM 角色授予作業的服務帳戶。
安全地將機密資料傳遞至自訂環境變數
如要將 Secret Manager 密鑰中的機密資料安全地傳遞至自訂環境變數,您必須在環境的密鑰變數 (secretVariables) 子欄位中定義每個環境變數,並為每個值指定密鑰。在工作中指定密鑰時,必須將密鑰格式設為密鑰版本的路徑:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION。
您可以使用 gcloud CLI、Batch API、Java、Node.js 或 Python,建立定義密鑰變數的工作。以下範例說明如何建立工作,為所有可執行檔的環境 (taskSpec 的 environment 子欄位) 定義及使用密鑰變數。
gcloud
建立 JSON 檔案,指定工作的設定詳細資料,並為一或多個環境加入
secretVariables子欄位。舉例來說,如要建立基本指令碼作業,在環境中為所有可執行檔使用密鑰變數,請建立內容如下的 JSON 檔案:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo This is the secret: ${SECRET_VARIABLE_NAME}" } } ], "environment": { "secretVariables": { "{SECRET_VARIABLE_NAME}": "projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION" } } } } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }更改下列內容:
如要建立及執行作業,請使用
gcloud batch jobs submit指令:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE更改下列內容:
JOB_NAME:作業名稱。LOCATION:工作地點。JSON_CONFIGURATION_FILE:JSON 檔案的路徑,內含作業的設定詳細資料。
API
對 jobs.create 方法發出 POST 要求,指定一或多個環境的 secretVariables 子欄位。
舉例來說,如要建立基本指令碼工作,在所有可執行檔的環境中使用密鑰變數,請發出下列要求:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo This is the secret: ${SECRET_VARIABLE_NAME}"
}
}
],
"environment": {
"secretVariables": {
"{SECRET_VARIABLE_NAME}": "projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION"
}
}
}
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
更改下列內容:
Java
Node.js
Python
安全存取需要 Docker 登錄憑證的容器映像檔
如要使用私人 Docker 登錄檔中的容器映像檔,可執行檔必須指定登入憑證,才能存取該 Docker 登錄檔。具體來說,如果任何可執行的容器的映像檔 URI (imageUri) 欄位設為來自私人 Docker 登錄檔的映像檔,您必須使用使用者名稱 (username) 欄位和密碼 (password) 欄位,指定存取該 Docker 登錄檔所需的任何憑證。
您可以指定含有資訊的現有密碼,而非直接定義這些欄位,藉此保護 Docker 登錄檔的任何機密憑證。在工作中指定密鑰時,必須將密鑰格式設為密鑰版本的路徑:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION。
您可以使用 gcloud CLI 或 Batch API,建立使用私人 Docker 登錄檔中容器映像檔的工作。以下範例說明如何建立工作,直接指定使用者名稱並將密碼設為密鑰,藉此使用私人 Docker 登錄檔中的容器映像檔。
gcloud
建立 JSON 檔案,指定作業的設定詳細資料。 如果容器可執行檔使用私有 Docker 登錄檔中的映像檔,請在
username和password欄位中加入存取該登錄檔所需的任何憑證。舉例來說,如要建立基本容器作業,並指定來自私有 Docker 登錄檔的映像檔,請建立含有下列內容的 JSON 檔案:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "container": { "imageUri": "PRIVATE_IMAGE_URI", "commands": [ "-c", "echo This runnable uses a private image." ], "username": "USERNAME", "password": "PASSWORD" } } ], } } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }更改下列內容:
PRIVATE_IMAGE_URI:來自私人 Docker 登錄檔的容器映像檔 URI。如果這個映像檔需要任何其他容器設定,您也必須一併加入。USERNAME:私人 Docker 登錄檔的使用者名稱,可指定為密鑰或直接指定。PASSWORD:私人 Docker 登錄檔的密碼,可指定為密鑰 (建議) 或直接指定。舉例來說,如要將密碼指定為密鑰,請將
PASSWORD設為下列值:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION更改下列內容:
PROJECT_ID:專案的專案 ID。SECRET_NAME:現有 Secret Manager 密鑰的名稱。VERSION:指定密碼的版本,其中包含要傳遞至作業的資料。可以是版本號碼或latest。
如要建立及執行作業,請使用
gcloud batch jobs submit指令:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE更改下列內容:
JOB_NAME:作業名稱。LOCATION:工作地點。JSON_CONFIGURATION_FILE:JSON 檔案的路徑,內含作業的設定詳細資料。
API
對 jobs.create 方法發出 POST 要求。如果容器可執行檔使用私有 Docker 登錄檔中的映像檔,請在 username 和 password 欄位中加入存取該登錄檔所需的任何憑證。
舉例來說,如要建立基本容器作業,並指定來自私人 Docker 登錄檔的映像檔,請提出下列要求:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"container": {
"imageUri": "PRIVATE_IMAGE_URI",
"commands": [
"-c",
"echo This runnable uses a private image."
],
"username": "USERNAME",
"password": "PASSWORD"
}
}
],
}
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
更改下列內容:
PROJECT_ID:專案的專案 ID。LOCATION:工作地點。JOB_NAME:作業名稱。PRIVATE_IMAGE_URI:來自私人 Docker 登錄檔的容器映像檔 URI。如果這個映像檔需要任何其他容器設定,您也必須一併加入。USERNAME:私人 Docker 登錄檔的使用者名稱,可指定為密鑰或直接指定。PASSWORD:私人 Docker 登錄檔的密碼,可指定為密鑰 (建議) 或直接指定。舉例來說,如要將密碼指定為密鑰,請將
PASSWORD設為下列值:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION更改下列內容:
PROJECT_ID:專案的專案 ID。SECRET_NAME:現有 Secret Manager 密鑰的名稱。VERSION:指定密碼的版本,其中包含要傳遞至作業的資料。可以是版本號碼或latest。
後續步驟
如果無法建立或執行工作,請參閱「疑難排解」。
進一步瞭解環境變數。
進一步瞭解 Secret Manager。
進一步瞭解工作建立選項。