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