Get value from Vault with Terraform

この前terraformのvaultプロバイダを使おうとした所うまくいきませんでした。

そこで、もう少し単純なコードで書き直して検証してみたところ、うまくvaultから値を取ってこれたのでその方法をメモしておきます。

準備

MacでVaultを起動しておきます。検証なのでdevモードで起動します。起動したら、出力に出るRoot Tokenの値をメモしておきます。

brew install vault

vault server -dev

環境変数に必要な値をセットしておきます。

export VAULT_ADDR="http://127.0.0.1:8200"
export VAULT_TOKEN="Root Tokenの値"

main.tfを書く

こんなmain.tfを書きました。

  • vaultにsecret/doというpathを作成し、token=XXXXXXXXというkey/valueをセットする
  • データソースにvaultを指定し、作成したpathからfetchできるようにする
  • outputで値をfetchして表示する
resource "vault_generic_secret" "do" {
  path = "secret/do"

  data_json = <<EOT
  {
    "token": "XXXXXXXX"
  }
  EOT
}

data "vault_generic_secret" "do" {
  path = "secret/do"
}

output "do_token" {
  value = "${data.vault_generic_secret.do.data["token"]}"
}

うまくいった

Yay!

$ terraform apply -input=false
vault_generic_secret.do: Refreshing state... (ID: secret/do)
data.vault_generic_secret.do: Refreshing state...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

do_token = XXXXXXXX

よくわからなかったところ

まずresource "vault_generic_secret" "do"の項目以外をコメントアウトして実行、その次に他の行をコメントアウトして実行、というようにしないとクラッシュしてしまった。vaultに既に値がある状態じゃないとうまく実行できない感じ。

前回試したときとさほど大差ないmain.tfの内容だと思うけどできたりできなかったりする理由は何なんだろう...。

感想

一応terraformのソースコードを見ながら試していったんだけど、うまく参考に出来なかった。

経験とか勘で動くようにごにょごにょするのはあまり得るものが無いと思うので(それによくわからないというもやもやが残るし...)もっとコードを読み込んでいきたい。

参考