Terraform 我应该创建简单模块还是为整个应用程序堆栈创建模块?
让我们以下面的模块为例 如果我的应用程序堆栈需要几个web服务器、一个ELB和一个mysql服务器,我计划使用模块,这样我就不会重复我的代码。我的问题是,我是否应该拥有上面列出的简单模块(然后一个用于ELB,一个用于MySQL),然后在Terraform 我应该创建简单模块还是为整个应用程序堆栈创建模块?,terraform,Terraform,让我们以下面的模块为例 如果我的应用程序堆栈需要几个web服务器、一个ELB和一个mysql服务器,我计划使用模块,这样我就不会重复我的代码。我的问题是,我是否应该拥有上面列出的简单模块(然后一个用于ELB,一个用于MySQL),然后在env dev/app/apollo/main.tf中将其组合成一个堆栈 示例结构: ├── env-dev │ └── app │ └── apollo │ └── main.tf ├── env-test ├── glob
env dev/app/apollo/main.tf
中将其组合成一个堆栈
示例结构:
├── env-dev
│ └── app
│ └── apollo
│ └── main.tf
├── env-test
├── global
├── mgmt
└── modules
├── ec2-elb
└── ec2-instance
├── LICENSE
├── main.tf
我的
env-dev/app/apollo/main.tf
是源于两个模块来构建应用程序,还是我应该创建一个模块来与ELB一起构建实例?一般来说,只有当模块对使用施加了一些限制(例如,应用特定于组织的约定)时,才应该创建一个模块或者,如果它表示许多资源(从系统的角度来看)作为一个原子单元,可以多次实例化
您链接到的注册表模块不是可重用模块的好例子,因为它只是现有资源的包装器,准确地传递输入参数,不添加超出资源
块直接表达的值。该模块更像是一个“入门”示例,可以复制到根模块中,而不是直接调用,因为它不会将抽象级别提升到它所包装的资源之上
有几种不同的方法来接近地形配置的结构,但是在建模简单的事情时,我建议从一个根模块开始,其中包含直接资源块。随着时间的推移,您可能会注意到某些资源正在同一配置内或跨多个配置进行有效的复制粘贴(只需稍作调整);在这一点上,我会考虑将这些资源分解成可以被实例化多次的模块。
对于一个模块应该包含多少内容,目前还没有明确的答案。就像使用编程语言中的函数一样,通常最好选择可以组合在一起的小型构建块,而不是大型且不灵活的单元。然而,究竟在哪里划界取决于具体情况。要做出决定,请考虑您希望支持的不同排列,以及哪些事物似乎“自然”地属于一起
如果您第一次没有做对,那么这不是世界末日,因为您可以在重构配置时使用terraformstate mv
命令在模块之间移动资源状态