【发布时间】:2021-05-07 12:47:33
【问题描述】:
网络上的每个 Terraform 指南都提供了一个部分解决方案,几乎总是不是真实的图片。
我明白了,不是每个人都有相同的基础架构需求,但让我担心的是常见场景:
- 多个环境(开发、阶段)
- 远程后端 (s3)
- 一些基本资源(存储桶或 ec2 实例)
在真实示例项目的任何地方都没有介绍。
我正在寻找这一点,与此同时,我研究并得出结论,除了这些需求之外,我还想要:
- 利用模块
- 不使用工作区,而是使用不同的目录-每个环境的方法
- 不使用 terragrunt 包装器
我当前的结构,不使用模块 - 仅根模块:
infra/ ------------------------------ 'terraform init', 'terraform apply' inside here*
main.tf ------------------------ Sets up aws provider, backend, backend bucket, dynamodb table
terraform.tfvars
variables.tf ----------------- Holds few variables such as aws_region, project_name...
我想要的结构文件夹树(用于单个存储桶资源的简单开发和登台模拟)是这样的:
infra/
dev/
s3/
modules.tf ------ References s3 module from local/remote folder with dev inputs
stage/
s3/
modules.tf ------ References s3 module from local/remote folder with stage inputs
但是我之前的根模块中的文件呢?我还是想和以前一样有一个remote backend,刚才我想有两个状态文件(dev.tfstate和stage.tfstate) 在同一个后端存储桶中? backend.tf 文件在每个子目录中的外观如何?它们在哪里?在 s3/ 文件夹或 dev/ 文件夹中?
这有点令人困惑,因为我正在从 根模块 'terraform init' 方法过渡到 特定子目录 'terraform init',我不清楚是否我仍然应该有一个根模块或另一个文件夹,例如名为 global/ 的文件夹,我应该考虑我的先决条件,我应该在项目开始时初始化它,并且从那时起基本上不用管它,因为它创建了 dev/ 和 staging/ 可以引用的存储桶?
还有一个问题:如果我在每个环境中都有s3/ec2/ecr/子目录,我应该在哪里执行'terraform plan'命令?是否遍历所有子目录?
当我得到上面的答案和清晰的图像时,最好通过 DRY 来改进它,但现在,我更重视通过示例提供更实际的解决方案,而不仅仅是理论上的 DRY 解释。谢谢!
【问题讨论】:
-
你确实不想要不同的 modules.tf 用于不同的阶段,这完全不是你的基础设施应该看起来的样子。因为现在你的 stage 不再与你的 dev 相关,你在 dev 上开发的东西不会是在 stage 上测试的东西,也不会是在 prod 上发布的东西。您只有一个目录,您可以在其中放置所有基础设施、所有模块、所有逻辑。这由一些变量参数化,例如ec2 实例大小或日志保留时间等。这些变量将根据 env 具有不同的值,这是唯一改变的东西。
-
然后你需要一个包装器,要么是 terragrunt,要么是一些自定义的基本 shell 脚本。从技术上讲,您不需要有包装器,但另一种方法是必须记住 terraform 命令的许多参数。
-
您的发现似乎与我的建议完全相反。 Terraform 工作空间的存在是为了解决您要解决的确切问题。为什么你认为工作空间不适合你?
-
工作空间如何“反文档化”?我认为您应该真正尝试一下这些功能,以了解它们的工作原理。工作区和模块是两个完全不同的东西,它们可以完美地协同工作。模块应该用于封装一组资源,例如 VPC 模块、EC2 模块等。我强烈建议浏览(甚至使用)Terraform 注册表中的一些开源模块,看看它们是如何工作的registry.terraform.io/browse/modules
-
@MarkB 我很容易理解模块的工作原理。哎呀,我什至在单独的 repo 上创建了一个 s3 模块,我知道如何调用它。我的大部分问题都来自于将东西分成子目录,然后不知道从那时起如何管理状态。只是我很难理解我应该如何以这种子目录的方式配置和管理状态。网络上的很多例子都在谈论你“不应该把所有东西都放在一个地方”,但很少有人谈论你的 terraform 命令应该如何适应它。
标签: amazon-web-services terraform terraform-provider-aws