ようへいの日々精進XP

よかろうもん

terraform 独りハンズオン(2)〜 remote / pull / push 機能を試す 〜

ということで

前回の続きで、terraform remoteterraform pullterraform push 機能を試してみる。

terraform remote とは

うんちく

www.terraform.io

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 とは

うんちく

www.terraform.io

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 とは

うんちく

www.terraform.io

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 remoteterraform pullterraform push を使ったことなくて「何に使うんだろう」って思っていたので用途が明確になってヨカタ。というか、今まで使ってなくて terraform を語っていてごめんなさい。

ということで、この前の記事で CI で apply した AWS 構成を消したい場合にどうしよって思っていたけど terraform remoteterraform pullterraform push でやれそうなので記事を更新しておこう。