本页面提供了一些建议,旨在帮助您采用最佳做法来适当地创建和配置队列,包括尽量避开使用队列管理与 queue.yaml 中所述的误区。关键在于限制仅允许一小部分人或实体才可使用队列管理方法。对于大型组织,可能需要使用服务帐号来运行强制执行适当的队列配置的软件。
本建议的总体思路是将用户和其他实体分为三类:
- 队列管理员 - 该组中的用户有权调用 Cloud Tasks 队列管理方法或上传
queue.yaml
文件。此组仅限于小部分用户,以便降低因无意中混合使用了queue.yaml
和 Cloud Tasks 队列管理方法而导致损坏队列配置的风险。 - Cloud Tasks 工作者 - 该组中的用户有权与 Cloud Tasks 进行常见交互,例如将任务排入队列和排出队列。 他们不可以调用 Cloud Tasks 队列管理方法。
- App Engine 部署者 - 对于拥有 App Engine 应用的项目,该组中的用户有权部署该应用。但这些用户不允许上传
queue.yaml
文件或进行任何 Cloud Tasks API 调用,这有助于队列管理员强制执行适当的政策。
在此方案中,队列管理员不应该同时是 Cloud Tasks 工作者,因为这有悖于分离的目的。
如果您的项目专门使用 Cloud Tasks 队列管理方法,那么队列管理员也不应该同时是 App Engine 部署者,否则可能会上传错误的 queue.yaml
文件。
小型项目和组织
小型项目和组织可以直接将 Identity and Access Management (IAM) 角色分配给用户,以将其置于上述组中。这种方案适合喜欢简化配置或者手动进行队列配置更改或 App Engine 应用部署的团队。
将用户添加到这些组,如下所示:
队列管理员
作为项目管理员,将
cloudtasks.queueAdmin
角色授予有权进行 Cloud Tasks 队列管理 API 调用或上传queue.yaml
文件的用户。gcloud projects add-iam-policy-binding [PROJECT_ID] \ --member user:[EMAIL] \ --role roles/cloudtasks.queueAdmin
作为具有
cloudtasks.queueAdmin
角色的用户,在完成上述最佳做法之后,选择下列方法中的一种来更改队列配置。使用 Cloud Tasks API 更改队列配置。
使用
gcloud
上传queue.yaml
:gcloud app deploy queue.yaml
Cloud Tasks 工作者
由于通常允许多个用户与 Cloud Tasks 进行交互,因此您可以将角色分配给服务帐号而不是具体用户。这种用法在生产环境中较为常见。如需了解详情,请参阅大型项目和组织。
作为项目管理员,将角色授予有权与 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 部署者
作为项目管理员,将角色授予允许部署 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
作为具有上述角色的用户,部署 App Engine 应用。
gcloud app deploy app.yaml
大型项目和组织
大型项目和组织可以使用服务帐号来分离职责。这种方案适合通过复杂基础架构来更改队列配置以及部署 App Engine 应用的团队。
当队列配置、与 Cloud Tasks 的交互以及可能的 App Engine 应用部署是通过软件而不是直接通过人工进行时,遵守以下说明开展任务通常是适当的做法。这种方法也可以保护队列配置,而无需团队的所有成员理解此页面上的内容。
例如,您可以创建所有用户都必须使用的用于创建、更新和删除队列的网页应用或命令行工具。该工具是使用 Cloud Tasks 队列管理方法还是 queue.yaml
,这属于工具的实现细节,无需用户关注。如果该工具是队列管理员组中的唯一实体,则可以保证 Cloud Tasks 队列管理方法和 queue.yaml
不会被无意间混合使用。
下面是设置这些服务帐号的说明。
队列管理员
作为项目管理员,创建服务帐号。
gcloud iam service-accounts create queue-admin \ --display-name "Queue Admin"
将
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
将
iam.serviceAccountActor
角色授予有权更改队列配置的真人用户、群组或其他实体。这个角色应该被授予极少数人,例如允许在紧急情况下做出响应的管理员。gcloud iam service-accounts add-iam-policy-binding \ queue-admin@[PROJECT_ID].iam.gserviceaccount.com \ --member user:[EMAIL] \ --role roles/iam.serviceAccountActor
创建服务帐号密钥,以使真人用户或其他实体可以承担服务帐号的身份。
gcloud iam service-accounts keys create \ --iam-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \ ~/queue-admin-service-account-key.json
作为被赋予
iam.serviceAccountActor
角色的用户或其他实体来承担服务帐号的身份。gcloud auth activate-service-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \ --key-file ~/queue-admin-service-account-key.json
完成上述最佳做法后,仅选择下列方法中的一种来更改队列配置:
使用 Cloud Tasks 更改队列配置。
使用
gcloud
上传queue.yaml
:gcloud app deploy queue.yaml
Cloud Tasks 工作者
作为项目管理员,创建服务帐号。
gcloud iam service-accounts create cloud-tasks-worker \ --display-name "Cloud Tasks Worker"
将角色授予服务帐号,以便它可以与 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
将
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
创建服务帐号密钥,以使真人用户或其他实体可以承担服务帐号的身份。
gcloud iam service-accounts keys create \ --iam-account cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \ ~/cloud-tasks-worker-service-account-key.json
作为被赋予
iam.serviceAccountActor
角色的用户或其他实体来承担服务帐号的身份。gcloud auth activate-service-account cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \ --key-file ~/cloud-tasks-worker-service-account-key.json
使用 Cloud Tasks API。
App Engine 部署者
作为项目管理员,创建服务帐号。
gcloud iam service-accounts create app-engine-deployer \ --display-name "App Engine Deployer"
将角色授予服务帐号,以便它可以部署 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
将
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
创建服务帐号密钥,以使真人用户或其他实体可以承担服务帐号的身份。
gcloud iam service-accounts keys create \ --iam-account app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \ ~/app-engine-deployer-service-account-key.json
作为被赋予
iam.serviceAccountActor
角色的用户或其他实体来承担服务帐号的身份。gcloud auth activate-service-account app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \ --key-file ~/app-engine-deployer-service-account-key.json
部署 App Engine 应用。
gcloud app deploy app.yaml
有关服务帐号的更多信息
如需了解服务帐号的全面说明,请参阅以下页面: