tjinjin's blog

インフラ要素多めの個人メモ

Terraformでssm parameterを管理するのを試す

About

深夜テンションでTerraformでssmを管理できるのかなって思って試しました。

環境

  • terraform v0.10.4
  • terraform-provider-aws_v0.1.4

事前設定

今回はsharedCredential方式を使うので下記のように設定します。(~/.aws/credentialsが利用されます)

# provider.tf
provider aws {
  region  = "ap-northeast-1"
  profile = "default"
}

すでに設定されているパラメータを参照する

dataを使って既存の設定が読み込めるか確認します。

事前にfooというkeyのパラメータを登録しておきました。

# existence_parameter.tf
data "aws_ssm_parameter" "foo" {
  name = "foo"
}

output "foo" {
  value = "${data.aws_ssm_parameter.foo.value}"
}

これを実行すると

$ terraform output
foo = foooooooooooooo

というように値が取れました。value以外にもid/name/typeが取得できます。

$ terraform output
id = foo
name = foo
type = String
value = foooooooooooooo

Terraformでパラメータを登録する

resource "aws_ssm_parameter" "hoge" {
  name  = "hoge"
  type  = "String"
  value = "fuga"
}

resource "aws_ssm_parameter" "piyo" {
  name  = "piyo"
  type  = "StringList"
  value = "aaa,bbb,ccc"
}

output "hoge_value" {
  value = "${aws_ssm_parameter.hoge.value}"
}

output "piyo_value" {
  value = "${aws_ssm_parameter.piyo.value}"
}

上記のようなファイルを作って実行してみます。

$ terraform plan
...
Terraform will perform the following actions:

  + aws_ssm_parameter.hoge
      id:        <computed>
      name:      "hoge"
      overwrite: "false"
      type:      "String"
      value:     <sensitive>

  + aws_ssm_parameter.piyo
      id:        <computed>
      name:      "piyo"
      overwrite: "false"
      type:      "StringList"
      value:     <sensitive>

planの出力見てて気づいたのですが、valueがmaskされてるんですね。CIで実行するときとかに値を出したくない場合に便利そう!

outputにsensitiveというattributeが追加されてたみたいです。(関係あるか見てないですが)

Configuring Outputs - Terraform by HashiCorp

それではapplyします。

$ terraform apply
$ terraform output

hoge_value = fuga
...
piyo_value = aaa,bbb,ccc
...

こんな感じでoutputが出力できるようになりました。もちろんAWSのコンソール上に登録されています。

値をoverwriteする

overwriteというargumentsがあったので試してみます。

すでに存在していた、fooをoverwriteしてしまいます。

resource "aws_ssm_parameter" "foofoo" {
  name      = "foo"
  type      = "String"
  value     = "overwrite"
  overwrite = true
}

output "foofoo_value" {
  value = "${aws_ssm_parameter.foofoo.value}"
}
$ terraform apply
Outputs:

foofoo_value = overwrite
hoge_value = fuga
id = foo
name = foo
piyo_value = aaa,bbb,ccc
type = String
value = foooooooooooooo

outputの様子を見るとterraform的には古いfoooooo…とoverwriteの値を持っている扱いになるようです。AWSのコンソール上で確認するとoverwriteになっています。この状態で再度applyを実行すると

Outputs:

foofoo_value = overwrite
hoge_value = fuga
id = foo
name = foo
piyo_value = aaa,bbb,ccc
type = String
value = overwrite

というように上書きされた値を取るようになりました。実行順の問題かなーと思っています。何度applyしても変更はかからないので完全に上書きされてるようです。

補足SecureString

よりパラメータをセキュアに扱いたい場合、KMSを使ってSecureStringというtypeを指定できるようです。

まとめ

parameter storeへの登録にRubyDSLを使っていましたがこっちの方が簡単なのでうまく置き換える方法を模索していきたいと思います。現状Descriptionの変更ができないですが、PRが出ていますがすぐ解決するかはまだわからなそうです。(あとtagの追加とかもできそう)

参考