【问题标题】:Remove IAM user from group in terraform state file从 terraform 状态文件中的组中删除 IAM 用户
【发布时间】:2019-12-16 18:03:53
【问题描述】:

我有一个由 Terraform 12.5 管理的 AWS IAM 用户和组。我正在尝试将管理从一个 Terraform 代码库迁移到另一个,但我无法破坏实际资源。我可以使用以下命令从状态文件中删除用户:

terraform state rm aws_iam_user.testuser

除了从状态文件中删除用户之外,我还想从状态文件中删除用户的组成员身份。但删除“aws_iam_user”资源后,用户仍保留在“aws_iam_group_membership”资源中。

我已经尝试了几种方法来从“aws_iam_group_membership”资源中删除用户,但只会出现语法错误。

我怀疑我使用的资源实例地址是错误的,或者使用状态 rm 是不可能的。

我尝试以下方法:

terraform state rm aws_iam_group_membership.testgroup-group-membership.testuser

Error: Invalid address

  on  line 1:
  (source code not available)

Resource instance key must be given in square brackets.

or

terraform state rm aws_iam_group_membership.testgroup-group-membership[testuser]

Error: Index value required

  on  line 1:
  (source code not available)

Index brackets must contain either a literal number or a literal string.

or

terraform state rm aws_iam_group_membership.testgroup-group-membership[0]
No matching resource instances found.

尚不清楚究竟是什么构成了“aws_iam_group_membership”的实例。状态文件显示:

{
  "mode": "managed",
  "type": "aws_iam_group_membership",
  "name": "testgroup-group-membership",
  "provider": "provider.aws",
  "instances":
    {   
      "schema_version": 0,
      "attributes": {
        "group": "testgroup",
        "id": "testgroup-group-membership",
        "name": "testgroup-group-membership",
        "users": [
          "testuser",
          "testuser2",
          "testuser3"
        ]   
      },  
      "private": "foobar==",
      "depends_on": [
        "aws_iam_group.testgroup",
        "aws_iam_user.testuser",
        "aws_iam_user.testuser2",
        "aws_iam_user.testuser3"
      ]   
    }   
  ]
}

这类似于用户状态文件中的内容:

{
  "mode": "managed",
  "type": "aws_iam_user",
  "name": "testuser",
  "provider": "provider.aws",
  "instances": [
    {   
      "schema_version": 0,
      "attributes": {
        "arn": "arn:aws:iam::1111111111111:user/testuser",
        "force_destroy": null,
        "id": "testuser",
        "name": "testuser",
        "path": "/",
        "permissions_boundary": null,
        "tags": {}, 
        "unique_id": "AIDAAAAAAAAAAAAAAAAAZS"
      },  
      "private": "foobar=="
    }   
  ]
},

“instances”包含“schema_version”、“attributes”、“private”、“depends_on”等内容。

但对于 AWS IAM 用户,我认为“testuser”是“aws_iam_user”的一个实例?或者可能不是。也许您不能像使用服务器那样拥有多个 AWS IAM 用户实例?

这会使“testgroup-group-membership”成为“aws_iam_group_membership”的一个实例?

这是否意味着运行以下命令会删除作为组成员的整个用户列表?

terraform state rm aws_iam_group_membership.testgroup-group-membership

因为用户成员集是“aws_iam_group_membership”的一个实例?用户本身不是实例?

问题是,如何在 terraform 状态文件中从组中删除用户,同时保持实际资源不变?

出于各种原因,我不想手动编辑状态文件。一方面,它使用 DynamoDB 哈希锁存储在 S3 中。每次我尝试手动编辑状态文件时,都会出错。

【问题讨论】:

  • attributes中的数据是资源所代表的远程对象的表示,一般不需要直接编辑。如果您已经从 Terraform 之外的组中删除了用户,那么 terraform plan 应该会在其刷新步骤中自动检测到该用户。如果您尚未将其从 Terraform 之外的组中删除,则可以将其从配置中删除并运行 terraform apply 以使 Terraform 执行此操作。编辑 attributes 以不同意远程对象是无效的,因为下一次 Terraform 刷新只会重置它。
  • 我一直遵循的过程是从状态文件A中删除资源,注释在源树A中定义它的代码。然后将代码移动到源树B并将资源导入状态文件B在 --config= 参数中指定源树 B。主要限制是我不想接触实际资源。只想将其管理从源代码树/状态文件移至另一个。所以我不能通过改变实际资源来触发 terraform 做任何事情。

标签: terraform terraform-provider-aws


【解决方案1】:

我认为这主要是尝试在 Bash 或其他 shell 中执行此操作的问题,其中引号和括号是特殊字符需要转义,可能与 Terraform CLI 解析参数的方式相结合。

应该工作:

terraform state rm aws_iam_group_membership.testgroup-group-membership\[\"testuser\"\]

请注意,我正在转义括号和引号。使用单引号可能有一种“更清洁”的方式,但我在有机会尝试之前解决了上述问题:

terraform state rm 'aws_iam_group_membership.testgroup-group-membership["testuser"]'

【讨论】:

    【解决方案2】:

    我今天在 Windows10 客户端遇到了同样的问题:

    • 只转义引号对我来说效果很好
    terraform state rm aws_iam_group_membership.testgroup-group-membership[\"testuser\"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-01
      • 2018-10-11
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2021-08-15
      相关资源
      最近更新 更多