Google cloud platform Terraform为服务帐户设置IAM策略时出错。。。需要iam.serviceAccounts.setIamPolicy权限

Google cloud platform Terraform为服务帐户设置IAM策略时出错。。。需要iam.serviceAccounts.setIamPolicy权限,google-cloud-platform,terraform,Google Cloud Platform,Terraform,我试图使用Terraform在GCP上创建一个非常简单的结构:一个计算实例+存储桶。我在GCP文档和Terraform文档中做了一些研究,所以也提出了一些问题,但仍然无法理解这里的诀窍是什么。有一种方法可以使用google\u project\u iam\u binding,但通过一些文章阅读似乎是危险的(阅读:不安全的解决方案)。还有一个只有GCP描述的一般答案,nit使用tf术语,这仍然有点混乱。在结束类似的问题时,我确认域名所有权是通过谷歌控制台验证的 因此,我得出以下结论: data“g

我试图使用Terraform在GCP上创建一个非常简单的结构:一个计算实例+存储桶。我在GCP文档和Terraform文档中做了一些研究,所以也提出了一些问题,但仍然无法理解这里的诀窍是什么。有一种方法可以使用
google\u project\u iam\u binding
,但通过一些文章阅读似乎是危险的(阅读:不安全的解决方案)。还有一个只有GCP描述的一般答案,nit使用tf术语,这仍然有点混乱。在结束类似的问题时,我确认域名所有权是通过谷歌控制台验证的

因此,我得出以下结论:

data“google\u iam\u策略”“管理”{
装订{
role=“roles/iam.serviceAccountUser”
成员=[
“用户:myemail@domain.name",
“serviceAccount:${google_service_account.serviceAccount.email}”,
]
}
}
资源“谷歌服务”帐户“服务帐户”{
帐户\u id=“sa-1”
}
资源“谷歌服务账户iam策略”“管理账户iam”{
service\u account\u id=google\u service\u account.servicecomport.name
policy\u data=data.google\u iam\u policy.admin.policy\u data
}
资源“谷歌存储桶iam策略”策略{
bucket=google\u storage\u bucket.storage\u bucket.name
policy\u data=data.google\u iam\u policy.admin.policy\u data
}
资源“谷歌计算网络”“专有网络”{
name=“专有网络”
自动创建子网络=“真”
}
资源“谷歌计算实例”“实例1”{
name=“实例-1”
机器类型=“f1微型”
启动盘{
初始化参数{
image=“cos云/cos稳定”
}
}
网络接口{
network=google\u compute\u network.vpc\u network.self\u link
访问配置{
}
}
}
资源“谷歌存储桶”“存储桶”{
name=“bucket-1”
地点=“美国”
强制销毁=真
网站{
主页面后缀=“index.html”
未找到\u page=“404.html”
}
科尔斯{
原点=[”http://the.domain.name"]
方法=[“获取”、“头部”、“放置”、“发布”、“删除”]
响应头=[“*”]
最大使用时间=3600秒
}
}
但是如果我应用terraform,日志会显示这样的错误

错误:为服务帐户“trololo”设置IAM策略时出错:googleapi:错误403:对服务帐户trololo执行此操作需要权限IAM.serviceAccounts.setIamPolicy.,禁止
2020/09/28 19:19:34[跟踪]状态管理器.文件系统:删除锁元数据文件.terraform.tfstate.lock.info
在main.tf第35行的资源“谷歌服务账户iam策略”“管理账户iam”中:
35:资源“谷歌服务账户iam策略”“管理账户iam”{
2020/09/28 19:19:34[跟踪]状态管理器文件系统:使用fcntl flock解锁terraform.tfstate
错误:googleapi:错误403:您试图创建的bucket是另一个用户拥有的域名,已被禁止
在main.tf第82行的资源“google_storage_bucket”“storage_bucket”中:

还有一些无用的调试信息。怎么了?哪个帐户缺少什么权限以及如何安全地分配这些权限?

我发现了问题。与往常一样,在90%的情况下,问题都出现在计算机前面

以下是帮助我理解和解决问题的步骤:

  • 我读了更多的文章,尤其是,对于理解用户、服务帐户和权限之间的关系非常有帮助
  • 我明白,执行
    terraform destroy
    也是非常重要的,因为不会回滚新基础架构更改的不成功部署(例如DB迁移),因此您必须使用destroy或手动清理
  • 完全删除了
    “user:${var.admin_email}”
    用户帐户IAM策略,因为它没有用;所有内容都必须由新创建的服务帐户管理
  • 自Terraform使用其凭据以来,主服务帐户的大部分权限保持不变(手动创建并下载访问密钥的权限)
  • 并将新服务帐户的IAM策略更改为
    角色/IAM.serviceAccountAdmin
    ,而不是
    用户
    -感谢@Wojtek_B的提示

  • 之后一切都会顺利进行!

    检查Terraform使用的服务帐户是否具有所需的权限(您的帐户必须有一个。这不是
    “google\u iam\u策略”中定义的吗?
    ?上面写着
    role=“roles/iam.serviceAccountUser”
    ,您需要
    管理员
    -而不是
    用户