使用 Terraform 创建 GCP 自定义 IAM 角色

Posted

技术标签:

【中文标题】使用 Terraform 创建 GCP 自定义 IAM 角色【英文标题】:GCP Custom IAM role creation with Terraform 【发布时间】:2018-09-09 23:59:51 【问题描述】:

我正在尝试使用 Terraform 在 GCP 中为我的实例创建自定义 IAM 角色。 AFIACT,以下应该可以工作,但是我出错了,抱怨我想要包含的标准角色无效。

resource "google_project_iam_custom_role" "my-instance-role" 
  role_id     = "myInstanceRole"
  title       = "My Instance Role"
  description = "my custom iam role"
  permissions = [
    "roles/storage.objectCreator", 
    "roles/cloudkms.cryptoKeyEncrypter"
  ]

这是错误信息:

* google_project_iam_custom_role.my-instance-role: Error creating 
the custom project role My Instance Role: googleapi: Error 400: 
Permission roles/storage.objectCreator is not valid., badRequest

Terraform 文档不是很清楚,但根据我的阅读,这应该可以。知道我在这里做错了什么吗?

【问题讨论】:

【参考方案1】:

好的。我想到了。您不能在自定义角色中包含 predefined GCP role。您必须指定specific service permissions。我真正想做的是:

resource "google_project_iam_custom_role" "my-instance-role" 
  role_id     = "myInstanceRole"
  title       = "My Instance Role"
  description = "my custom iam role"
  permissions = [
    "storage.objects.create", 
    "cloudkms.cryptoKeyVersions.useToEncrypt"
  ]

这里的关键是预定义 GCP 角色(例如“roles/storage.objectCreator”,它是 GCP 权限的集合)与单独使用这些单独权限之间的区别。在 Terraform 中创建自定义 IAM 角色时,您必须指定要应用的单个服务级别权限,例如“storage.objects.create”。

【讨论】:

答案似乎不完整,它是问题的扩展(在这种情况下编辑问题),还是描述不完整的解决方案?然后接受你自己的答案,这样我们就知道它已经解决了。 对不起,这是一个完整的答案,我已经接受了。 我已经编辑了我的答案,希望能提供更清晰的答案。请让我知道您认为缺少什么。【参考方案2】:

首先,您在权限部分赋予角色,这是错误的。 您可以使用一些模块,这些模块允许您使用一组预定义的角色和权限来创建自定义角色。您可以在这里使用或参考我的代码 - Terraform code to create custom roles

注意:所有权限都不适用于自定义角色,因此例如,如果您尝试赋予roles/iam.securityAdmin 角色,那么您将不得不排除某些权限,因为自定义角色中不允许这些权限。您将不得不手动列出排除权限,因为没有办法。

这就是您必须列出所有需要排除的角色的方式。 只需像这样将它传递给模块 -

module "custom-viewer-role-project" 
  #count = length(var.viewer_permissions)
  source = "../../modules/custom_role_iam/"
  target_level         = "project"
  target_id            = var.project_id
  role_id              = var.viewer_role_id
  base_roles           = var.viewer_base_roles
  permissions          = var.viewer_permissions
  excluded_permissions = var.viewer_excluded_permissions
  description          = var.viewer_description
  members              = ["serviceAccount:$var.viewer_members@$var.project_id.iam.gserviceaccount.com"]

变量 - viewer_base_roles = 你在这里列出你需要的所有角色

viewer_excluded_permissions = 您必须在此处提供排除权限列表

【讨论】:

以上是关于使用 Terraform 创建 GCP 自定义 IAM 角色的主要内容,如果未能解决你的问题,请参考以下文章

GCP 为每个项目和 Terraform 预定义 IAM 角色

使用自定义服务帐户在 GCP 中创建 VM 时,KMS 权限出现 400 错误

使用 terraform 创建多个 GCP 存储桶

如何使用 Terraform 公开 gcp 云功能

使用来自 GCP 市场的 terraform 创建实例

我可以使用 Terraform 创建 GCP API 密钥吗?