設定密鑰 (第 1 代)

您可以使用 Secret Manager 安全地儲存 API 金鑰、密碼和其他機密資訊。本指南說明如何設定 Cloud Run 函式,存取儲存在 Secret Manager 中的密鑰。

本文將說明這兩種方式:

  • 將密鑰掛接為磁碟區。這樣一來,函式就能以檔案形式存取密鑰。如果將密鑰參照為磁碟區,函式每次從磁碟讀取檔案時,都會從 Secret Manager 存取密鑰值。如果您想參照最新版本的密鑰,而非固定版本的密鑰,將密鑰掛接為磁碟區就是不錯的策略。如果您打算實作密鑰輪替,也很適合採用這種方法。

  • 環境變數形式傳遞密鑰。 環境變數值會在執行個體啟動時解析,因此如果您使用這個方法,建議您參照固定版本的密鑰,而非最新版本的密鑰。

如要進一步瞭解如何使用 Secret Manager,請參閱「Secret Manager 簡介」。如要瞭解如何建立及存取密鑰,請參閱「建立密鑰」。

事前準備

  1. Enable the Secret Manager API.

    Enable the API

  2. 如果尚未建立 Secret,請按照「 建立 Secret」一文的說明,在 Secret Manager 中建立 Secret。

授予密鑰存取權

函式可存取與函式位於同一專案中的密鑰,以及位於其他專案中的密鑰。如要存取密鑰,必須將密鑰存取權授予函式的執行階段服務帳戶。

根據預設,Cloud Run functions 會使用預設 App Engine 服務帳戶向 Secret Manager 進行驗證。在正式環境中,Google 建議您設定函式,使用使用者管理的服務帳戶進行驗證,並為該帳戶指派完成函式工作所需的最低權限角色組合。

如要搭配 Cloud Run 函式使用 Secret Manager,請將 roles/secretmanager.secretAccessor 角色指派給與函式相關聯的服務帳戶:

  1. 前往 Google Cloud 控制台的 Secret Manager 頁面:
    前往 Secret Manager 頁面

  2. 勾選密鑰旁的核取方塊。

  3. 如果面板尚未開啟,請按一下「Show Info Panel」(顯示資訊面板) 開啟面板。

  4. 在資訊面板中,按一下「新增主體」

  5. 在「新增主體」欄位中,輸入函式用來做為身分的服務帳戶。函式的服務帳戶為下列其中一項:

  6. 在「Select a role」(請選擇角色) 下拉式選單中,依序選擇「Secret Manager」和「Secret Manager Secret Accessor」(Secret Manager 密鑰存取者)

準備函式以存取密鑰

您可以透過兩種方式將密鑰提供給函式:

  • 以環境變數形式傳遞密鑰。
  • 將密鑰掛接為磁碟區。

環境變數

如要使用環境變數將密鑰提供給函式,請按照下列步驟操作:

  1. 在函式部署期間設定執行階段 環境變數
  2. 環境變數中,讓函式可存取密鑰
  3. 在執行階段以程式輔助方式存取環境變數。

將密鑰掛接為磁碟區

如要將密鑰掛接為磁碟區,請按照下列步驟操作:

  1. 建立包含密鑰的檔案。

  2. 選擇未使用的非系統目錄 (例如 /mnt/secrets) 做為密鑰的掛接路徑。掛接密鑰後,該目錄中除了密鑰及其版本以外的任何現有檔案或子目錄,都會變成無法存取的狀態。

  3. 掛接磁碟區的形式,讓函式存取密鑰

  4. 在執行階段,以程式輔助方式讀取檔案內容,存取密鑰值。

舉例來說,如果密鑰已掛接至 /mnt/secrets/secret1,則函式必須讀取這個檔案。以下是使用 Node.js 同步讀取檔案的範例:

fs.readFileSync('/mnt/secrets/secret1')

讓函式存取密鑰

如要從函式參照密鑰,您必須先讓函式存取密鑰。您可以使用 Google Cloud 控制台或 Google Cloud CLI,讓新函式或現有函式存取密鑰:

主控台

如要讓函式存取密鑰,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的 Cloud Run 函式頁面:
    前往 Cloud Run 函式頁面

  2. 按一下要存取密鑰的函式名稱。

  3. 按一下 [編輯]

  4. 按一下「執行階段、建構作業...」展開進階設定選項。

  5. 按一下「安全性和映像檔存放區」開啟分頁。

  6. 按一下「Add a Secret Reference」(新增密鑰參照設定),為函式設定密鑰。

  7. 選取要開放存取的密鑰。視需要建立密鑰

    • 如要參照與函式位於同一專案中的密鑰:

      1. 從下拉式清單中選取密鑰。
    • 如要參照其他專案的密鑰:

      1. 確認專案的服務帳戶已獲得密鑰存取權

      2. 選取「手動輸入密鑰」

      3. 請以以下格式輸入密鑰的資源 ID:

        projects/PROJECT_ID/secrets/SECRET_NAME

        更改下列內容:

        • PROJECT_ID:密鑰所在的專案 ID。

        • SECRET_NAME:Secret Manager 中的密碼名稱。

  8. 選取密鑰的參照方法。您可以將密鑰掛接為磁碟區,或以環境變數的形式公開密鑰。

    • 如要將密鑰掛接為磁碟區,請按照下列步驟操作:

      1. 選取「掛接為磁碟區」

      2. 在「Mount path」(掛接路徑) 欄位中,輸入這個密鑰的掛接路徑。這個目錄會放置所有版本的密鑰。

      3. 在「Path1」Path1欄位中,輸入要掛接的檔案名稱。這個名稱會與上一個步驟中的掛接路徑串連,形成掛接密鑰的完整掛接路徑。

      4. 從「Version1」Version1下拉式選單中,選取要參照的密鑰版本。

      5. 如要掛接這個 Secret 的其他版本,請按一下「+新增」,定義其他路徑,以及要在這些路徑中掛接的 Secret 版本。

    • 如要以環境變數形式公開密鑰,請按照下列步驟操作:

      1. 選取「做為環境變數公開」

      2. 在「Name1」Name1欄位中,輸入環境變數的名稱。

      3. 從「Version1」Version1下拉式選單中,選取要參照的密鑰版本。

      4. 如要向函式公開這個 Secret 的其他版本,請按一下「+Add」,定義其他環境變數,以及要儲存在這些變數中的 Secret 版本。

  9. 按一下 [完成]

  10. 點選「下一步」

  11. 按一下 [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:要使用的密鑰版本。例如 1latest

    --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:要使用的密鑰版本。例如 1latest

    --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:要使用的密鑰版本。例如 1latest

  • 您可以一次更新多個密鑰。請以半形逗號分隔每個密鑰的設定選項。下列指令會更新一個以磁碟區形式掛接的密鑰,以及另一個以環境變數形式公開的密鑰。

    如要更新現有密碼,請輸入下列指令:

    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:要使用的密鑰版本。例如 1latest

    • SECRET_FILE_PATH:密鑰的完整路徑。舉例來說,/mnt/secrets/primary/latest,其中 /mnt/secrets/primary/ 是掛接路徑,latest 則是密鑰路徑。您也可以分別指定掛接路徑和密鑰路徑:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

從函式中移除密鑰

您可以使用 Google Cloud 主控台或 gcloud CLI,從函式中移除密鑰:

主控台

  1. 前往 Google Cloud 控制台的 Cloud Run 函式頁面:
    前往 Cloud Run 函式頁面

  2. 按一下函式名稱,移除其中一個密鑰。

  3. 按一下 [編輯]

  4. 按一下「執行階段、建構作業和連線設定」展開進階設定選項。

  5. 按一下「安全性和映像檔存放區」,開啟「安全性」分頁。

  6. 將指標懸停在要移除的祕密上,然後按一下「刪除」

  7. 點選「下一步」

  8. 按一下 [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,查看函式可存取的密鑰:

主控台

  1. 前往 Google Cloud 控制台的 Cloud Run 函式頁面:
    前往 Cloud Run 函式頁面

  2. 按一下函式名稱,即可查看可用的密鑰。

  3. 按一下 [編輯]

  4. 按一下「執行階段、建構作業和連線設定」展開進階設定選項。

  5. 按一下「安全性」開啟安全性分頁。

「安全性」分頁會列出函式可存取的密鑰。

gcloud

如要查看函式可用的密鑰,請使用 gcloud functions describe 指令:

gcloud functions describe FUNCTION_NAME

FUNCTION_NAME 換成您的函式名稱。

後續步驟