Terraform 文件夹结构

问题描述 投票:0回答:3

我是 terraform 的新手,从 cloudformation 迁移过来,需要文件夹结构方面的帮助。我正在创建一堆 aws 服务,并且文件夹结构如下。这是正确的方法吗?

Development
     |
     services
         |
        lambda_function
          |
          main.tf
          vars.tf
          output.tf
        ecs
          |
          main.tf
          vars.tf
          output.tf

问题是,如果我们导入现有的VPC信息,是不是应该在每一层都导入呢?像一个单独的tf?或 main.tf 的一部分。有许多具有文件夹结构的服务将支持 3000 行的单个 main.tf。谢谢

terraform terraform-provider-aws
3个回答
3
投票

就像 Filip Dupanović 所说,阅读 Hashicorp 网站上的最佳实践指南,但对于文件夹结构,其要点是:

  • 将您的资源放入 main.tf 文件中
  • 将输入放入变量.tf
  • 将输出放入outputs.tf
  • 将您制作的任何私有子模块(私有意味着它们不适合在其他模块中使用)放在
    modules
    子文件夹中。
  • 创建一个示例文件夹,其中包含子文件夹中的示例。
  • 创建一个描述模块用途的自述文件。考虑使用 terraform-docs 来生成其中的一部分。

git 存储库中

mymodule
的示例
terraform-aws-mymodule

terraform-aws-mymodule
 +- examples
 |   +- simple
 |      + main.tf
 +- modules
 |   +- lambda_function
 |       + main.tf
 |       + variables.tf
 |       + outputs.tf
 |   +- ecs
 |       + main.tf
 |       + variables.tf
 |       + outputs.tf
 + main.tf
 + variables.tf
 + outputs.tf
 + README.md

2
投票

我绝对建议阅读模块概述教程和相关资源,因为重用本地模块确实是管理 Terraform 项目配置的核心。

据此,如果您已正确地将每个服务抽象为模块,并且声明这些服务的实例将很好地适合您的 Terraform 项目配置,那么您似乎就走在实现重用的正确轨道上。您还可以查看

terraform-google-modules
GitHub org 存储库,了解如何正确编写各个模块并在其他高阶模块中重用它们。

由于这是一门艺术,并且每个人的需求都根据他们的项目和团队的组织方式而有所不同,因此 GitHub 上托管着许多 Terraform 项目,您可以通过在 HCL 文件中搜索

terraform
块来找到这些项目 。我还想指出,一些项目配置可能会受益于使用 Terraform 工作区,有利于为单独的测试/登台/生产环境等设置单独的项目配置,因此可能有助于涵盖这个概念。


0
投票

这应该是根据2024年最新更新选择的答案。

根据最新的官方地形指南。

https://developer.hashicorp.com/terraform/language/style#repository-struct

  • 我们建议您将实际基础设施配置与模块代码分开存储。

  • 将每个模块存储在单独的存储库中。这使您可以独立对每个模块进行版本控制,并更轻松地在私有 Terraform 注册表中发布您的模块。

  • 在存储库中组织基础架构配置,将逻辑相关的资源组合在一起。例如,需要计算、网络和数据库资源的 Web 应用程序的单个存储库。通过将资源分成组,您可以限制可能受任何操作失败影响的资源数量n。

  • 另一种方法是将所有模块和基础设施配置分组到单个整体存储库或 monorepo 中。例如,monorepo 可以为基础设施堆栈的每个组件定义本地模块的集合,并将它们部署在根模块中。

  • 整体存储库的优点是拥有跟踪每个基础设施更改的单一事实来源。 但是,整体存储库可能会使 CI/CD 自动化变得复杂:由于任何代码更改都会触发在整个存储库上运行的部署,因此您的工作流程必须仅针对修改后的目录。您还会失去精细的访问控制,因为具有存储库访问权限的任何人都可以修改其中的任何文件。

.
├── modules
│   ├── function
│   │   ├── main.tf      # contains aws_iam_role, aws_lambda_function
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── queue
│   │   ├── main.tf      # contains aws_sqs_queue
│   │   ├── outputs.tf
│   │   └── variables.tf
│   └── vpc
│       ├── main.tf      # contains aws_vpc, aws_subnet
│       ├── outputs.tf
│       └── variables.tf
├── main.tf
├── outputs.tf
└── variables.tf

© www.soinside.com 2019 - 2024. All rights reserved.