从terraform状态文件中的组中删除IAM用户

从terraform状态文件中的组中删除IAM用户,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我有一个AWS IAM用户和组,由Terraform 12.5管理。我试图将管理从一个Terraform代码库迁移到另一个Terraform代码库,但我不能破坏实际的资源。我可以使用以下方法从状态文件中删除用户: terraform state rm aws_iam_user.testuser 除了从状态文件中删除用户之外,我还想从状态文件中删除用户的组成员身份。但删除“aws_iam_用户”资源后,用户仍保留在“aws_iam_组成员资格”资源中 我尝试了几种方法将用户从“aws_iam_g

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

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

我尝试了几种方法将用户从“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_集团成员”的具体构成尚不清楚。状态文件显示:

{
  "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=="
    }   
  ]
},
“实例”包含“模式版本”、“属性”、“私有”、“依赖”等内容

但是对于AWS IAM用户,我相信“testuser”是“AWS_IAM_用户”的一个实例?也许不是。也许您不能像使用服务器一样拥有AWS IAM用户的多个实例

这会使“测试组成员资格”成为“aws\u iam\u组成员资格”的一个实例吗

这意味着运行以下命令将删除组成员的整个用户列表

terraform state rm aws_iam_group_membership.testgroup-group-membership
因为用户成员集是“aws_iam_group_membership”的一个实例?用户本身不是实例吗

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


由于各种原因,我不想手动编辑状态文件。首先,它使用DynamoDB散列锁存储在S3中。每次我尝试手动编辑状态文件时,都会出现严重错误。

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

这应该起作用:

注意,我正在转义括号和引号。也许有一种“更干净”的单引号方法,但在我有机会尝试之前,我已经用上面的方法解决了我的问题:

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

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