函式身分 (第 1 代)
為了確保安全性, Google Cloud 中實體之間的大部分互動都要求每個實體都具備可驗證身分,並透過密碼或金鑰等某種機密資訊加以保護。就像其他實體需要身分才能存取 Cloud Run 函式一樣,函式本身也需要存取 Google Cloud 中的其他資源才能運作。每個函式都與一個做為其身分識別的服務帳戶相關聯,當函式存取其他資源時,這個服務帳戶會扮演這個角色。函式用來識別身分的服務帳戶又稱為其執行階段服務帳戶。
在實際工作環境中,Google 建議您為每項函式指派一個專屬身分,方法是指派由使用者管理的服務帳戶。使用者代管的服務帳戶可讓您使用 Identity and Access Management 授予最低限度權限,控管存取權。
執行階段服務帳戶
除非您在部署函式時指定其他執行階段服務帳戶,否則 Cloud Run 函式會使用預設服務帳戶做為函式執行的身分:
Cloud Run 函式會使用 App Engine 預設服務帳戶
PROJECT_ID@appspot.gserviceaccount.com
。請注意,專案編號與專案 ID 和專案名稱不同。您可以在 Google Cloud 控制台的「資訊主頁」頁面中找到專案編號。
這些預設服務帳戶具備「編輯者」角色,可大範圍存取許多 Google Cloud 服務。雖然這是開發函式的最快方式,但 Google 建議您僅將預設服務帳戶用於測試和開發。在正式版中,請只為執行階段服務帳戶授予達成目標所需的最低權限組合。
如要保護正式版環境中的函式,請按照下列步驟操作:
變更預設執行階段服務帳戶的權限
控制台
前往 Google Cloud 控制台的「IAM」頁面:
從表格中選取「App Engine 預設服務帳戶」或「預設 Compute Engine 服務帳戶」。
按一下列右側的鉛筆圖示,顯示「Edit permissions」(編輯權限) 分頁。
在「角色」下拉式選單中新增或移除角色,提供最低的權限存取權。
按一下 [儲存]。
gcloud
移除編輯者角色,然後使用 gcloud projects add-iam-policy-binding
指令新增角色:
# Remove the Editor role gcloud projects remove-iam-policy-binding PROJECT_ID \ --member="SERVICE_ACCOUNT_EMAIL" \ --role="roles/editor" # Add the desired role gcloud projects add-iam-policy-binding PROJECT_ID \ --member="SERVICE_ACCOUNT_EMAIL" \ --role="ROLE"
其中 PROJECT_ID
是您使用的專案 ID,SERVICE_ACCOUNT_EMAIL
是預設執行階段服務帳戶的電子郵件地址 (如前文「執行階段服務帳戶」所示),而 ROLE
則是指派給預設執行階段服務帳戶的新角色。
為函式使用個別服務帳戶
為讓您更靈活地控管函式的存取權,您可以為每個函式指派由使用者管理的服務帳戶。
- 建立服務帳戶。請記下該資料夾的名稱。
- 依據函式需要存取的資源,授予適當角色。
如果服務帳戶和函式位於不同專案中,請從服務帳戶所在專案執行下列操作:
- 設定服務帳戶,讓服務帳戶可跨專案運作。
將服務帳戶權杖建立者角色 (
roles/iam.serviceAccountTokenCreator
) 授予 Cloud Run 函式服務代理程式 (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
),其中PROJECT
是指函式所在的專案。Cloud Run 函式服務代理人會管理服務帳戶的跨專案存取權。將
iam.serviceaccounts.actAs
權限授予不同專案服務帳戶中的 Cloud Run 函式服務代理程式。
授予服務帳戶存取資源的權限。這項操作的方法會因資源類型而異。
將服務帳戶連結至函式。您可以在部署時或更新先前已部署的函式時執行這項操作。
在部署時新增使用者自行管理的服務帳戶
控制台
前往 Google Cloud 控制台:
您可以指定及設定所需的函式。
按一下「Runtime, build...」,即可顯示其他設定。
選取「Runtime」分頁標籤。
按一下「Service account」下拉式選單,然後選取所需服務帳戶。
依序點選「下一步」和「部署」。
gcloud
使用 gcloud functions deploy
部署函式時,請新增 --service-account
標記。例如:
gcloud functions deploy --no-gen2 FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL
其中 FUNCTION_NAME
是函式名稱,SERVICE_ACCOUNT_EMAIL
則是服務帳戶電子郵件地址。
更新現有函式的服務帳戶
您可以更新現有函式的執行階段服務帳戶。
控制台
前往 Google Cloud 控制台:
按一下要查看的函式名稱,前往其詳細資料頁面。
按一下詳細資料頁面頂端的「Edit」鉛筆圖示,即可編輯函式。
按一下「Runtime, build...」,即可顯示其他設定。
選取「Runtime」分頁標籤。
按一下「Service account」下拉式選單,然後選取所需服務帳戶。
依序點選「下一步」和「部署」。
gcloud
使用 gcloud functions deploy
部署函式時,請新增 --service-account
標記:
gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL
其中 FUNCTION_NAME
是函式名稱,SERVICE_ACCOUNT_EMAIL
是服務帳戶。
重新部署的函式現在會使用新的執行階段服務帳戶。
使用中繼資料伺服器取得權杖
雖然 IAM 定義的服務帳戶是管理 Google Cloud中存取權的首選方法,但某些服務可能需要其他模式,例如 API 金鑰、OAuth 2.0 用戶端或服務帳戶金鑰。存取外部資源也可能需要其他方法。
如果目標服務要求您提供 OpenID Connect ID 權杖或 OAuth 2.0 存取權杖,您可以使用 Compute 中繼資料伺服器擷取這些權杖,而不需要設定完整的 OAuth 用戶端。
身分符記
您可以使用 Compute 中繼資料伺服器擷取 ID 權杖和特定目標對象,如下所示:
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \ -H "Metadata-Flavor: Google"
其中 AUDIENCE
是要求的目標,例如您要叫用的服務網址 (例如 https://service.domain.com
),或是 IAP 保護資源的 OAuth 用戶端 ID (例如 1234567890.apps.googleusercontent.com
)。
存取權杖
OAuth 2.0 存取權杖會使用「範圍」定義存取權限。根據預設, Google Cloud 存取權杖會在 cloud-platform
範圍內。如要存取其他 Google 或 Google Cloud API,您必須擷取具有適當範圍的存取權杖。
您可以使用 Compute 中繼資料伺服器來擷取存取憑證。
如果您需要具有特定範圍的存取憑證,可以產生一個,如下所示:
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=SCOPES" \ -H "Metadata-Flavor: Google"
其中 SCOPES
是要求的 OAuth 範圍清單 (以半形逗號分隔),例如:https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets
。
請參考 Google OAuth 範圍的完整清單,尋找您要的範圍。
後續步驟
瞭解如何授予存取權,或驗證開發人員和其他函式,以便他們叫用您的函式。