Terraformのbackendを使いこなしたい

Terraformのworkspaceが結構わかってきたので、次はbackendを使いこなしたい。ということで、こちらもいろいろ動きを確認した。Terraformのバージョンは0.10.4。

単純にバックエンドを設定して使う

標準ではローカルにterraform.tfstateが生成されてそれを使うのだけど、S3のような場所に保存したいという場合がある。その時に使うのがバックエンド。backend.tfのようなファイルに定義を書くことで指定できる。

terraform {
  backend "s3" {}
}

実際に有効にするには、terraform initコマンドを使う。ここではbucketやcredentialのパスをオプションで指定しているが、backend.tfに書いてもよい。

 terraform init \
  -backend=true -backend-config="bucket=rtak-tf" \
  -backend-config="key=rtak.tfstate" \
  -backend-config="region=ap-northeast-1" \
  -backend-config="shared_credentials_file=/Users/r_takaishi/.aws/credentials" \
  -backend-config="profile=terraform"

これを実行した後はS3上のrtak.tfstateが更新される。

$ aws --profile=terraform s3 ls rtak-tf
2017-09-19 21:44:52       1358 rtak.tfstate

workspaceを使う場合のバックエンドについて

stagingとproductionのように、workspaceを複数使う場合にバックエンドがどうなるのかを確認する。結論としては、tfstateのパスにworkspace名が含まれるようになり、別々に管理される。

$ terraform workspace list
  default
* staging

これでapplyすると、env:/${workspace_name}/rtak.tfstateというファイルが追加される。

$ aws --profile=terraform s3 ls rtak-tf
                           PRE env:/
2017-09-19 21:46:22       2387 rtak.tfstate

$ aws --profile=terraform s3 ls rtak-tf/env:/
                           PRE staging/

$ aws --profile=terraform s3 ls rtak-tf/env:/staging/
2017-09-19 21:53:28       1560 rtak.tfstate

workspaceにproductionを追加すると以下のように、production用のディレクトリが追加されていることがわかる。

$ aws --profile=terraform s3 ls rtak-tf/
                           PRE env:/
2017-09-19 21:46:22       2387 rtak.tfstate

$ aws --profile=terraform s3 ls rtak-tf/env:/
                           PRE production/
                           PRE staging/

$ aws --profile=terraform s3 ls rtak-tf/env:/production/
2017-09-19 21:54:34       1552 rtak.tfstate

開発時にはlocal backendを使いたい

同じバックエンドでworkspaceによってtfstateが変わるということはわかった。しかし、開発時にゴリゴリ触るような場合、「r_takaishi-dev」 のような、個人用のworkspaceを用意して検証したいことがある。このとき、productionやstagingの場合はS3バックエンドを使い、それ以外ではlocal backendを使えると便利そうだ。そういうことが現時点でできるかどうか調べたが、どうやらできないようだった。需要があるかわからないが、Terraformに機能追加する形で実現したいか調べていきたい。

というところで終わってもつまらないので、若干ハック的になるが一時的にlocal backendを使うテクニックを記載しておく。

まず、backend.tfを編集し、backendをs3からlocalに変更する。

diff --git a/backend.tf b/backend.tf
index 12c0dbe..f966bbb 100644
--- a/backend.tf
+++ b/backend.tf
@@ -1,3 +1,3 @@
 terraform {
-  backend "s3" {}
+  backend "local" {}
 }

そして、terraform initを以下のように実行する。

terraform init -reconfigure
Downloading modules...
Get: file:///Users/r_takaishi/src/github.com/takaishi/terraform_research/modules/sg

Initializing the backend...

Successfully configured the backend "local"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.openstack: version = "~> 0.2"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

backendがlocalになっていることがわかるだろうか。これでplanやapplyを実行すると、S3上のtfstateではなくローカルを見るようになる。使い終わったらdestroyすれば綺麗になるし、S3に不要なファイルも置かれない。

実際にこれをやるのはミスの元になりそうなので、workspace毎にbackendを切り替えられるようになるまではS3 backendを使う方がいい気はする。

Leave a Reply

Your email address will not be published. Required fields are marked *