【问题标题】:Terraform: How to use iam_policy without locking yourself outTerraform:如何在不锁定自己的情况下使用 iam_policy
【发布时间】:2018-07-12 08:58:13
【问题描述】:

我在使用iam_policy 资源类型时遇到了问题,而我却没有被terraform destroy 锁定。这适用于google_storage_bucket_iam_policygoogle_project_iam_policy 等资源类型。

此示例适用于google_storage_bucket_iam_policy 资源。假设我有一个所有者列表和 terraform 使用的服务帐户,以被授予 roles/storage.admin 角色。

resource "google_storage_bucket" "default" {
  name = "default"
  location = "EU"
}

resource "google_storage_bucket_iam_role"  "owners" {
  bucket = "default"
  binding {
    role = "roles/storage.admin"
    members = [
      "${var.owners}",
      "${var.serviceAccount}"
    ]
  }
}

资源创建的顺序是先bucket,后policy。当然,destroy 操作以相反的顺序处理资源 - 首先是策略,然后是存储桶。但是,在策略移除后,服务帐号没有足够的权限来移除存储桶。

也许一种方法可以为所有者使用google_storage_bucket_iam_member 资源,但是这种方法似乎不是很干净,因为它继承了之前在项目中定义的任何内容,这可能会很混乱。

顺便说一句,同样的逻辑适用于项目级别的资源google_project_iam_policy。提前致谢。

【问题讨论】:

    标签: google-cloud-platform terraform google-iam


    【解决方案1】:

    您可以创建一个显式依赖项,它将:

    1. 确保在存储桶之前创建 IAM 角色
    2. 确保在 IAM 角色之前销毁存储桶

    这是您添加了depends_on 的示例:

    resource "google_storage_bucket" "default" {
      name = "default"
      location = "EU"
      depends_on = ["google_storage_bucket_iam_role.owners"]
    }
    
    resource "google_storage_bucket_iam_role"  "owners" {
      bucket = "default"
      binding {
        role = "roles/storage.admin"
        members = [
          "${var.owners}",
          "${var.serviceAccount}"
        ]
      }
    }
    

    【讨论】:

    • 不幸的是,由于循环依赖,这个建议失败了。 Error: Error asking for user input: 1 error(s) occurred: * Cycle: google_storage_bucket_iam_role.owners, google_storage_bucket.default
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多