【问题标题】:How to deploy a specific tf file (Terraform)如何部署特定的 tf 文件(Terraform)
【发布时间】:2022-02-01 07:43:41
【问题描述】:

我的 terraform 根目录中有 3 个 .tf 文件:

  • vpc.tf
  • 子网.tf
  • instances.tf
  • 与运行 terraform init 后的 .terraform 目录一起

我只想部署运行类似以下内容的 vpc.tf:

terraform apply vpc.tf #here, vpc.tf is a terraform file

但它不起作用(我收到 Go 错误:“zip:不是有效的 zip 文件”)。 如果我只是运行

terraform apply

它将尝试在所有 3 个 terraform 文件(vpc.tf、subnets.tf 和 instances.tf)中应用所有配置,这不是我想要的。 似乎让它工作的方法是,拥有一个完全不同的文件夹,然后运行类似

terraform apply vpc/ #here, vpc/ is a folder that containers vpc.tf file

有效。这种方法的问题在于,如果我在 vpc/ 文件夹中有 2 个或更多 terraform 文件,我会再次回到第一个问题。 似乎解决方案是在特定文件夹中拥有特定资源,但这似乎并不干净,因为我可以预见,如果基础设施增长,我最终会得到几个包含一些 terraform 文件的文件夹。 所以问题是:

有没有办法“应用 terraform”特定的 terraform 文件,而忽略文件夹中的所有其他文件?我是否缺少有关 terraform 的一些基本知识?

【问题讨论】:

    标签: amazon-web-services terraform devops terraform-provider-aws infrastructure-as-code


    【解决方案1】:

    虽然您可以使用-target(如manojlds' answer 中所述)来定位特定资源以在每次运行时都针对,这意味着当您发生奇怪的事情并需要忽略可能会导致应用于该领域的其他资源。

    Terraform documentation for -target里直接提到了这个:

    此定位功能是在特殊情况下提供的, 例如从错误中恢复或在 Terraform 周围工作 限制。不建议使用 -target 进行例程 操作,因为这可能导致未检测到的配置漂移和 对资源的真实状态如何相关的困惑 配置。

    相反,您应该考虑您愿意作为一个集合更改哪些内容,并将应该作为一个单元更改的.tf Terraform 文件放在同一目录中,并为它们使用相同的状态文件。

    如果您不希望同时更改两件事(例如,设置 VPC 并设置位于该 VPC 中的应用或设置应用的测试和生产版本),那么这些应该是在不同的目录中,使用不同的状态文件。

    这提供了很好的事物分离,最小化爆炸半径,但仍然可以更容易地同时应用相关的大块事物。

    在您的具体情况下,我会质疑您为什么不想同时应用 VPC 和子网,因为这通常只是被视为运行事物所需的基本网络配置的一部分。一起管理这些通常会很有意义,并允许您执行诸如更改 VPC 的名称以及重命名同一 apply 中的子网之类的操作。

    【讨论】:

    • 之所以要分离 VPC 和子网,是因为我们目前已经创建了 1 个 vpc,并且许多微服务位于同一个 vpc 中。这使得内部网络易于设置。如果我要为每个微服务设置一个 vpc,如果我想要内部网络,我还需要设置 vpc 对等互连。我注意到大多数人生病只是将所有内容放在 1 个大 terraform 文件(vpc、子网、secgroups、路由、lb 和自动缩放)上。虽然我发现这种方法对于复制基础设施来说已经足够好了,但它不允许更小的组件的可重用性。
    • 为什么要为每个微服务设置单独的子网?老实说,如果你想要那种网络分离,那么你几乎肯定最好使用 VPC 和对等体的大型网络分离器。我个人并不觉得这很有用,而且每个 AWS 账户每个区域往往有 1 个 VPC。如果事情需要更多的分离,那么他们还会获得一个单独的 AWS 账户(例如测试/生产或拥有完全所有权的不同团队)。
    • ydaetskcoR,子网是一个网络概念,旨在 a) 如果 IP 地址将网络分成更小的范围,b) 通过路由隔离流量。如果在现有网络有空闲地址的情况下希望在机器组之间设置防火墙,那么使用子网划分是非常有意义的。我很好奇您有什么理由建议创建 VPC?
    • @EvanB。我知道子网划分,但您通常不会使用子网划分来隔离网络资源,而不是在 AWS 的公共/私有层上。相反,您将安全组用作有状态防火墙而不是无状态 NACL,后者是您控制子网之间流量的方式,并且以这种方式管理流量要痛苦得多。安全组应该始终是您控制 VPC 内网络流量的首选方式。
    • ydaetskcoR,网络 ACL 可以放置在子网上,这些子网支持安全组提供的所有功能,同时还支持混合使用允许/拒绝逻辑。网络 ACL 怎么样,您觉得“痛苦”吗?如今,AWS 仪表板中的界面几乎相同。
    【解决方案2】:

    另一个不能解决您的确切需求但可行的选项是使用 -target 参数进行资源定位,例如:

    terraform plan -target digitalocean_loadbalancer.public -out run.plan
    

    https://www.terraform.io/docs/commands/plan.html#resource-targeting

    【讨论】:

    • 投反对票,因为它不是问题的答案,而且 terraform 本身不鼓励使用它。
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 2018-05-03
    • 2019-07-30
    • 2017-12-23
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2022-12-18
    相关资源
    最近更新 更多