使用驗證搭配 HTTP 目標

如果您設定具備適當憑證的相關聯服務帳戶,Cloud Scheduler 即可呼叫需要驗證的 HTTP 目標。

設定服務帳戶

服務帳戶通常由應用程式或運算工作負載使用,並透過專屬的電子郵件地址識別。

應用程式可以透過服務帳戶進行驗證,並存取服務帳戶有權存取的所有資源,藉此執行已授權的 API 呼叫。

如要讓應用程式以服務帳戶身分進行驗證,最常見的做法是將服務帳戶附加至執行應用程式的資源。接著,您可以授予服務帳戶身分與存取權管理 (IAM) 角色,讓服務帳戶存取 Google Cloud 資源。

  1. 如果您還沒有要用於 Cloud Scheduler 工作 (含 HTTP 目標) 的服務帳戶,請建立新的服務帳戶。請注意以下事項:

    • 服務帳戶必須屬於建立 Cloud Scheduler 工作的專案。

    • 請勿使用 Cloud Scheduler 服務代理程式 (service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com),因為該代理程式不適用於此用途。

    • 請勿從專案中的 Cloud Scheduler 服務代理人撤銷 Cloud Scheduler 服務代理人角色 (roles/cloudscheduler.serviceAgent)。即使作業的服務帳戶具有適當角色,這麼做仍會導致系統對需要驗證的端點傳回 403 回應。

  2. 如果目標位於 Google Cloud,請將必要的 IAM 角色授予服務帳戶。 Google Cloud 中的每項服務都需要特定角色,而接收服務會自動驗證產生的權杖。舉例來說,如要使用 Cloud Run 和第二代 Cloud Run 函式,您必須授予 Cloud Run Invoker 角色。

    如要取得將服務帳戶附加至資源所需的權限,請要求管理員授予您服務帳戶的「服務帳戶使用者」(roles/iam.serviceAccountUser) IAM 角色。這個預先定義的角色包含 iam.serviceAccounts.actAs 權限,這是將服務帳戶附加至資源的必要權限。(如果您建立了服務帳戶,系統會自動授予這項權限)。

    在上一個步驟中,如果您專門建立服務帳戶來叫用 Cloud Scheduler 工作所要執行的服務,可以將該帳戶及其叫用者權限繫結至目標服務,遵循最低權限原則:

    主控台

    1. 在 Google Cloud 控制台的專案選擇器頁面中,選取專案Google Cloud 。

      前往專案選取器

    2. 前往您要叫用的資源類型頁面。舉例來說,如果您要叫用 Cloud Run 服務,請前往列出 Cloud Run 服務的頁面。

    3. 在要叫用的服務左側選取核取方塊。 (請勿點選服務本身)。

    4. 按一下「權限」分頁標籤。

      如果資訊窗格未顯示,您可能需要依序點選「顯示資訊面板」>「權限」

    5. 按一下「新增主體」

    6. 在「New principals」(新增主體) 欄位中,輸入您建立的服務帳戶電子郵件地址。

    7. 在「Select a role」(選取角色) 清單中,選取要授予的角色。

      請遵循最低權限原則,選擇僅含主體所需權限的角色。

    8. 按一下 [儲存]

    gcloud

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
        --member=PRINCIPAL \
        --role=ROLE
    

    更改下列內容:

    • RESOURCE_TYPE:目標的資源類型。 例如,Cloud Run 目標的 run
    • RESOURCE_ID:目標的 ID。例如 Cloud Run 目標的服務名稱。
    • PRINCIPAL:服務帳戶的 ID。格式如下: serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS。例如: serviceAccount:my-service-account@my-project.iam.gserviceaccount.com
    • ROLE:目標服務呼叫時所需的角色名稱。舉例來說,roles/run.invoker適用於 Cloud Run 或第二代 Cloud Run 函式目標。
    • 如需其他選用參數,請參閱 gcloud 指令列參考資料

    範例:

    • Cloud Run 叫用者 (roles/run.invoker) IAM 角色授予 Cloud Run 服務 my-service 上的服務帳戶 my-service-account@my-project.iam.gserviceaccount.com

      gcloud run add-iam-policy-binding my-service \
          --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
          --role=roles/run.invoker
      
    • 將第二代 Cloud Run 函式所需的 Cloud Run Invoker (roles/run.invoker) IAM 角色授予 Cloud Run 函式 my-gen2-function 上的服務帳戶 my-service-account@my-project.iam.gserviceaccount.com

      gcloud functions add-iam-policy-binding my-gen2-function \
          --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
          --role=roles/run.invoker \
          --gen2
      
  3. 如果目標不在 Google Cloud內,接收服務必須手動驗證權杖

  4. 啟用 Cloud Scheduler API 時,系統會自動設定預設的 Cloud Scheduler 服務代理人,如果您是在 2019 年 3 月 19 日之前啟用,則必須授予 Cloud Scheduler 服務代理人角色。這樣才能代表您的服務帳戶產生標頭憑證,藉此對目標進行驗證。

建立使用驗證的 Cloud Scheduler 工作

Cloud Scheduler 會依據用戶端服務帳戶建立標頭憑證 (由電子郵件識別),並且透過 HTTPS 傳送至目標,以在 Cloud Scheduler 和 HTTP 目標之間進行驗證。您可以使用 ID (OIDC) 權杖 或 OAuth (存取) 權杖。一般狀況會使用 OIDC,但 *.googleapis.com 上託管的 Google API「除外」,這些 API 預期會使用 OAuth 憑證。

如要建立使用驗證的 Cloud Scheduler 工作,您必須在建立工作時,新增權杖類型和用來識別用戶端服務帳戶的電子郵件地址:

主控台

  1. 前往 Google Cloud 控制台的 Cloud Scheduler 頁面。

    前往 Cloud Scheduler

  2. 按一下 「建立工作」

  3. 在「Name」(名稱) 欄位中,輸入專案專屬的工作名稱。請注意,即使您刪除了關聯的工作,仍然不得在專案中再次使用此名稱。

  4. 在「Region」(區域) 清單中,選取工作所在的區域。

  5. 為工作指定「頻率」和「時區」。 您在這裡提供的字串可以是任何與 Unix-Cron 相容的字串。

  6. 按一下「繼續」

  7. 在「Target type」(目標類型) 清單中,選取「HTTP」

  8. 指定 URLHTTP 方法

  9. 在「Auth header」(驗證標頭) 清單中,選取憑證類型。一般狀況會使用 OIDC 權杖,但 *.googleapis.com 上託管的 Google API 除外,這些 API 預期會使用 OAuth 權杖。

  10. 在「Service account」(服務帳戶) 清單中,選取服務帳戶電子郵件地址。

  11. 您可以選擇指定「目標對象」,限制 OIDC 權杖的收件者。一般來說,這是工作的目標網址,不含任何網址參數。如未指定,系統會將整個網址 (包括要求參數) 當做目標對象。

  12. 視需要調整其他設定。

  13. 點選「建立」

gcloud

gcloud scheduler jobs create http JOB_ID \
    --schedule="FREQUENCY" \
    --uri=URI \
    --oidc-service-account-email=SERVICE_ACCOUNT_EMAIL

更改下列內容:

  • JOB_ID:專案專屬的工作名稱。請注意,即使您刪除了關聯的工作,仍然不得在專案中再次使用此名稱。
  • FREQUENCY:工作執行的間隔或頻率,例如 every 3 hoursevery 10 mins。 您在這裡提供的字串可以是任何與 Unix-Cron 相容的字串。
  • URI:端點的完整網址。
  • SERVICE_ACCOUNT_EMAIL:服務帳戶的電子郵件地址。一般狀況會使用 OIDC 權杖,但 *.googleapis.com 上託管的 Google API「除外」,這些 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 工作就會失敗。您可以手動將角色授予 Cloud Scheduler 服務代理人,該代理人的電子郵件地址格式如下:

service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com

如果符合下列任一條件,您只能手動授予角色:

  • 您在 2019 年 3 月 19 日之前啟用 Cloud Scheduler API
  • 您已從服務代理程式中移除 Cloud Scheduler 服務代理程式角色

您可以查看專案目前的存取權,確認 Cloud Scheduler 服務代理程式已在專案中設定,且已獲授予 Cloud Scheduler Service Agent 角色。請注意,如果您使用 Google Cloud 控制台查看專案的存取權,請務必選取「包含 Google 提供的角色授予項目」核取方塊。

如要瞭解如何將角色授予服務代理程式,請參閱建立服務代理程式並授予角色

後續步驟

瞭解如何透過程式驗證 Cloud Scheduler