只要設定具備適當憑證的關聯服務帳戶,Cloud Scheduler 就能呼叫需要驗證的 HTTP 目標。
設定服務帳戶
服務帳戶通常由應用程式或運算工作負載使用,並以專屬的電子郵件地址識別。
應用程式可以透過服務帳戶本身進行驗證,並存取服務帳戶有權存取的所有資源,藉此使用服務帳戶進行授權的 API 呼叫。
如要讓應用程式以服務帳戶身分進行驗證,最常見的方法是將服務帳戶附加至執行應用程式的資源。接著,您可以授予服務帳戶 Identity and Access Management (IAM) 角色,讓服務帳戶存取 Google Cloud 資源。
如果您還沒有要用於 Cloud Scheduler 工作 (含 HTTP 目標) 的服務帳戶,請建立新的服務帳戶。請注意以下事項:
服務帳戶必須隸屬於建立 Cloud Scheduler 工作的專案。
請勿使用 Cloud Scheduler 服務代理 (
service-PROJECT_NUMBER@gcp-sa-cloudscheduler.),因為該代理無法用於這項用途。請勿撤銷專案中 Cloud Scheduler 服務代理的 Cloud Scheduler 服務代理角色 (
roles/cloudscheduler.serviceAgent)。這樣一來,即使工作服務帳戶具備適當角色,系統仍會對需要驗證的端點傳回403回應。
如果目標位於 Google Cloud,請為服務帳戶授予必要的 IAM 角色。 Google Cloud 中的每項服務都需要特定角色,接收服務會自動驗證產生的權杖。
舉例來說,如果是 Cloud Run 和 Cloud Run functions,您必須授予 Cloud Run 叫用者 (
roles/run.invoker) 角色;如果是 Cloud Functions (第 1 代),則須授予 Cloud Functions 叫用者 (roles/cloudfunctions.invoker) 角色。如要取得將服務帳戶附加至資源所需的權限,請要求管理員授予您服務帳戶的服務帳戶使用者 (
roles/iam.serviceAccountUser) IAM 角色。這個預先定義的角色具備iam.serviceAccounts.actAs權限,可將服務帳戶附加至資源。(如果您已建立服務帳戶,系統會自動授予這項權限)。在上一個步驟中,如果您特別建立服務帳戶來叫用 Cloud Scheduler 工作指定的服務,可以遵循最小權限原則,將帳戶及其叫用者權限繫結至目標服務:
控制台
在 Google Cloud 控制台的專案選取器頁面中,選取Google Cloud 專案。
前往您要叫用的資源類型頁面。舉例來說,如果您要叫用 Cloud Run 服務,請前往列出 Cloud Run 服務的頁面。
找出要叫用的服務,然後勾選左側的核取方塊。(請勿點選服務本身)。
按一下「Permissions」(權限) 分頁標籤。
如果看不到資訊窗格,可能需要依序點選「Show Info Panel」(顯示資訊面板) >「Permissions」(權限)。
按一下「 新增主體」。
在「New principals」(新增主體) 欄位中,輸入您建立的服務帳戶電子郵件地址。
從「Select a role」(選取角色) 清單中,選取要授予的角色。
遵循最小權限原則,選擇僅含主體所需權限的角色。
按一下 [儲存]。
gcloud
gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \ --member=PRINCIPAL \ --role=ROLE更改下列內容:
RESOURCE_TYPE:目標的資源類型。例如,Cloud Run 服務目標為run services。RESOURCE_ID:目標的 ID。例如 Cloud Run 服務的名稱。PRINCIPAL:服務帳戶的 ID。格式如下:serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS。例如:serviceAccount:my-service-account@my-project.。ROLE:叫用目標服務所需的角色名稱。例如,Cloud Run 服務目標為roles/run.invoker。如果是 Cloud Run functions 目標,建議使用add-invoker-policy-binding指令。
範例:
使用
gcloud run services add-iam-policy-binding指令,將 Cloud Run 叫用者 (roles/run.invoker) IAM 角色授予 Cloud Run 服務my-service上的服務帳戶my-service-account@my-project.:gcloud run services add-iam-policy-binding my-service \ --region=REGION \ --member=serviceAccount:my-service-account@my-project. \ --role=roles/run.invoker使用
gcloud functions add-invoker-policy-binding指令,將適當的角色授予 Cloud Run 函式my-cloud-function的服務帳戶my-service-account@my-project.。如果是 Cloud Run functions,這項操作會將 Cloud Run 叫用者 (
roles/run.invoker) 繫結新增至指定函式基礎 Cloud Run 服務的 IAM 政策。如果是 Cloud Functions (第 1 代),這會將 Cloud Functions 叫用者 (roles/cloudfunctions.invoker) 繫結新增至指定函式的 IAM 政策:gcloud functions add-invoker-policy-binding my-cloud-function \ --region=REGION \ --member=serviceAccount:my-service-account@my-project.
如需使用 Terraform 建立服務帳戶,並授予叫用 Cloud Run 服務權限的範例,請參閱「為 Cloud Scheduler 建立服務帳戶」。
如果目標位於 Google Cloud外部,接收服務必須手動驗證權杖。
啟用 Cloud Scheduler API 時,系統會自動設定預設的 Cloud Scheduler 服務代理,除非您是在 2019 年 3 月 19 日前啟用,在這種情況下,您必須授予 Cloud Scheduler 服務代理角色。這樣一來,它就能代表服務帳戶產生標頭權杖,向目標進行驗證。
建立使用驗證機制的 Cloud Scheduler 工作
如要在 Cloud Scheduler 和 HTTP 目標之間進行驗證,Cloud Scheduler 會根據用戶端服務帳戶 (以電子郵件識別) 建立標頭權杖,並使用 HTTPS 將權杖傳送至目標。您可以使用 ID (OIDC) 權杖或 OAuth (存取) 權杖。一般來說,除了託管於 *.googleapis.com 的 Google API 之外,其他 API 都會使用 OIDC。這些 API 需要 OAuth 權杖,而 Cloud Scheduler 只接受託管於 *.googleapis.com 的目標網址 OAuth 權杖。
如要建立使用驗證機制的 Cloud Scheduler 工作,您必須在建立工作時,新增權杖類型和用來識別用戶端服務帳戶的電子郵件地址:
控制台
前往 Google Cloud 控制台的「Cloud Scheduler」頁面。
按一下「 建立工作」。
在「Name」(名稱) 欄位中,輸入專案和區域內不重複的工作名稱。刪除相關聯的工作後,即可重複使用工作名稱。
在「Region」(區域) 清單中,選取工作所在的區域。
為工作指定頻率和時區。您在此提供的字串可以是任何與 unix-cron 相容的字串。
按一下「繼續」。
在「Target type」(目標類型) 清單中,選取「HTTP」。
指定開頭為
https://的網址和 HTTP 方法。在「Auth header」(驗證標頭) 清單中,選取權杖類型。一般來說,除了託管於
*.googleapis.com的 Google API 之外,其他 API 都會使用 OIDC 權杖,因為這些 API 需要 OAuth 權杖。在「Service account」(服務帳戶) 清單中,選取服務帳戶電子郵件地址。
您可以視需要指定「Audience」(目標對象),限制 OIDC 權杖的接收端。一般來說,這會是工作的目標網址,不含任何網址參數。如未指定,系統會將整個網址 (包括要求參數) 做為目標對象。
調整選用設定。
點選「建立」。
gcloud
gcloud scheduler jobs create http JOB_ID \ --location=LOCATION \ --schedule="FREQUENCY" \ --uri=URI \ --oidc-service-account-email=SERVICE_ACCOUNT_EMAIL
更改下列內容:
JOB_ID:專案和區域內不重複的工作名稱。刪除相關聯的工作後,即可重複使用工作名稱。LOCATION:工作的位置 (區域)。FREQUENCY:工作執行的間隔或頻率,例如every 3 hours或every 10 mins。您在此提供的字串可以是任何與 unix-cron 相容的字串。URI:端點的完整 HTTPS 網址 (必須以https://開頭)。SERVICE_ACCOUNT_EMAIL:服務帳戶的電子郵件地址。一般來說,除了託管於*.googleapis.com的 Google API 之外,其他 API 都會使用 OIDC 權杖,因為這些 API 需要 OAuth 權杖。(請改用--oauth-service-account-email旗標定義 OAuth 權杖類型)。- 其他選用參數請參閱 gcloud 指令列參考資料。
授予 Cloud Scheduler 服務代理角色
部分 Google Cloud 服務需要存取您的資源,才能代表您執行操作。為滿足這項需求, Google Cloud 會建立及管理稱為「服務代理」的服務帳戶,並在您啟用及使用 Google Cloud服務時,自動建立這些帳戶並授予角色。
Cloud Scheduler 服務代理需要 Cloud Scheduler 服務代理 (roles/cloudscheduler.serviceAgent) 角色。如果沒有這個角色,需要服務代理的 Cloud Scheduler 工作 (例如使用驗證的 HTTP 目標工作和 Pub/Sub 目標工作) 就會失敗。您可以手動將角色授予 Cloud Scheduler 服務代理,其電子郵件地址格式如下:
service-PROJECT_NUMBER@gcp-sa-cloudscheduler.
只有在符合下列任一條件時,才需要手動授予角色:
- 您在 2019 年 3 月 19 日前啟用了 Cloud Scheduler API
- 您已從服務代理移除 Cloud Scheduler 服務代理角色
您可以查看專案目前的存取權,確認專案中是否已設定 Cloud Scheduler 服務代理,且該代理具備 Cloud Scheduler 服務代理角色。請注意,如果您使用 Google Cloud 控制台查看專案的存取權,請務必勾選「Include Google-provided role grants」(包含 Google 提供的角色授予項目) 核取方塊。
如要瞭解如何將角色授予服務代理,請參閱「建立角色並授予服務代理」。