在亚马逊 S3 上管理和共享 Terraform 的状态文件 terraform.tfstate
2017-06-17:這篇文章已經過時了。文章是針對 Terraform v0.8.x 版本以下。
Terraform v0.9.0在2017年03月发布时,远程配置方面的规范发生了重大变化。
虽然在S3中存放文件的格式并没有改变,但在CLI方面存在着与向后兼容性不符的变化。例如,terraform remote命令已经被移除。
请阅读以下官方文档以获取更详细的信息。
-
- Backends – Terraform by HashiCorp
- Backends: Migrating From 0.8.x and Earlier – Terraform by HashiCorp
因此,下面的文章适用于Terraform v0.8.x及以下版本。
在2015年5月8日发布的Terraform v0.5.0中,新增了在Amazon S3上管理Terraform的状态文件terraform.tfstate的功能,因此我进行了尝试。
S3 远程状态后端由 apparentlymart 提交的拉取请求 #1723 · hashicorp/terraform。
引言:管理和共享 terraform.tfstate 的操作
terraform.tfstate 是用原始的 JSON 格式保存 Terraform 管理的资源状态。Terraform 根据此文件检测和 .tf 文件之间的差异。
这个文件中包含了明文的 RDS 密码等信息。因此,即使是私有仓库,直接进行版本控制还是感到有些抵触。
迄今为止,有三种方式来管理 terraform.tfstate 文件。
-
- Atlas
-
- Consul
- HTTP
目前可能最受欢迎的是Atlas管理。它在tfstate交换中进行验证,并且由HashiCorp提供,因此与Terraform的协作非常完美。目前它是免费的测试版,但不清楚何时会收费。
Consul 管理是以在 Consul 内部的 KVS 中管理 tfstate 的方式进行的。如果组成一个集群,是否可以将其分散保存在多台机器上呢?不过,需要在 Consul 前面准备某种身份验证机制或防火墙,否则 tfstate 有可能会暴露出来,存在安全隐患。
然后,在v0.5.0版本中,S3作为第四力量出现在这里。
试用S3后端
首先,在 S3 中创建一个用于管理的存储桶。您可以选择使用 AWS CLI 进行操作,也可以通过管理控制台进行操作。
$ aws s3 mb s3://dtan4-terraform-state
这是Terraform的配置选项,最低要求。
-
- 管理バックエンドに S3 を使う
-
- bucket は dtan4-terraform-state
tfstate をの保存名 (key) は tf
只需设置(bucket, key为任意指定)即可。
$ cd /path/to/your-terraform-repository
$ terraform remote config -backend=S3 -backend-config="bucket=dtan4-terraform-state" -backend-config="key=tf"
Remote configuration updated
Remote state configured and pulled.
我试试看推送一下。
$ terraform remote push
State successfully pushed!
我们来确认一下。
$ aws s3 ls s3://dtan4-terraform-state
2015-05-07 11:21:56 344 tf
tf = terraform.tfstate 被放置在名为 tf 的位置。
我所感受到的
通常は terraform.tfstate ファイルを共有しなければなりませんでしたが、S3 バックエンドの導入により、それが簡略化されました。例えば、CIやChatOpsを使用してTerraformを操作する際には、以前よりも管理が容易になりました。
terraform.tfstate 管理用バケットを作り、
CI 用にそのバケットに対する R/W 権限のみを持つ IAM を発行して使う
可以实现这样的运用。
Atlas不确定何时收费,但建立自己的Consul又太过夸张且缺乏安全性。解决了这些问题。
转述以下内容为中文,只需提供一种选项:
REF
-
- S3 Remote State Backend by apparentlymart · Pull Request #1723 · hashicorp/terraform
- Command: remote config – Terraform by HashiCorp