私と私の猫の他は誰でも隠し事を持っている

野良プログラマ発、日々のアウトプット

【AWS SSM】パラメータストアから環境変数ファイルを生成する

AWS Systems Manager のパラメータストアで管理している定数から、アプリケーションプログラムで使う .env の類をシェルスクリプティングで生成する、という小ネタでつ。

本件では、下記を前提とします。

  • パラメータストアでのパラメータは全て文字列型。
  • 開発系・本番系などでパラメータを振り分けたいので、パラメータ名には、名前空間として /my-prod/dev/DATABASE_HOST のように製品名や系統を埋め込んだプリフィックスを付与している。
  • AWS-CLIJSON 出力するように設定。
  • JSON 操作に jq を使用。
  • シェルは bash で。

さて、パラメータを取り出して環境変数の記述に変換する際には、変数名からプリフィックスを取り除いたりしたいので、プリフィックスを記憶しておきます。

export PREFIX=/my-prod/dev/

AWS-CLI でプレフィクスを指定してパラメータを全て取り出すにはこんな感じ。

aws ssm get-parameters-by-path --path "${PREFIX}" > parameters.json

出力された JSON データから、パラメータ名と値を取り出して(名前からプリフィックスは除去)いったんタブ切りに変換します。

cat parameters.json | jq -r '.Parameters[] | [.Name['${#PREFIX}':], .Value] | @tsv' > parameters.tsv

最後にこれを「変数名=値」の書式に変換。

cat parameters.tsv | awk '{ print $1 "=" $2 }'

以上をパイプで繋いで完成です。AWS-CLI でのページングや「変数名=値」でのエスケープ等は端折ってありますが、適宜よろしくやって下さいw

aws ssm get-parameters-by-path --path "${PREFIX}" \
  | jq -r '.Parameters[] | [.Name['${#PREFIX}':], .Value] | @tsv' \
  | awk '{ print $1 "=" $2 }'