【问题标题】:How to destroy rules in a Terraform managed default security group?如何销毁 Terraform 托管的默认安全组中的规则?
【发布时间】:2019-02-05 15:06:01
【问题描述】:

当 Terraform 采用 VPC 中默认安全组的所有权时,它将删除所有当前规则并添加在 default_security_group 资源中指定的任何规则。但是,当您“销毁”资源时,它不会删除它添加到默认安全组的规则。我知道它不会删除默认安全组,但我希望它会删除它添加的规则。有没有直接删除这些规则的方法?

我目前的解决方法是有一个单独的模块,其中包含一个空的default_security_group 资源。我在运行销毁之前构建了它,并且该构建删除了规则。有没有更好的办法?

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    “采用所有权”是什么意思?您是否将默认安全组导入您的状态文件?

    如果是,也许您应该使用data source 而不是资源来处理默认安全组:

    data "aws_security_group" "default" {
      name = "default"
    }
    

    您可以使用"${data.aws_security_group.default.vpc_id}" 获取默认安全组的ID。现在只需添加规则,可以在不触及安全组本身的情况下将其销毁。

    【讨论】:

    • 感谢您的回复!查看aws_default_security_group:terraform.io/docs/providers/aws/r/default_security_group.html 上的文档。相关句子是“aws_default_security_group 的行为与普通资源不同,因为 Terraform 不会创建此资源,而是将其“采用”到管理中。”此外,您不能将外部 aws_security_group_rule 资源与 aws_default_security_group 一起使用,这将阻止您描述的解决方案正常工作(假设我理解您所说的“只需添加规则”)。
    • 现在还不知道该资源...这似乎是预期的行为,它不会删除规则 (terraform.io/docs/providers/aws/r/…) 使用数据源时(请参阅我的回答),您应该能够在您的 terraform 配置中创建和删除规则
    • 除非我遗漏了什么,否则这不是我问题的答案,因为它涉及不使用 aws_default_security_group 资源本身。但这似乎是对相关问题“如何在不使用aws_default_security_group 的情况下向默认安全组添加和删除规则”的一个很好的答案,我认为这对其他人有用。
    • 如果您真的必须使用aws_default_security_group,您可以添加provisionerlocal-exec 并使用AWS CLI/API 执行一些“魔术”来获取内联规则并删除它们, 当资源被销毁时。
    • 是的,这也是一个很好的解决方法。实际上,我选择了一个使用条件变量和空aws_default_security_group 的解决方法。在销毁之前,我以该资源为目标并设置条件变量,以便构建空资源。这将删除规则。这样我就留在了 Terraform 中(我试图避免使用 CLI 或 Boto 或类似的),它避免了对单独模块的需要。
    【解决方案2】:

    文档目前没有说明这一点,但您可以使用以下方法导入默认安全组:

    terraform import aws_default_security_group.california sg-<id>
    

    我在将资源从一个解决方案转移到另一个解决方案时发现了这一点,忘记使用terraform state rm 从初始代码库中删除资源:)

    然后您应该能够像往常一样编辑资源。

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 2015-11-13
      • 2019-07-28
      • 2020-09-29
      • 2020-10-06
      • 1970-01-01
      • 2021-08-10
      • 2022-06-30
      相关资源
      最近更新 更多