在Terraform中,将AWS环境的配置进行分离
请参考Terraform在AWS上的简易教程 – Qiita,了解如何搭建AWS环境。
※ 补充说明(2016/10)
这篇文章的内容有点过时,现在的做法可能是在这里写的。有关Terraform中的目录结构最佳实践|Developers.IO
请注意,下面的文章适用于terraform v0.6.0版本。
首先
我认为,在AWS上创建环境时,可能希望使用相同的terraform配置文件来管理多个环境,例如开发环境、预备环境和生产环境。
即使使用相同的设置文件也是如此
-
- instance_typeなどは環境ごとに分けたい
- 起動する台数も環境ごとに変えたい
由于每个环境都有不同的部分,因此这是关于如何处理这些方面的讨论。主要涉及如何撰写tf文件以及如何管理tfstate。
如何编写tf文件
tf文件的划分方法
tf文件是用来编写terraform配置的文件。
在我的情况下,我会根据我想要配置的元素和服务器类型的数量创建tf文件。
-
- vpc.tf
-
- security_group.tf
-
- rds.tf
-
- elb.tf
-
- elasticache.tf
- app-server.tf
好像是这样的感觉。
另外,我还准备了variables.tf和outputs.tf文件。variables.tf文件中包含各种变量,而outputs.tf文件用于记录在terraform执行结束后想要输出的值。
设置每个环境的方式
首先,在 variables.tf 文件中,我们定义一个名为 env 的空变量。
我们将使用这个 env 变量作为表示环境的变量。
variable "env" {
description = "dev or stg or pro"
}
下一步,我们将在variables.tf文件中编写根据环境分隔的配置,例如:
variable "app_instance_type" {
default = {
dev = "m1.small"
stg = "m1.small"
pro = "m3.medium"
}
description = "app server instance type"
}
如果按照这样的感觉创建了 variables.tf,那么接下来会创建其余的 tf 文件。
例如,在app-server.tf文件中,您可以通过以下方式在给服务器命名的部分中使用var.env来表示环境。
tags {
Name = "hoge-app-${var.env}-${count.index}"
}
然后,它的名称将变为 hoge-app-stg-1。
另外,要引用之前在variables.tf中定义的instance_type。
instance_type = "${lookup(var.app_instance_type, var.env)}"
如果要设置所需的环境,可以进行参考。
运行时选项
设定完以上内容后,可以在运行时使用选项进行设置。
terraform apply -var "env=stg"
只需以类似的方式指定环境即可。
其他的方式
或许可以使用运行时的-var-file选项,这样可以切换要引用的var文件,因此不需要将它们汇总到variables.tf文件中,而可以根据环境的不同来分开文件。
就我个人而言,我认为将相同项的设置放在同一个地方会更好地进行管理和展示,所以我选择了上述的做法。
如何管理tfstate文件。
要在像开发、测试、生产这样的环境中进行分隔,需要分离tfstate文件。此外,如果有多个人可能执行terraform,则需要在某处进行同步。
在此,我将介绍如何使用s3进行同步。
tfstate的使用流程
-
- 删除本地的tfstate文件
-
- 在执行之前,运行terraform remote config,remote pull
-
- 执行terraform apply
-
- (如果成功)运行terraform remote push
- 最后运行terraform remote config -disable
按照这样的流程操作,环境设置不会混淆。
如果不进行最后的disable操作,tfstate文件将保存在本地并且无法正确运行。
以下是一個實際命令的例子
rm *.tfstate
terraform remote config \
-state="stg.tfstate" \
-backend=S3 \
-backend-config="bucket=hogedeploy" \
-backend-config="key=stg.tfstate"
terraform remote pull
terraform plan \
-state="stg.tfstate" \
-refresh=true \
-var "env=stg"
terraform remote push
terraform remote config -disable -state="stg.tfstate"
这种感觉。
这就是以上的内容。
我认为可以使用Atlas而不是使用S3。
如果有更好的方法,请告诉我,我会很感激。