【问题标题】:How to upgrade from aws_iam_policy_attachment to aws_iam_role_policy_attachment safely?如何安全地从 aws_iam_policy_attachment 升级到 aws_iam_role_policy_attachment?
【发布时间】:2020-08-12 04:21:39
【问题描述】:

资源aws_iam_policy_attachment有以下警告

警告:aws_iam_policy_attachment 资源会创建 IAM 策略的独占附件。在整个 AWS 账户中,附加单个策略的所有用户/角色/组必须由单个 aws_iam_policy_attachment 资源声明。这意味着即使通过任何其他机制(包括其他 Terraform 资源)具有附加策略的任何用户/角色/组都将被该资源撤销该附加策略。请考虑使用aws_iam_role_policy_attachmentaws_iam_user_policy_attachmentaws_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 资源为模块应用 terraform 时,它会将策略与 30 个不同的 IAM 角色分离,迫使我们通过查找并重新应用我们的 terraform 模块来重新附加它们。

使用不那么危险的资源aws_iam_role_policy_attachment 的安全策略是什么?

我们目前的策略

  1. 将托管 IAM 策略重新创建为内联策略并添加到角色

  2. 使用 AWS 控制台手动删除托管策略

    • 使用此 CLI 命令可能更容易。它只是出现在控制台中。

      aws iam detach-role-policy \
        --role-name my-role-name \
        --policy-arn arn:aws:iam:1234567890:role/logs
      
  3. 从状态中移除坏资源

    • 可能不需要,因为它已在上一步中删除
    • terraform state rm aws_iam_policy_attachment.logs
  4. 目标应用新附件

    • target apply -target aws_iam_role_policy_attachment.logs
  5. 完整性检查

    • terraform plan
  6. 从第一步中删除内联策略

【问题讨论】:

  • 以什么方式令人不安?它只会删除现有的附件,这意味着您的 IAM 权限可能会出现问题(您也可以使用手动方法)。由于这是活泼的事实,您可能还需要申请两次。如果附加在分离之前运行,则 IAM API 可能会在附加上出错(多次附加相同的策略),然后分离将运行,然后向您显示错误。第二次申请将为您解决此问题,因为该策略已被分离。
  • 同意即时重新附加政策确实没有什么令人不安的。由于我认为策略附件没有 AWS ID(出于 API 的目的),因此您也无法进行状态操作来解决此问题。
  • 您实际上可以导入aws_iam_role_policy_attachment resource,如果您不想在重构时对 IAM 权限有一个短暂的提示,或者还有其他原因想要避免潜在的间歇性在重试修复问题之前失败。我个人只是运行应用程序,如果它失败,请双击它,因为这是重构时的一次性迁移。
  • 当我们使用共享托管 IAM 资源为模块应用 terraform 时,它会将策略与 30 个不同的 IAM 角色分离,迫使我们通过查找并重新应用我们的 terraform 模块来重新附加它们。我们已经提出了一系列步骤来在未来安全地执行此操作,但我们希望与我们联系,看看是否可以以更安全的方式完成。你们也遇到过这种情况吗?
  • aws_iam_role_policy_attachment 的输入不是问题。问题是删除了 aws_iam_policy_attachment,这会导致应用 terraform 模块之外的其他角色脱离。

标签: amazon-web-services terraform terraform-provider-aws


【解决方案1】:

关于状态操作的说明

每当我要进行州手术时,我都会将州更改为本地州。做我所有的操作。然后运行一个计划以确保我的更改没有引起差异。然后将状态放回您的propper后端。这篇文章解释了如何做到这一点:

https://medium.com/faun/cleaning-up-a-terraform-state-file-the-right-way-ab509f6e47f3

但至少,至少这样做:terraform state pull > backup.tfstate

为您的任务说明命令

首先,让 terraform 停止跟踪您执行此操作的旧方式 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 配置。您甚至一分钟都不会删除任何角色或权限。如果您提前备份状态,它是安全且可验证的。

【讨论】:

  • 这其实是普鲁米的一个好广告。使用 Pulumi,您可以将状态操作作为资源声明的一部分。您可以执行导入、移动等操作。所有这些都在您定义资源的相同代码中开始。无需 CLI 命令来拯救您。
  • 谢谢。我们最终使用这种方法解决了它。 1)从状态中删除坏资源,2)将 terraform 中的资源从坏资源转换为好资源,以及 3)将现有策略导入状态中的好资源要容易得多。
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2011-09-14
  • 2011-09-06
  • 1970-01-01
  • 2022-01-15
  • 2023-03-10
相关资源
最近更新 更多