资源aws_iam_policy_attachment具有以下警告
警告:
aws_iam_policy_attachment
资源创建IAM策略的独占附件。在整个AWS帐户中,单个策略所附加的所有用户/角色/组都必须由单个aws_iam_policy_attachment
资源声明。这意味着,即使是通过任何其他机制(包括其他Terraform资源(附加了策略的任何用户/角色/组,也会被该资源吊销该附加策略。请考虑aws_iam_role_policy_attachment
、aws_iam_user_policy_attachment
或aws_iam_group_policy_attachment
。这些资源不会强制执行IAM策略的独占附件。
我们从更改了一些代码
resource "aws_iam_policy_attachment" "logs" {
name = "${var.function_name}-logs"
roles = [aws_iam_role.lambda.name]
policy_arn = aws_iam_policy.logs[0].arn
}
至
resource "aws_iam_role_policy_attachment" "logs" {
name = "${var.function_name}-logs"
role = aws_iam_role.lambda.name
policy_arn = aws_iam_policy.logs[0].arn
}
上面的更改很简单,但现在terraform想要删除aws_iam_policy_attachment
资源并添加aws_iam_role_policy_attachment
。以前,当我们使用共享托管IAM资源为模块应用地形时,它将策略从30个不同的IAM角色中分离出来,迫使我们通过查找并重新应用地形模块来重新附加它们。
使用危险性较低的资源aws_iam_role_policy_attachment
的安全策略是什么?
我们目前的策略
将托管IAM策略重新创建为内联策略并添加到角色
使用AWS控制台手动删除托管策略
使用此CLI命令可能更容易。它只是出现在控制台中。
aws iam detach-role-policy --role-name my-role-name --policy-arn arn:aws:iam:1234567890:role/logs
从状态中删除坏资源
- 可能没有必要,因为它已在上一步中删除
terraform state rm aws_iam_policy_attachment.logs
目标应用新的附件
target apply -target aws_iam_role_policy_attachment.logs
卫生检查
terraform plan
从第一步中删除内联策略
关于状态操作的注意事项
每当我要做州手术时,我都会把州变成一个地方州。做我所有的手术。然后运行一个计划,以确保我的更改没有造成任何差异。然后将状态返回到您的propper后端。本文解释了如何做到这一点:
https://medium.com/faun/cleaning-up-a-terraform-state-file-the-right-way-ab509f6e47f3
但至少要做到:terraform state pull > backup.tfstate
任务的状态命令
首先,让地形不再像以前那样追踪terraform state rm aws_iam_policy_attachment.logs
然后只需导入新的关联资源:
terraform import aws_iam_role_policy_attachment.logs lambda-role/arn:aws:iam::xxxxxxxxxxxx:policy/policy-name
每个文档:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment
做一个terraform plan
,你应该看不到任何差异。
结论
这允许您不接触实际的AWS配置。你不会在一分钟内删除任何角色或权限。如果你提前备份你的状态,它是安全和可验证的。