使用驗證搭配 HTTP 目標

只要設定具備適當憑證的關聯服務帳戶,Cloud Scheduler 就能呼叫需要驗證的 HTTP 目標。

設定服務帳戶

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

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

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

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

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

    • 請勿使用 Cloud Scheduler 服務代理 (service-PROJECT_NUMBER@gcp-sa-cloudscheduler.),因為該代理無法用於這項用途。

    • 請勿撤銷專案中 Cloud Scheduler 服務代理的 Cloud Scheduler 服務代理角色 (roles/cloudscheduler.serviceAgent)。這樣一來,即使工作服務帳戶具備適當角色,系統仍會對需要驗證的端點傳回 403 回應。

  2. 如果目標位於 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 工作指定的服務,可以遵循最小權限原則,將帳戶及其叫用者權限繫結至目標服務:

    控制台

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

      前往專案選取器

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

    3. 找出要叫用的服務,然後勾選左側的核取方塊。(請勿點選服務本身)。

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

      如果看不到資訊窗格,可能需要依序點選「Show Info Panel」(顯示資訊面板) >「Permissions」(權限)。

    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 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 建立服務帳戶」。

  3. 如果目標位於 Google Cloud外部,接收服務必須手動驗證權杖。

  4. 啟用 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 工作,您必須在建立工作時,新增權杖類型和用來識別用戶端服務帳戶的電子郵件地址:

控制台

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

    前往 Cloud Scheduler

  2. 按一下「 建立工作」。

  3. 在「Name」(名稱) 欄位中,輸入專案和區域內不重複的工作名稱。刪除相關聯的工作後,即可重複使用工作名稱。

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

  5. 為工作指定頻率和時區。您在此提供的字串可以是任何與 unix-cron 相容的字串。

  6. 按一下「繼續」。

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

  8. 指定開頭為 https:// 的網址和 HTTP 方法。

  9. 在「Auth header」(驗證標頭) 清單中,選取權杖類型。一般來說,除了託管於 *.googleapis.com 的 Google API 之外,其他 API 都會使用 OIDC 權杖,因為這些 API 需要 OAuth 權杖。

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

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

  12. 調整選用設定。

  13. 點選「建立」。

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 提供的角色授予項目) 核取方塊。

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

後續步驟

瞭解如何以程式輔助方式向 Cloud Scheduler 進行驗證。