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

7

我正在尝试使用Terraform为我的实例在GCP中创建自定义IAM角色。据我所知,以下操作应该可行,但是它仍然出现错误,提示我想要包括的标准角色无效。

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文档并不是特别清晰,但从我阅读的内容来看,这应该可以正常工作。您知道我在这里做错了什么吗?

2个回答

11

好的,我弄清楚了。您不能在自定义角色中包含预定义的 GCP 角色。您必须指定特定服务权限。我真正想做的是这个:

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”。


答案似乎不完整,它是问题的扩展吗(在这种情况下编辑问题),还是一个未完全描述的解决方案?然后接受您自己的答案,以便我们知道问题已解决。 - Oliver
对不起,这是一个完整的答案,我已经接受了它。 - ducksauz
我已经编辑了我的答案,希望能提供更多的清晰度。请让我知道您认为缺少什么。 - ducksauz
您可以使用以下命令获取预定义项目列表:gcloud iam roles describe roles/storage.objectCreator includedPermissions:
  • orgpolicy.policy.get
  • resourcemanager.projects.get
  • resourcemanager.projects.list
  • storage.multipartUploads.abort
  • storage.multipartUploads.create
  • storage.multipartUploads.listParts
  • storage.objects.create ...
- Ajax

1

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

注意:并非所有权限都适用于自定义角色,因此例如,如果您尝试授予roles/iam.securityAdmin角色,则必须排除某些权限,因为它们不允许在自定义角色中使用。由于没有其他方法,您将不得不手动列出要排除的权限列表。 enter image description here

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

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 = 在此处提供要排除的权限列表


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接