我是 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。谢谢
就像 Filip Dupanović 所说,阅读 Hashicorp 网站上的最佳实践指南,但对于文件夹结构,其要点是:
modules
子文件夹中。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
我绝对建议阅读模块概述教程和相关资源,因为重用本地模块确实是管理 Terraform 项目配置的核心。
据此,如果您已正确地将每个服务抽象为模块,并且声明这些服务的实例将很好地适合您的 Terraform 项目配置,那么您似乎就走在实现重用的正确轨道上。您还可以查看
terraform-google-modules
GitHub org 存储库,了解如何正确编写各个模块并在其他高阶模块中重用它们。
由于这是一门艺术,并且每个人的需求都根据他们的项目和团队的组织方式而有所不同,因此 GitHub 上托管着许多 Terraform 项目,您可以通过在 HCL 文件中搜索
terraform
块来找到这些项目 。我还想指出,一些项目配置可能会受益于使用 Terraform 工作区,有利于为单独的测试/登台/生产环境等设置单独的项目配置,因此可能有助于涵盖这个概念。
这应该是根据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