保护队列配置

本页面提供了一些建议,旨在帮助您采用最佳做法来适当地创建和配置队列,包括尽量避开使用队列管理与 queue.yaml 中所述的误区。关键在于限制仅允许一小部分人或实体才可使用队列管理方法。对于大型组织,可能需要使用服务帐号来运行强制执行适当的队列配置的软件。

本建议的总体思路是将用户和其他实体分为三类:

  1. 队列管理员 - 该组中的用户有权调用 Cloud Tasks 队列管理方法或上传 queue.yaml 文件。此组仅限于小部分用户,以便降低因无意中混合使用了 queue.yaml 和 Cloud Tasks 队列管理方法而导致损坏队列配置的风险。
  2. Cloud Tasks 工作者 - 该组中的用户有权与 Cloud Tasks 进行常见交互,例如将任务排入队列和排出队列。 他们可以调用 Cloud Tasks 队列管理方法。
  3. App Engine 部署者 - 对于拥有 App Engine 应用的项目,该组中的用户有权部署该应用。但这些用户允许上传 queue.yaml 文件或进行任何 Cloud Tasks API 调用,这有助于队列管理员强制执行适当的政策。

在此方案中,队列管理员不应该同时是 Cloud Tasks 工作者,因为这有悖于分离的目的。

如果您的项目专门使用 Cloud Tasks 队列管理方法,那么队列管理员也不应该同时是 App Engine 部署者,否则可能会上传错误的 queue.yaml 文件。

小型项目和组织

小型项目和组织可以直接将 Identity and Access Management (IAM) 角色分配给用户,以将其置于上述组中。这种方案适合喜欢简化配置或者手动进行队列配置更改或 App Engine 应用部署的团队。

将用户添加到这些组,如下所示:

队列管理员

  1. 作为项目管理员,将 cloudtasks.queueAdmin 角色授予有权进行 Cloud Tasks 队列管理 API 调用或上传 queue.yaml 文件的用户。

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/cloudtasks.queueAdmin
    
  2. 作为具有 cloudtasks.queueAdmin 角色的用户,在完成上述最佳做法之后,选择下列方法中的一种来更改队列配置。

    1. 使用 Cloud Tasks API 更改队列配置。

    2. 使用 gcloud 上传 queue.yaml

      gcloud app deploy queue.yaml
      

Cloud Tasks 工作者

由于通常允许多个用户与 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
    

作为具有上述一个或多个角色的用户,您可以与 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
    

大型项目和组织

大型项目和组织可以使用服务帐号来分离职责。这种方案适合通过复杂基础架构来更改队列配置以及部署 App Engine 应用的团队。

当队列配置、与 Cloud Tasks 的交互以及可能的 App Engine 应用部署是通过软件而不是直接通过人工进行时,遵守以下说明开展任务通常是适当的做法。这种方法也可以保护队列配置,而无需团队的所有成员理解此页面上的内容。

例如,您可以创建所有用户都必须使用的用于创建、更新和删除队列的网页应用或命令行工具。该工具是使用 Cloud Tasks 队列管理方法还是 queue.yaml,这属于工具的实现细节,无需用户关注。如果该工具是队列管理员组中的唯一实体,则可以保证 Cloud Tasks 队列管理方法和 queue.yaml 不会被无意间混合使用。

下面是设置这些服务帐号的说明。

队列管理员

  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. 使用 Cloud Tasks 更改队列配置。

    2. 使用 gcloud 上传 queue.yaml

      gcloud app deploy queue.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。

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
    

有关服务帐号的更多信息

如需了解服务帐号的全面说明,请参阅以下页面: