読者です 読者をやめる 読者になる 読者になる

ほわいとぼーど

ぷろぐらまのメモ帳

parameter storeから取得して環境変数にセットする

AWSのパラメータストア (Amazon EC2 Systems Manager Parameter Store) を利用して、
取得した値を環境変数にセットするツールをgolangで書いてみました。

ki38sato/env-awsps

とりあえずlinux_386だけReleaseに置いてDLしてる。

使い方

使い方は、適当なinit.shとかで、

$(env-awsps --region ap-northeast-1 --prefix app.web. --rm-prefix)

とすると環境変数にパラメータストアのKEYを元にした変数名でセットされます。
上記のオプション例は、 app.web. をPrefixに持つKEYだけを選択し、
Prefixを除いた部分を環境変数名として使用するというものです。
オプション付けなければパラメータストアの全アイテムが展開されます。
変数名は大文字に変換します。./_に変換します。

example

(set parameter store)
app.web.user = XX1
app.web.password = YY1
app.db.user = XX2
app.db.password = YY2
$ env-awsps
export APP_WEB_USER=XX1
export APP_WEB_PASSWORD=YY1
export APP_DB_USER=XX2
export APP_DB_PASSWORD=YY2

$ env-awsps --prefix app.web.
export APP_WEB_USER=XX1
export APP_WEB_PASSWORD=YY1

$ env-awsps --prefix app.web. --rm-prefix
export USER=XX1
export PASSWORD=YY1

ツール自体はexport文を出力するだけなので$()で反映します。
os.Setenvとかだと親プロセスに設定できないので一時途方にくれましたが、
awscliのaws ecr get-loginを見てアリだなと気づきました。

経緯とか

元々はKMSを利用してS3においた設定ファイルをビルド時に入れたりしていましたが、
暗号化されたファイルを置くので変数入れ替えの管理が難しかったり、
環境依存のコンテナが出来てしまうのでイケてなく、
Credentialだけでもパラメータストアを使いたいと思っていました。

ふと同僚がパラメータストアからJAVA_OPTSにするのを書いてたので、
もうちょい汎用性あるようにしようと思って環境変数を利用しました。
(自分の要件に合わせて。でも後で同僚もオプション追加してたっぽい。)

作る前はentrykitやconfdにパラメータストアとつなぐ機能があればと思って探したけど無くて、
SocialCodeInc/dockerfyにそういうPRが出ている。
ただ、冷静に考えるとtemplate engineに外部依存があるのは微妙かもとは思いました。
plugin的にうまく連携できるならいいけど。
なので環境変数に設定できるのが手軽だなぁと。

一方でこれまでprogrium/entrykitを設定ファイルの入れ替えに使ってたのですが、
デバッグが難しくなったのでgliderlabs/sigilを直接使う形に変えました。
(ENTRYPOINT内での環境変数設定がうまくいってるかよくわからなかったため)
ただ、entrykitはファイルの権限とかもやってくれてたので面倒かも。
ENTRYPOINT以外でも使えるentrykitが望まれる・・・

要望とか

AWS ConsoleでパラメータストアのValueをマスクするモードが欲しいです。

あと、ECS定義内のEnvironmentから直接ssm:**parameter/**的なことができたら、、
と思ったけどローカルのdokcer-composeで困りそうではある。