Amazon S3 で Terraform の状態管理ファイル terraform.tfstate を管理 / 共有する

Posted on
qiita Terraform

この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。

2017-06-17: この記事はもう古いです。Terraform v0.8.x 以下を対象としています。

2017/03 にリリースされた Terraform v0.9.0 で remote config 周りの仕様が大きく変わりました。 S3 に置くファイル形式は変わってないですが、特に CLI 周りで後方互換性のない変更が入っています。例えば terraform remote コマンドが無くなっています。

詳しくは以下の公式ドキュメントを読んで下さい。

というわけで、以下の記事は Terraform v0.8.x 以下を対象としたものになります。


2015-05-08 にリリースされた Terraform v0.5.0 にて Terraform の状態管理ファイルである terraform.tfstate を Amazon S3 で管理する機能が追加されたので、試してみました。

S3 Remote State Backend by apparentlymart · Pull Request #1723 · hashicorp/terraform

前置き: terraform.tfstate の管理とか共有

terraform.tfstate は、Terraform が管理しているリソースの状態を生の JSON で保存しているものです。Terraform はこのファイルを元に、記述された .tf との差分を検出しているのです。 このファイル、RDS のパスワードとかも__平文__で入っています。なので、いくら private リポジトリでもそのままバージョン管理するのは抵抗がありました。

terraform.tfstate の管理方法はこれまで3種類ありました。

現在おそらくポピュラーなのは Atlas 管理です。tfstate のやりとりにおいて認証がかけられており、また HashiCorp 謹製であるので Terraform との連携もバッチリです。現在はベータで無料ですが、いつ有料化されるかわかりません。

Consul 管理は、Consul 内の KVS で tfstate を管理する形になります。クラスタを組んでおけば複数マシンに分散させて保存とかできるのでしょうか。ただ、Consul フロントエンドの前に何らかの認証機構やファイアウォールを用意しないと、tfstate が丸見えになってしまう危険性があります。

そして、v0.5.0 でここに第四勢力として S3 が登場したのです。

S3 backend を試す

まず S3 に管理用の bucket を作ります。今回は AWS CLI でやってますが Management Console からでも何でもいいです。

$ 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.

では push してみます

$ terraform remote push
State successfully pushed!

確認してみましょう

$ aws s3 ls s3://dtan4-terraform-state
2015-05-07 11:21:56        344 tf

terraform.tfstate が tf という名前で配置されました :tada:

所感

S3 backend 導入により、これまで悩みの種だった terraform.tfstate の管理が幾分やりやすくなったと思います。 例えば CI や ChatOps で Terraform の操作を行う場合、

  • terraform.tfstate 管理用バケットを作り、
  • CI 用にそのバケットに対する R/W 権限のみを持つ IAM を発行して使う

といった運用が可能となります。 Atlas はいつ有料化するかわからない、かといって自前で Consul 建てるのも大げさだしセキュリティがなあ…といった悩みがうまく解消された感じです。

REF