ということで
前回の続きで、terraform remote
と terraform pull
と terraform push
機能を試してみる。
terraform remote とは
うんちく
The terraform remote command is used to configure use of remote state storage. By default, Terraform persists its state only to a local disk. When remote state storage is enabled, Terraform will automatically fetch the latest state from the remote server when necessary and if any updates are made, the newest state is persisted back to the remote server. In this mode, users do not need to durably store the state using version control or shared storaged.
いつものざっくり意訳すると…
- terraform で構成した状態(
state
)をリモートストレージに維持(保存)を有効にする - terraform のデフォルトはローカルディスクに状態(
state
)を保存する - terraform remote を有効にすると terraform によって構成が更新されるとリモートストレージから最新の状態を取得する
terraform remote
を有効にすると通常は terraform.tfstate
に保存される構成の状態を以下のようなリモートストレージに保存することが出来るようになる。
- Atlas
- Consul
- HTTP
Atlas と Consul はなんとなく雰囲気は伝わってくるけど…HTTP はどんな使い方するのかな…
使い方
リモートストレージとして Atlas を利用する場合には事前にトークンを取得しておいて以下のように実行する。
terraform remote -access-token=${atlas_token} -backend=Atlas -name=${user}/${name}
リモートストレージとして Consul を利用する場合には以下のように実行する。
terraform remote -address=${consul_host}:8500 -backend=Consul -path=inokappa/foo
terraform pull とは
うんちく
The terraform pull refreshes the cached state file from the remote server when remote state storage is enabled. The remote command should be used to enable remote state storage.
マタマタいつものざっくり意訳すると…
- リモートストレージに保存された状態(state)ファイルを取得
- キャッシュされた状態(state)ファイルを更新する
そのまま。
使い方
terraform pull
terraform push とは
うんちく
The terraform push uploads the cached state file to the remote server when remote state storage is enabled. The remote command should be used to enable remote state storage.
リモート状態保存が有効になっているときにテラフォーミングプッシュは、リモートサーバにキャッシュされた状態ファイルをアップロードします。リモートコマンドは、リモート·ステート·ストレージを有効にするために使用されるべきである。
状態(state
)ファイルをリモートストレージに保存する
使い方
terraform push
例えば Consul をリモートストレージとして利用した場合には…
Consul がリモートストレージの場合には…
- Consul の KVS に保存する
- 今回は Docker コンテナ 3 台で構成した Consul クラスタを利用してみる
- 後で Atlas に関しても試してみる
以下、コンテナの状態。
% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 624568c4e69b inokappa/centos-consul:latest "/bin/bash" About an hour ago Up 41 minutes 0.0.0.0:49157->22/tcp, 0.0.0.0:49158->8500/tcp consul03 0018ec0a6c76 inokappa/centos-consul:latest "/bin/bash" About an hour ago Up 41 minutes 0.0.0.0:49155->22/tcp, 0.0.0.0:49156->8500/tcp consul02 29bcaede697c inokappa/centos-consul:latest "/bin/bash" About an hour ago Up 41 minutes 0.0.0.0:49153->22/tcp, 0.0.0.0:49154->8500/tcp consul01
以下、Consul のクラスタ状態。
# consul members Node Address Status Type Build Protocol consul01 172.17.x.2:8301 alive server 0.4.1 2 consul02 172.17.x.3:8301 alive server 0.4.1 2 consul03 172.17.x.4:8301 alive server 0.4.1 2
terraform remote で backend に Consul を指定
terraform remote -address=192.168.59.103:49154 -backend=Consul -path=inokappa/terraform_state
以下のように出力される。
Remote configuration updated
terraform push で保存
terraform apply
していない状態でとりあえず push
してみる。
terraform push
以下のように出力される。
Remote state updated
保存した中身を Consul Node の一台で確認
curl -s localhost:8500/v1/kv/inokappa/terraform_state | python -m json.tool | python -c "exec("import json,sys\nv=json.load(sys.stdin)\nprint v[0].get('Value')")" | base64 -d
以下のように保存されている。
{ "version": 1, "serial": 18, "remote": { "type": "Consul", "config": { "access_token": "", "address": "192.168.59.103:49154", "name": "", "path": "inokappa/terraform_state" } }, "modules": [ { "path": [ "root" ], "outputs": {}, "resources": {} } ] }
terraform pull でローカルのキャッシュを更新
terraform pull
以下のように出力される。
Local and remote state in sync
お疲れ様でした
これまで terraform remote
と terraform pull
と terraform push
を使ったことなくて「何に使うんだろう」って思っていたので用途が明確になってヨカタ。というか、今まで使ってなくて terraform を語っていてごめんなさい。
ということで、この前の記事で CI で apply
した AWS 構成を消したい場合にどうしよって思っていたけど terraform remote
と terraform pull
と terraform push
でやれそうなので記事を更新しておこう。