terraform - 从 terraform 状态文件中的组中删除 IAM 用户
问题描述
我有一个由 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 中。每次我尝试手动编辑状态文件时,它都出现了可怕的错误。
解决方案
我认为这主要是尝试在 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"]'
推荐阅读
- time-complexity - 我使用位操作,但速度不够快?是因为 Scanner 类吗?
- python - 从句子列表中删除单词
- c# - 如何在单个会话中运行多个测试 - Selenium
- ruby-on-rails - 后端通过前端的 Google oAuth
- javascript - 如何在 React Axios 中从 WEB API 指定 JSON 数据
- python - 有没有什么有效的方法可以在python中按顺序更改文件名来保存变量?
- excel - 在 Excel 中标记特定行
- ios - 在视图控制器中使用选择器和位于父视图控制器中的 objc 公开函数
- vba - 启用 Word 宏的文档损坏问题
- python - 通过添加另一个列表的元素来生成列表的排列