在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的使用流程

    1. 删除本地的tfstate文件

 

    1. 在执行之前,运行terraform remote config,remote pull

 

    1. 执行terraform apply

 

    1. (如果成功)运行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。
如果有更好的方法,请告诉我,我会很感激。

广告
将在 10 秒后关闭
bannerAds