設定密鑰 (第 1 代)
您可以使用 Secret Manager 安全地儲存 API 金鑰、密碼和其他機密資訊。本指南說明如何設定 Cloud Run 函式,存取儲存在 Secret Manager 中的密鑰。
本文將說明這兩種方式:
將密鑰掛接為磁碟區。這樣一來,函式就能以檔案形式存取密鑰。如果將密鑰參照為磁碟區,函式每次從磁碟讀取檔案時,都會從 Secret Manager 存取密鑰值。如果您想參照最新版本的密鑰,而非固定版本的密鑰,將密鑰掛接為磁碟區就是不錯的策略。如果您打算實作密鑰輪替,也很適合採用這種方法。
以環境變數形式傳遞密鑰。 環境變數值會在執行個體啟動時解析,因此如果您使用這個方法,建議您參照固定版本的密鑰,而非最新版本的密鑰。
如要進一步瞭解如何使用 Secret Manager,請參閱「Secret Manager 簡介」。如要瞭解如何建立及存取密鑰,請參閱「建立密鑰」。
事前準備
-
Enable the Secret Manager API.
- 如果尚未建立 Secret,請按照「 建立 Secret」一文的說明,在 Secret Manager 中建立 Secret。
授予密鑰存取權
函式可存取與函式位於同一專案中的密鑰,以及位於其他專案中的密鑰。如要存取密鑰,必須將密鑰存取權授予函式的執行階段服務帳戶。
根據預設,Cloud Run functions 會使用預設 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」(Secret Manager 密鑰存取者)。
準備函式以存取密鑰
您可以透過兩種方式將密鑰提供給函式:
- 以環境變數形式傳遞密鑰。
- 將密鑰掛接為磁碟區。
環境變數
如要使用環境變數將密鑰提供給函式,請按照下列步驟操作:
將密鑰掛接為磁碟區
如要將密鑰掛接為磁碟區,請按照下列步驟操作:
建立包含密鑰的檔案。
選擇未使用的非系統目錄 (例如
/mnt/secrets
) 做為密鑰的掛接路徑。掛接密鑰後,該目錄中除了密鑰及其版本以外的任何現有檔案或子目錄,都會變成無法存取的狀態。在執行階段,以程式輔助方式讀取檔案內容,存取密鑰值。
舉例來說,如果密鑰已掛接至 /mnt/secrets/secret1
,則函式必須讀取這個檔案。以下是使用 Node.js 同步讀取檔案的範例:
fs.readFileSync('/mnt/secrets/secret1')
讓函式存取密鑰
如要從函式參照密鑰,您必須先讓函式存取密鑰。您可以使用 Google Cloud 控制台或 Google Cloud CLI,讓新函式或現有函式存取密鑰:
主控台
如要讓函式存取密鑰,請按照下列步驟操作:
前往 Google Cloud 控制台的 Cloud Run 函式頁面:
前往 Cloud Run 函式頁面按一下要存取密鑰的函式名稱。
按一下 [編輯]。
按一下「執行階段、建構作業...」展開進階設定選項。
按一下「安全性和映像檔存放區」開啟分頁。
按一下「Add a Secret Reference」(新增密鑰參照設定),為函式設定密鑰。
選取要開放存取的密鑰。視需要建立密鑰。
如要參照與函式位於同一專案中的密鑰:
- 從下拉式清單中選取密鑰。
如要參照其他專案的密鑰:
確認專案的服務帳戶已獲得密鑰存取權。
選取「手動輸入密鑰」。
請以以下格式輸入密鑰的資源 ID:
projects/PROJECT_ID/secrets/SECRET_NAME
更改下列內容:
PROJECT_ID:密鑰所在的專案 ID。
SECRET_NAME:Secret Manager 中的密碼名稱。
選取密鑰的參照方法。您可以將密鑰掛接為磁碟區,或以環境變數的形式公開密鑰。
如要將密鑰掛接為磁碟區,請按照下列步驟操作:
選取「掛接為磁碟區」。
在「Mount path」(掛接路徑) 欄位中,輸入這個密鑰的掛接路徑。這個目錄會放置所有版本的密鑰。
在「Path1」Path1欄位中,輸入要掛接的檔案名稱。這個名稱會與上一個步驟中的掛接路徑串連,形成掛接密鑰的完整掛接路徑。
從「Version1」Version1下拉式選單中,選取要參照的密鑰版本。
如要掛接這個 Secret 的其他版本,請按一下「+新增」,定義其他路徑,以及要在這些路徑中掛接的 Secret 版本。
如要以環境變數形式公開密鑰,請按照下列步驟操作:
選取「做為環境變數公開」。
在「Name1」Name1欄位中,輸入環境變數的名稱。
從「Version1」Version1下拉式選單中,選取要參照的密鑰版本。
如要向函式公開這個 Secret 的其他版本,請按一下「+Add」,定義其他環境變數,以及要儲存在這些變數中的 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:要使用的密鑰版本。例如
1
或latest
。
--set-secrets
旗標會覆寫所有現有密鑰。如要保留函式的現有密鑰,請改用--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:要使用的密鑰版本。例如
1
或latest
。
--set-secrets
旗標會覆寫所有現有密鑰。如要保留函式的現有密鑰,請改用--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:要使用的密鑰版本。例如
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:要使用的密鑰版本。例如
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 函式頁面按一下函式名稱,移除其中一個密鑰。
按一下 [編輯]。
按一下「執行階段、建構作業和連線設定」展開進階設定選項。
按一下「安全性和映像檔存放區」,開啟「安全性」分頁。
將指標懸停在要移除的祕密上,然後按一下「刪除」
。點選「下一步」。
按一下 [Deploy] (部署)。
gcloud
您可以從函式中移除所有密鑰,也可以指定要移除的一或多個密鑰:
如要移除所有密鑰,請執行下列指令:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --clear-secrets
更改下列內容:
FUNCTION_NAME:函式名稱。
RUNTIME:執行函式的執行階段。
系統會清除函式中的所有密鑰。
如要指定要移除的密鑰清單,請使用
--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 函式頁面按一下函式名稱,即可查看可用的密鑰。
按一下 [編輯]。
按一下「執行階段、建構作業和連線設定」展開進階設定選項。
按一下「安全性」開啟安全性分頁。
「安全性」分頁會列出函式可存取的密鑰。
gcloud
如要查看函式可用的密鑰,請使用 gcloud functions describe
指令:
gcloud functions describe FUNCTION_NAME
將 FUNCTION_NAME 換成您的函式名稱。
後續步驟
- 建議您使用 Secret Manager 用戶端程式庫,開發使用 Secret Manager 的函式。