我对terraform模块有点困惑。我使用模块了解代码可重用性。您在目录中创建的任何代码本质上都是一个模块。我正在努力的是你是如何模块化的?每个模块是否应包含各种资源信息:
/modules/security_groups/ssh/main.tf <-- only has one aws_security_group resource
/modules/security_groups/http-80/main.tf <-- only has one aws_security_group resource
/modules/security_groups/http-443/main.tf <-- only has one aws_security_group resource
/modules/launch_configuration/main.tf <-- only has one aws_launch_configuration resource
/modules/auto_scaling_group/main.tf <-- only has one auto_scaling_group resource
/modules/instances/main.tf <-- only has one instance resource
....
/stage/vpc/main.tf
/stage/services/frontend-app/salon.tf <-- source multiple /modules/... and vpc
/prod/vpc/main.tf
/prod/services/frontend-app/salon.tf <-- source multiple /modules/... and vpc
或者每个模块都应包含资源信息的组合。例如,采用此目录结构。
/modules/salon-app/main.tf <-- has more than one resource aws_security_group, auto_scaling_group, launch_configuration_group ...etc
....
/stage/vpc/main.tf
/stage/services/frontend-app/salon.tf <-- source /modules/salon-app/.. only once
/prod/vpc/main.tf
/prod/services/frontend-app/salon.tf <-- source /modules/salon-app/.. only once
基本上,您是将aws资源捆绑到一个大文件中,还是将每个资源拆分为单个文件,然后将它们全部分开?
答案 0 :(得分:0)
所以,我对这个问题的看法是这样的。对于某些事情,您创建了您想要将资源组合在一起,例如创建ECS集群。以下是如何执行此操作的示例: https://github.com/charles-d-burton/tf_ecs_cluster
在该示例中,它将创建一个群集,设置自动缩放,转发通知,所有这些。然后配置输出以输出与其他资源相关的信息。在该示例中,我输出了群集名称和arn。对于我的用例,我使用名为terragrunt的工具保存S3中的状态。然后我在其他模块/资源中引用该状态。基本上,细分如下: VPC - 模块 集群 - 模块 负载平衡器 - 模块 应用程序 - 引用这些模块的资源。
构造你的terraform时要记住的事情是要记住你想要限制你在错误运行中可以做的爆炸半径伤害。这就是为什么模块化基础设施并引用其远程状态而不是采用整体方法来运行它的原因。通过引用远程状态,您基本上可以在组件之间创建API协定。如果他们不需要检查和重新检查每个基础设施,它也可以使你的terraform运行得更快。如果尚未创建依赖资源,则运行也会更快失败,因为他们需要引用的数据无法获得。