設定密鑰 (第 1 代)
您可以使用 Secret Manager 安全地儲存 API 金鑰、密碼和其他機密資訊。本指南說明如何設定 Cloud Run 函式,以便存取儲存在 Secret Manager 中的機密資料。
本文件將說明兩種讓函式可存取密鑰的方法:
將密鑰掛接為磁碟區。這樣一來,函式就能以檔案形式使用機密資料。如果您以卷的方式參照密鑰,函式每次從磁碟讀取檔案時,都會存取 Secret Manager 中的密鑰值。因此,如果您想參照最新版本的密鑰,而非已固定的密鑰版本,將掛接點掛接為磁碟區會是個不錯的策略。如果您打算實作密鑰輪替,這個方法也相當實用。
將密鑰傳遞為環境變數。環境變數值會在執行個體啟動時解析,因此如果您使用這個方法,建議您參照已固定版本的機密金鑰,而非參照最新版本的機密金鑰。
如要進一步瞭解如何使用 Secret Manager,請參閱 Secret Manager 簡介。如要瞭解如何建立及存取密鑰,請參閱「建立密鑰」。
事前準備
-
Enable the Secret Manager API.
- 如果您尚未在 Secret Manager 中建立密鑰,請按照「 建立密鑰」一文的說明操作。
授予密鑰存取權
您的函式可存取與函式位於同一專案中的機密資料,以及位於其他專案中的機密資料。如要存取密鑰,必須將密鑰存取權授予函式的執行階段服務帳戶。
根據預設,Cloud Run 函式會使用 App Engine 預設服務帳戶,透過 Secret Manager 進行驗證。如要用於正式環境,Google 建議您將函式設為使用使用者管理的服務帳戶進行驗證,並指派最少許可的角色組合,以完成該函式的任務。
如要搭配 Cloud Run 函式使用 Secret Manager,請將 roles/secretmanager.secretAccessor
角色指派給與函式相關聯的服務帳戶:
前往 Google Cloud 控制台的 Secret Manager 頁面:
前往 Secret Manager 頁面勾選機密金鑰旁的核取方塊。
如果資訊面板尚未開啟,請按一下「Show Info Panel」來開啟面板。
在資訊面板中,按一下「新增主體」。
在「新增主體」欄位中,輸入函式用於身分的服務帳戶。函式的服務帳戶為下列其中一種:
在部署時指派給函式的使用者代管服務帳戶。如要瞭解如何使用由使用者管理的服務帳戶部署函式,請參閱「為函式使用個別服務帳戶」一文。
App Engine 預設服務帳戶 (不建議用於實際作業)。
在「Select a role」(請選擇角色) 下拉式選單中,依序選擇「Secret Manager」和「Secret Manager Secret Accessor」。
準備函式以存取密鑰
您可以透過兩種方式讓函式使用機密資料:
- 將密鑰做為環境變數傳遞。
- 將密鑰掛接為磁碟區。
環境變數
如要使用環境變數讓函式可存取機密資料,請按照下列步驟操作:
將密鑰掛接為磁碟區
如要將密鑰掛接為磁碟區,請按照下列步驟操作:
建立包含密鑰的檔案。
請選擇未使用的非系統目錄 (例如
/mnt/secrets
) 做為機密金鑰的掛接路徑。除了機密金鑰及其版本之外,該目錄中所有先前存在的檔案或子目錄,在機密金鑰掛載後都會變成無法存取的狀態。在執行階段,以程式輔助方式讀取檔案內容,以便存取機密值。
舉例來說,如果已將機密資料掛載至 /mnt/secrets/secret1
,則函式必須讀取這個檔案。以下是使用 Node.js 同步讀取檔案的範例:
fs.readFileSync('/mnt/secrets/secret1')
讓函式可存取密鑰
如要從函式參照密鑰,您必須先讓函式能夠存取密鑰。您可以使用 Google Cloud 控制台或 Google Cloud CLI,讓新或現有函式存取機密:
主控台
如要讓函式存取密鑰,請按照下列步驟操作:
前往 Google Cloud 控制台的「Cloud Run 函式」頁面:
前往「Cloud Run 函式」頁面按一下要存取機密金鑰的函式名稱。
按一下 [編輯]。
按一下「Runtime, build ...」展開進階設定選項。
按一下「安全性和映像檔存放區」開啟分頁。
點選「新增密鑰參照」,為函式設定密鑰。
選取要開放存取的密鑰。如有需要,請建立密鑰。
如要參照與函式位於同一專案中的密鑰,請按照下列步驟操作:
- 從下拉式清單中選取機密金鑰。
如要參照其他專案中的密鑰,請按照下列步驟操作:
確認專案的服務帳戶已獲得密鑰的存取權。
選取「手動輸入密鑰」。
請按照下列格式輸入密鑰的資源 ID:
projects/PROJECT_ID/secrets/SECRET_NAME
更改下列內容:
PROJECT_ID:機密金鑰所在專案的 ID。
SECRET_NAME:Secret Manager 中的密鑰名稱。
選取密鑰的參照方法。您可以將密鑰掛接為磁碟區,或將密鑰公開做為環境變數。
如要將密鑰掛接為磁碟區,請按照下列步驟操作:
選取「掛接為磁碟區」。
在「Mount path」欄位中,輸入此機密金鑰的掛載路徑。這是所有密鑰版本的所在目錄。
在「Path1」Path1欄位中,輸入要掛載的檔案名稱。這個名稱會與上一個步驟中的掛載路徑串連,形成用於掛載機密的完整掛載路徑。
從「Version1」Version1下拉式選單中,選取要參照的密鑰版本。
您可以按一下「+ 新增」,定義其他路徑和要掛載的此密鑰版本,藉此掛載此密鑰的其他版本。
如要將密鑰做為環境變數公開,請按照下列步驟操作:
選取「Exposed as environment variable」。
在「Name1」Name1欄位中輸入環境變數的名稱。
從「Version1」Version1下拉式選單中,選取要參照的密鑰版本。
您可以按一下「+ 新增」,定義其他環境變數和要儲存的此 Secret 版本,藉此向函式公開此 Secret 的其他版本。
按一下 [完成]。
點選「下一步」。
按一下 [Deploy] (部署)。
函式的程式碼現在可以參照機密金鑰。
gcloud
如要讓函式存取機密,請輸入下列任一指令。
如要將密鑰掛接為磁碟區,請輸入下列指令:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --set-secrets 'SECRET_FILE_PATH=SECRET:VERSION'
更改下列內容:
FUNCTION_NAME:函式名稱。
RUNTIME:執行函式的執行階段。
SECRET_FILE_PATH:機密金鑰的完整路徑。例如
/mnt/secrets/primary/latest
,其中/mnt/secrets/primary/
是掛載路徑,latest
是密鑰路徑。您也可以分別指定掛載和密鑰路徑:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
SECRET:Secret Manager 中的密鑰名稱。
VERSION:要使用的 Secret 版本。例如
1
或latest
。
--set-secrets
旗標會覆寫任何現有的 Secret。如要保留函式現有的秘密,請改用--update-secrets
旗標。如要將密鑰公開做為環境變數,請輸入下列指令:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --set-secrets 'ENV_VAR_NAME=SECRET:VERSION'
更改下列內容:
FUNCTION_NAME:函式名稱。
RUNTIME:執行函式的執行階段。
ENV_VAR_NAME:環境變數的名稱。
SECRET:Secret Manager 中的密鑰名稱。
VERSION:要使用的 Secret 版本。例如
1
或latest
。
--set-secrets
旗標會覆寫任何現有的 Secret。如要保留函式現有的秘密,請改用--update-secrets
旗標。如果函式的服務帳戶已獲准存取該機密,您就可以參照其他專案中的機密。如要參照其他專案中的密鑰,請使用密鑰的資源路徑:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --update-secrets 'SECRET_FILE_PATH=SECRET_RESOURCE_PATH:VERSION'
更改下列內容:
FUNCTION_NAME:函式名稱。
SECRET_RESOURCE_PATH:位於其他專案中的機密資料資源路徑。資源路徑採用下列格式:
projects/PROJECT_ID/secrets/SECRET_NAME
更改下列內容:
PROJECT_ID:機密金鑰所在專案的 ID。
SECRET_NAME:Secret Manager 中的密鑰名稱。
RUNTIME:執行函式的執行階段。
SECRET_FILE_PATH:機密金鑰的完整路徑。例如
/mnt/secrets/primary/latest
,其中/mnt/secrets/primary/
是掛載路徑,latest
是密鑰路徑。您也可以分別指定掛載和密鑰路徑:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
SECRET:Secret Manager 中的密鑰名稱。
VERSION:要使用的 Secret 版本。例如
1
或latest
。
您可以一次更新多個機密金鑰。請使用半形逗號分隔每個密鑰的設定選項。下列指令會更新一個已掛載為磁碟區的密鑰,以及另一個以環境變數形式公開的密鑰。
如要更新現有機密資料,請輸入下列指令:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --update-secrets 'ENV_VAR_NAME=SECRET:VERSION, \ SECRET_FILE_PATH=SECRET:VERSION'
更改下列內容:
FUNCTION_NAME:函式名稱。
RUNTIME:執行函式的執行階段。
ENV_VAR_NAME:環境變數的名稱。
SECRET:Secret Manager 中的密鑰名稱。
VERSION:要使用的 Secret 版本。例如
1
或latest
。SECRET_FILE_PATH:機密金鑰的完整路徑。例如
/mnt/secrets/primary/latest
,其中/mnt/secrets/primary/
是掛載路徑,latest
是密鑰路徑。您也可以分別指定掛載和密鑰路徑:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
從函式中移除密鑰
您可以使用 Google Cloud 主控台或 gcloud CLI 從函式中移除密鑰:
主控台
前往 Google Cloud 控制台的「Cloud Run 函式」頁面:
前往「Cloud Run 函式」頁面按一下函式的名稱,即可移除其中一個密鑰。
按一下 [編輯]。
按一下「Runtime, build and connections settings」,展開進階設定選項。
按一下「安全性和映像檔存放區」,開啟安全性分頁。
將游標懸停在要移除的機密金鑰上,然後按一下
「刪除」。點選「下一步」。
按一下 [Deploy] (部署)。
gcloud
您可以從函式中移除所有機密資料,或是指定要移除的一或多個機密資料:
如要移除所有機密資料,請執行下列指令:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --clear-secrets
更改下列內容:
FUNCTION_NAME:函式名稱。
RUNTIME:執行函式的執行階段。
函式中的所有機密資料都會清除。
如要指定要移除的 Secret 清單,請使用
--remove-secrets
標記。下列指令會移除已掛接為磁碟區的一個密鑰,以及以環境變數形式公開的另一個密鑰:gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --remove-secrets='ENV_VAR_NAME,SECRET_FILE_PATH, ...'
更改下列內容:
FUNCTION_NAME:函式名稱。
RUNTIME:執行函式的執行階段。
ENV_VAR_NAME:環境變數的名稱。
SECRET_FILE_PATH:機密金鑰的完整路徑。例如
/mnt/secrets/primary/latest
,其中/mnt/secrets/primary/
是掛載路徑,latest
是密鑰路徑。您也可以分別指定掛載和密鑰路徑:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
系統會從函式中移除指定的密鑰。
查看函式可存取的密鑰
您可以使用 Google Cloud 控制台或 gcloud CLI 查看函式可存取哪些密鑰:
主控台
前往 Google Cloud 控制台的「Cloud Run 函式」頁面:
前往「Cloud Run 函式」頁面按一下函式的名稱,查看可用的機密金鑰。
按一下 [編輯]。
按一下「Runtime, build and connections settings」,展開進階設定選項。
按一下「安全性」開啟安全性分頁。
「安全性」分頁會列出函式可存取的密鑰。
gcloud
如要查看函式可用的 Secret,請使用 gcloud functions describe
指令:
gcloud functions describe FUNCTION_NAME
將 FUNCTION_NAME 替換為函式名稱。
後續步驟
- 建議您使用 Secret Manager 用戶端程式庫,開發使用 Secret Manager 的函式。