Written by Tomotaka Miyauchi
9月に入ってもまだまだ暑いし夏だなぁ〜、と思っていたら急に秋になりましたね。
どうも、SaaS Product Divisionの宮内です。
背景
この前、AWS SSM パラメータストアの値を整理しようと思い立ちました。
登録済みのパラメータ一覧が欲しくなりましたが、コンソール上から拾ってくるのはエンジニアらしくないので、AWS CLIを使って一覧をズバッと取得しようと思いました。
ただ、意外とネット上にドンピシャの答えがなかったので、(GitHub Copilot Chatに助けを借りながら)これが最適解かな、と思うコマンドを導き出したので紹介します。
コマンド
最初に結論です。ドンッ
$ export AWS_PROFILE=dev $ aws ssm get-parameters-by-path --with-decryption --path "/" --recursive --query "Parameters[?contains(Name,'develop')].{Name:Name,Value:Value}" | jq -r 'sort_by(.Name) | .[] | [.Name, .Value] | @csv' > parameter_store.csv
このコマンドでは、AWS Systems Managerのパラメータストアにある全てのパラメータのうち、名前に"develop"が含まれるものを抽出しています。 暗号化されているパラメータもデコードして出力します。
また、パラメータの名前を"/[製品名]/[環境名]"のようにサブディレクトリで定義している場合は、以下のコマンドでも取得可能です。
$ export AWS_PROFILE=dev $ aws ssm get-parameters-by-path --with-decryption --path "/[製品名]/[環境名]/" --recursive --query "Parameters[].{Name:Name,Value:Value}" | jq -r 'sort_by(.Name).[] | [.Name, .Value] | @csv' > parameter_store.csv
では、解説していきます。
前提条件
- 実行環境はMacです。
jq
をインストールしておきます。※AWS CLI v2
をインストールしておきます。AWS CLI v2
のプロファイルを設定しておきます。(AWS_PROFILE=dev
の部分を指します)※
jq
はコンソール上でJSON形式を加工するためのパッケージです。Macの場合、Homebrewからもインストールできます。$ brew install jq $ jq -V
解説
大枠のつくり
パイプラインで繋がっているだけで、このコマンドは次のように分解することができます。
AWS CLI
でパラメータストアからパラメータを抽出します。- 抽出したデータを
jq
コマンドで JSON → CSV の形式へ変換します。 - 変換したCSVをファイルに出力します。
具体的には以下の通りです。
$ aws ssm get-parameters-by-path --with-decryption --path "/" --recursive --query "Parameters[?contains(Name,'develop')].{Name:Name,Value:Value}"
で、AWS CLI
を使ってパラメータストアのデータをjson形式で取得し、
$ jq -r 'sort_by(.Name) | .[] | [.Name, .Value] | @csv' [前段パイプラインの出力結果]
で、jq
を使ってCSVの形式に編集し、
$ [出力結果] > parameter_store.csv
で、編集したCSVの内容をファイルに出力します。
1. パラメータの抽出
$ aws ssm get-parameters-by-path --with-decryption --path "/" --recursive --query "Parameters[?contains(Name,'develop')].{Name:Name,Value:Value}" [ { "Name": "/myapp/develop/config", "Value": "some-value" }, { "Name": "/myapp/develop/secret", "Value": "another-value" } ]
aws ssm get-parameters-by-path
パラメータストアからパラメータを取得します。 get-parameters-by-pathは、指定されたパス以下のすべてのパラメータを取得するためのサブコマンドです。
--with-decryption
暗号化されたパラメータの値をデコードして取得します。
--path "/"
取得するパラメータのパスを指定します。サブディレクトリを指定する場合は、こちらに設定します。
--recursive
指定されたパス以下のすべてのパラメータを再帰的に取得します。これにより、サブディレクトリ内のパラメータも含まれます。
--query "Parameters[?contains(Name,'develop')].{Name:Name,Value:Value}"
aws ssm get-parameters-by-path
で取得されるデータは以下のフォーマットです。
そのため、Parameters属性に対してクエリを実行します。{ "Parameters": [ { "Name": "/myapp/develop/config", "Type": "String", "Value": "some-value", "Version": 1, "LastModifiedDate": 1530018761.888, "ARN": "arn:aws:ssm:us-east-1:111222333444:parameter/site/newyork/department/marketing" }, { "Name": "/myapp/develop/secret", "Type": "String", "Value": "another-value", "Version": 1, "LastModifiedDate": 1530018823.429, "ARN": "arn:aws:ssm:us-east-1:111222333444:parameter/site/newyork/department/infotech" }, ... ] }
パラメータ名(.Name)に "develop" が含まれるものをフィルタリングします。フィルタリング結果から名称(.Name)と値(.Value)フィールドを抽出します。
2. CSV形式に変換
$ jq -r 'sort_by(.Name) | .[] | [.Name, .Value] | @csv' [前段パイプラインの出力結果] "/myapp/develop/config","some-value" "/myapp/develop/secret","another-value"
-r
jqの出力を生の文字列(raw output)として表示します。引用符が取り除かれ、CSV形式の出力が得られます。
sort_by(.Name)
JSONデータをNameフィールドに基づいてソートします。
.[]
ソートされた配列の各要素に対して処理を行います。以下のように配列の1要素ごとに以降の処理を行います。
{ "Name": "/myapp/develop/config", "Value": "some-value" } { "Name": "/myapp/develop/secret", "Value": "another-value" }
[.Name, .Value]
各要素のNameとValueフィールドを抽出します。これは、配列の各要素から特定のフィールドを選択するためのフィルタです。
@csv
抽出したフィールドをCSV形式に変換します。
3. ファイルに出力
$ [出力結果] > parameter_store.csv
変換した結果をCSVファイルに出力します。
標準出力をファイルに出力する、お馴染みのコマンドですね。
おまけ
このコマンドをそのまま使うことはないと思います。
実行して「動かない?」場合は、aws ssm get-parameters-by-path 〜
の部分だけを実行して、コンソール上にJSON形式で出力されることを確認しましょう。
モビルスでは、一緒に働く仲間を募集中です!
興味のある方は、ぜひ採用情報のページをご覧ください!