GCP SERVICE_ACCOUNT_ACCESS_DENIED 尝试使用部署管理器部署实例时

GCP SERVICE_ACCOUNT_ACCESS_DENIED when trying to deploy instance with deployment manager

我是 google 云平台部署管理器的新手,我正在尝试部署一个实例,该实例附加了服务帐户以及我需要的必要 api。我在实例模板中附加服务帐户以及 api 的代码如下:

     - email: <service-account-email@developer.gserviceaccount.com>
       scopes:
       - https://www.googleapis.com/auth/cloud-platform
       - https://www.googleapis.com/auth/compute
       - https://www.googleapis.com/auth/servicecontrol
       - https://www.googleapis.com/auth/service.management.readonly
       - https://www.googleapis.com/auth/logging.write
       - https://www.googleapis.com/auth/monitoring.write
       - https://www.googleapis.com/auth/trace.append
       - https://www.googleapis.com/auth/devstorage.read_write

执行代码部署我的实例 i 运行 后出现以下错误消息:

- code: RESOURCE_ERROR
  location: /deployments/gcpnetwork/resources/instance name
  message: "{\"ResourceType\":\"compute.v1.instance\",\"ResourceErrorCode\":\"SERVICE_ACCOUNT_ACCESS_DENIED\"\
    ,\"ResourceErrorMessage\":\"The user does not have access to service account '<service-account-email@developer.gserviceaccount.com>'.\
    \  User: 'service-account-id-number@cloudservices.gserviceaccount.com'.  Ask a project owner\
    \ to grant you the iam.serviceAccountUser role on the service account\"}"

我已经在 I AM-IAM 和管理控制台下为服务帐户和服务帐户用户分配了适当的权限,但没有成功。我也是项目所有者,可以完全访问所有 GCP 资源。有什么我遗漏或做错的吗?我也试过模拟服务账号还是不行,请帮忙说明一下。

您用于创建实例的身份没有角色 roles/iam.serviceAccountUser。需要此角色才能创建和管理使用服务帐户的实例。

The serviceAccountUser role

我设法找到了解决问题的方法,而没有像错误提示的那样通过 IAM 用户角色。该错误是由于尝试在部署管理器的实例模板中直接附加服务帐户引起的。这导致部署经理认为您在部署实例时尝试创建一个新的服务帐户,但事实并非如此,因为我试图在现有项目中使用默认服务帐户。因此,通过这种方式直接附加服务帐户电子邮件:

 - email: <service-account-email@developer.gserviceaccount.com>
   scopes:
   - https://www.googleapis.com/auth/cloud-platform
   - https://www.googleapis.com/auth/compute
   - https://www.googleapis.com/auth/servicecontrol
   - https://www.googleapis.com/auth/service.management.readonly
   - https://www.googleapis.com/auth/logging.write
   - https://www.googleapis.com/auth/monitoring.write
   - https://www.googleapis.com/auth/trace.append
   - https://www.googleapis.com/auth/devstorage.read_write

导致错误。解决方法是使用值 email: default 以及范围列表来解决问题:

 - email: default
   scopes:
   - https://www.googleapis.com/auth/cloud-platform
   - https://www.googleapis.com/auth/compute
   - https://www.googleapis.com/auth/servicecontrol
   - https://www.googleapis.com/auth/service.management.readonly
   - https://www.googleapis.com/auth/logging.write
   - https://www.googleapis.com/auth/monitoring.write
   - https://www.googleapis.com/auth/trace.append
   - https://www.googleapis.com/auth/devstorage.read_write

这允许部署经理在现有项目中选择默认服务帐户。另请注意,范围列表中的范围 - https://www.googleapis.com/auth/cloud-platform 使您可以访问所有实例 api。因此,通过从范围列表中删除 - https://www.googleapis.com/auth/cloud-platform 并以这种方式使用它:

 - email: default
   scopes:
   - https://www.googleapis.com/auth/compute
   - https://www.googleapis.com/auth/servicecontrol
   - https://www.googleapis.com/auth/service.management.readonly
   - https://www.googleapis.com/auth/logging.write
   - https://www.googleapis.com/auth/monitoring.write
   - https://www.googleapis.com/auth/trace.append
   - https://www.googleapis.com/auth/devstorage.read_write

是我所需要的,因为我不想访问所有实例 api。但是如果你想访问所有实例api,你只需要这样指定云平台范围的默认值:

 - email: default
   scopes:
   - https://www.googleapis.com/auth/cloud-platform

我希望这已经足够清楚,可以帮助遇到同样问题的任何人。