这是子模块的集合,可以更轻松地非破坏性地管理 Google Cloud Platform 上资源的多个 IAM 角色:
该模块适用于 Terraform 1.3+ 并使用 Terraform 1.3+ 进行测试。如果您发现使用 Terraform >=1.3 不兼容,请提出问题。
以下指南可帮助升级:
完整的示例位于示例文件夹中,但管理两个项目的角色的基本用法如下:
module "projects_iam_bindings" {
source = " terraform-google-modules/iam/google//modules/projects_iam "
version = " ~> 8.0 "
projects = [ " project-123456 " , " project-9876543 " ]
bindings = {
" roles/storage.admin " = [
" group:[email protected] " ,
" user:[email protected] " ,
]
" roles/compute.networkAdmin " = [
" group:[email protected] " ,
" user:[email protected] " ,
]
" roles/compute.imageUser " = [
" user:[email protected] " ,
]
}
}
该模块还提供了一种权威模式,它将删除所有未通过 Terraform 分配的角色。这是使用权威模式来管理存储桶访问的示例:
module "storage_buckets_iam_bindings" {
source = " terraform-google-modules/iam/google//modules/storage_buckets_iam "
version = " ~> 8.0 "
storage_buckets = [ " my-storage-bucket " ]
mode = " authoritative "
bindings = {
" roles/storage.legacyBucketReader " = [
" user:[email protected] " ,
" group:[email protected] " ,
]
" roles/storage.legacyBucketWriter " = [
" user:[email protected] " ,
" group:[email protected] " ,
]
}
}
mode
变量控制子模块的行为,默认情况下它设置为“additive”,可能的选项有:
在权威模式下,子模块完全控制模块中列出的 IAM 绑定。这意味着添加到模块外部角色的任何成员都将在下次 Terraform 运行时被删除。但是,模块中未列出的角色将不受影响。
在附加模式下,子模块不会影响现有的绑定。相反,模块中列出的任何成员都将添加到现有的 IAM 绑定集中。但是,模块中列出的成员完全受模块控制。这意味着,如果您通过模块添加绑定然后将其删除,则模块将正确处理删除角色绑定。
每个子模块在对 GCP 中的 IAM 绑定进行任何更改之前都会对某些变量执行操作。由于在子模块中广泛使用的for_each
(更多信息)的限制,您可以向子模块提供的动态值类型存在一定的限制:
projects
)仅允许 1 个实体。projects
),则配置必须是静态的,这意味着它不能使用任何其他资源的字段来获取实体名称(这包括通过random_id
获取随机生成的哈希值)资源)。authoritative
模式下才可能是动态的。 您可以选择以下资源类型来应用 IAM 绑定:
projects
变量)organizations
变量)folders
变量)service_accounts
变量)subnets
变量)storage_buckets
变量)pubsub_topics
变量)pubsub_subscriptions
变量)kms_key_rings
变量)kms_crypto_keys
变量)secrets
变量)managed_zones
变量)entity_ids
和location
变量)在模块调用上设置指定变量以选择要影响的资源。请记住设置mode
变量并授予足够的权限来管理所选资源。请注意,在资源没有要应用的 IAM 绑定的情况下, bindings
变量接受作为参数传入的空映射{}
。
为了执行子模块,您必须拥有一个具有适当角色的服务帐户来管理适用资源的 IAM。适当的角色根据您的目标资源而有所不同,如下所示:
确保您拥有正确的 Terraform 版本 >= 1.3
确保 $HOME/.terraform.d/plugins/ 上有已编译的插件
有关如何编译和使用它们的更多信息,请参阅每个插件页面。