AWSのパラメータストアから環境変数にセットしたり任意の形で出力したり
AWSのパラメータストア って便利ですね。環境ごと変数やCredential情報を設定しておいて、使う前に取りだせばよいし。 Vault みたいに使えますし。
とはいえ、Dockerのような環境変数やパラメータに渡したいときに、毎回AWS SDK 使うのも面倒くさいので、ワンライナーでさくっと取れるコマンドラインツールを作りました。
使い方など
Parameter Storeに以下のキーが設定されているとして
/path/to/key/EXAMPLE1 = VALUE1 /path/to/key/EXAMPLE2 = VALUE2
以下のコマンドを実行すると
$(aws-ps load --path /path/to/key --region ap-northeast-1)
以下の環境変数がexportされます
export EXAMPLE1=VALUE export EXAMPLE2=VALUE
指定したpathで ssm.getParametersByPath
が呼ばれpathは取り除かれて出力されます。
内部的には export A=B;export C=D
を出力しているだけなので、 $()
で囲ってしまえば実行されるという単純な仕掛けです。
テンプレートとか
今のプロジェクトでは、 Play Framework(Scala) を結構使っているのでJavaプロセスに起動オプションを渡したい時も結構あります。そこで、テンプレートを渡せるようにして、任意の出力を得ることが出来るようにしてみました。
↑と設定されている内容は同じとして、以下のコマンドを実行すると
aws-ps load --path /path/to/key --region ap-northeast-1 \ --template "-D{{ .Name }}={{ .Value }}" --delimiter " "
以下の出力が得られます。
-DEXAMPLE1=VALUE -DEXAMPLE2=VALUE
テンプレートは、取得できたパラメータごとに展開され Name
にパラメータ名、 Value
にパラメータの値が入っています。delimiter
はパラメータごとの区切り文字です。go-templateを利用しているだけですので、何かやろうと思えば難しいことが出来る気がします。
Prefixとか
--path
オプションは、2017/06のアップデートで追加された階層に対応するものです。
Amazon EC2 Systems Manager のパラメータストアで階層、タグ付け、および通知を追加サポート
それ以前に作ったものや、パラメータ名でグルーピングをしたいときのために --prefix
オプションも用意しています。
例えば、以下のパラメータがあるとして
a.b.c.d = foo a.b.c.e = bar a.f.g.h = baz
以下のコマンドを実行すると
$(aws-ps load --prefix a.b.c. --delimiter "\n")
こうなります。
export d=foo export e=bar
pathと違い、prefix
が先頭から一致するかどうかしか見ていませんので、最後の.
を忘れると .d=foo
のようになってしまうことに注意してください。
未実装など
- テストがないです。
- タグで取れるオプション
--tags
も実装したほうが良い気がする。
おまけ
Githubリポジトリを parameter store
とかで検索すると他にも似たようなツール作っている人はちらほら見かけましたが、golang使って作ってみたかったのと、環境変数だけじゃなくて、コマンドの引数にも渡したかったけど、そういうのがなかったので作ってみました。
3時間くらいかかったけど、実際のコード書くより周り(GOPATHとかcobraの使い方とかIntelliJとかTravisCIとか)の方にかかった時間のほうが長い気がする。
(ていうか、ECSの環境変数にParameterStoreのキー名を直接設定する機能が欲しい)