我应该为整个应用程序堆栈创建简单的模块或模块吗?

时间:2017-10-06 18:16:32

标签: terraform

我们以下面的模块为例。

https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/1.0.1

如果我的应用程序堆栈需要一些Web服务器,一个ELB和一个mysql服务器,我计划使用模块,这样我就不会重复我的代码了。我的问题是,我应该有简单的模块,例如上面列出的模块(然后一个用于ELB,一个用于MySQL),然后通过在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?

1 个答案:

答案 0 :(得分:2)

一般来说,只有当模块对使用施加一些限制(例如,应用特定于组织的约定)或者它代表了许多行为的资源(从系统的角度来看)时,才应创建模块。作为可以多次实例化的原子单元。

您链接到的注册表模块不是可重用模块的一个很好的示例,因为它只是现有资源的包装器,完全通过输入参数并且不会添加超出resource所表达的值的值直接阻止。该模块更像是一个“入门”示例,可以复制到您的根模块中,而不是您直接调用的内容,因为它不会提高抽象级别,而不会高于它所包含的资源。

有一些不同的方法来处理Terraform配置的结构,但是在建模简单的事情时,我建议从一个带有直接resource块的单个根模块开始。随着时间的推移,您可能会注意到某些资源在相同配置或多个配置中被有效地复制粘贴(稍作调整);在那一点上,我会考虑将这些资源分解为可以多次实例化的模块。

对于应该将多少内容打包到一个模块中,没有明确的答案。就像编程语言中的函数一样,通常最好是在可以组合在一起的小构建块的一侧犯错,而不是大而不灵活的单元。但是,确切的绘制线的位置取决于具体情况。要做出决定,请考虑您期望需要支持的不同排列,以及哪些事物似乎“自然地”属于一起。

如果你第一次没有把它弄好,那么它就不是世界末日了,因为你可以在重构配置时使用terraform state mv命令在模块之间移动资源状态。