保護佇列設定

本頁面針對佇列管理和 queue.yaml 總覽中的內容提供實作最佳做法與盡可能避免陷阱的相關建議。其中的關鍵,在於限制佇列管理方法只有強制執行最佳做法的少數人員或實體才能使用。如果是大型機構,可能需要透過服務帳戶執行軟體來強制執行適當的佇列設定。

通常的做法是將使用者及其他實體分為三個類別:

  1. 佇列管理員:這個群組中的使用者具有相關權限,得以上傳 queue.yaml 檔案並呼叫 Cloud Tasks 佇列管理方法。這個群組將限制給少數使用者,避免不小心將 queue.yaml 與 Cloud Tasks 佇列管理方法混合使用而破壞佇列設定的風險。
  2. App Engine 部署者:對於具有 App Engine 應用程式的專案來說,這個群組中的使用者具有部署應用程式的權限。他們無法上傳 queue.yaml 檔案或建立任何 Cloud Tasks API 呼叫,因此允許佇列管理員強制執行適當的政策。
  3. Cloud Tasks 工作者:這個群組中的使用者具有相關權限,得以執行與 Cloud Tasks 的一般互動作業,例如將工作排入佇列或從佇列中移除工作。他們無法呼叫 Cloud Tasks 佇列管理方法。

在這樣的架構中,身為佇列管理員的使用者就不應兼任 Cloud Tasks 工作者的身分,因為這樣就失去分類的意義。

如果專案只有使用 Cloud Tasks 佇列管理方法,佇列管理員也不應兼任 App Engine 部署者身分,因為這樣可能會上傳錯誤的 queue.yaml 檔案。

小型專案和機構

小型專案和機構可將 Cloud IAM 角色直接指派給使用者,將使用者新增到上述群組。對於想要確保設定簡單易懂的團隊,或需要手動進行佇列設定變更或 App Engine 應用程式部署的團隊,這是相當合理的做法。

將使用者新增到下列群組:

佇列管理員

  1. 以專案管理員身分,將 cloudtasks.queueAdmin 角色授予使用者,讓他們可以上傳 queue.yaml 檔案並建立 Cloud Tasks 佇列管理 API 呼叫。

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/cloudtasks.queueAdmin
    
  2. 以具有 cloudtasks.queueAdmin 角色的使用者,依照上述最佳做法,選擇下列其中一項方法來變更佇列設定。

    1. 使用 gcloud 上傳 queue.yaml

      gcloud app deploy queue.yaml
      
    2. 使用 Cloud Tasks API 變更佇列設定。

App Engine 部署者

  1. 以專案管理員身分授予角色給使用者,讓他們能夠部署 App Engine 應用程式,但無法修改佇列設定或與工作互動:

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/storage.admin
    
  2. 以具有上述授予角色的使用者,部署 App Engine 應用程式。

    gcloud app deploy app.yaml
    

Cloud Tasks 工作者

以下範例會將角色指派給服務帳戶而非個人使用者。這是實際工作環境的常見做法。詳情請參閱大型專案和機構

  1. 以專案管理員身分授予角色給使用者,讓他們能夠與 Cloud Tasks 互動,但無法變更佇列設定:

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskDeleter
    
  2. 身為具備上述一或多個授予角色的使用者,您可以與 Cloud Tasks API 進行互動。

大型專案和機構

大型專案和機構可利用服務帳戶來劃分職務與職責。對於基礎架構複雜的團隊來說,如要部署 App Engine 應用程式並變更佇列設定,這是相當合理的做法。

如果佇列設定、App Engine 應用程式部署,以及與 Cloud Tasks 的互動是透過軟體而非使用者直接手動執行,通常可以採用下列操作說明。這樣還可以保護佇列設定,又不用要求團隊中的所有成員都要瞭解本頁面的內容。

例如,您可以建立所有使用者在建立、更新及刪除佇列時所必須使用的網路應用程式或指令列工具。無論該工具是使用 queue.yaml 還是 Cloud Tasks 佇列管理方法,使用者都無需理會這類工具實作細節。如果該工具是佇列管理員群組中的唯一實體,那麼就可確保 queue.yaml 和 Cloud Tasks 佇列管理方法不會遭到意外混用。

設定這些服務帳戶的操作說明如下。

佇列管理員

  1. 以專案管理員身分建立服務帳戶。

    gcloud iam service-accounts create queue-admin \
      --display-name "Queue Admin"
    
  2. 為服務帳戶授予 cloudtasks.queueAdmin 角色,讓服務帳戶能夠上傳 queue.yaml 檔案並建立 Cloud Tasks 佇列管理 API 呼叫。

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.queueAdmin
    
  3. 授予 iam.serviceAccountActor 角色給個人使用者、群組或其他實體,讓他們能夠變更佇列設定。這類使用者應限制為少數人員,例如允許在緊急情況下做出回應的系統管理員。

    gcloud iam service-accounts add-iam-policy-binding \
      queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. 建立服務帳戶金鑰,讓個人使用者或其他實體可取得服務帳戶的身分。

    gcloud iam service-accounts keys create \
      --iam-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      ~/queue-admin-service-account-key.json
    
  5. 以獲得 iam.serviceAccountActor 角色的使用者或其他實體,取得服務帳戶的身分。

    gcloud auth activate-service-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/queue-admin-service-account-key.json
    
  6. 依照上述最佳做法操作,只選擇下列其中一項方法來變更佇列設定:

    1. 使用 gcloud 上傳 queue.yaml

      gcloud app deploy queue.yaml
      
    2. 使用 Cloud Tasks 變更佇列設定。

App Engine 部署者

  1. 以專案管理員身分建立服務帳戶。

    gcloud iam service-accounts create app-engine-deployer \
      --display-name "App Engine Deployer"
    
  2. 為服務帳戶授予角色,讓服務帳戶能夠部署 App Engine 應用程式,但無法部署 queue.yaml

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/storage.admin
    
  3. 授予 iam.serviceAccountActor 角色給個人使用者、群組或其他實體,讓他們能夠部署 App Engine 應用程式。

    gcloud iam service-accounts add-iam-policy-binding \
      app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. 建立服務帳戶金鑰,讓個人使用者或其他實體可取得服務帳戶的身分。

    gcloud iam service-accounts keys create \
      --iam-account app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      ~/app-engine-deployer-service-account-key.json
    
  5. 以獲得 iam.serviceAccountActor 角色的使用者或其他實體,取得服務帳戶的身分。

    gcloud auth activate-service-account app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/app-engine-deployer-service-account-key.json
    
  6. 部署 App Engine 應用程式。

    gcloud app deploy app.yaml
    

Cloud Tasks 工作者

  1. 以專案管理員身分建立服務帳戶。

    gcloud iam service-accounts create cloud-tasks-worker \
      --display-name "Cloud Tasks Worker"
    
  2. 為服務帳戶授予角色,讓服務帳戶能夠與 Cloud Tasks 互動,但無法變更佇列設定。

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskDeleter
    
  3. 授予 iam.serviceAccountActor 角色給個人使用者、群組或其他實體,讓他們能夠在專案中使用 Cloud Tasks API。

    gcloud iam service-accounts add-iam-policy-binding \
      cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. 建立服務帳戶金鑰,讓個人使用者或其他實體可取得服務帳戶的身分。

    gcloud iam service-accounts keys create \
      --iam-account cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      ~/cloud-tasks-worker-service-account-key.json
    
  5. 以獲得 iam.serviceAccountActor 角色的使用者或其他實體,取得服務帳戶的身分。

    gcloud auth activate-service-account cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/cloud-tasks-worker-service-account-key.json
    
  6. 使用 Cloud Tasks API。

服務帳戶的其他相關資訊

如需服務帳戶的完整說明,請參閱下列頁面:

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Tasks 說明文件