MOBILUS TECH BLOG

モビルスのプロダクト開発を支えるメンバーが 日々の開発現場の情報を発信します。

AWSのSSM パラメータストアを一発でCSV出力する方法

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
    

解説

大枠のつくり

パイプラインで繋がっているだけで、このコマンドは次のように分解することができます。

  1. AWS CLIでパラメータストアからパラメータを抽出します。
  2. 抽出したデータをjqコマンドで JSON → CSV の形式へ変換します。
  3. 変換した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形式で出力されることを確認しましょう。

モビルスでは、一緒に働く仲間を募集中です!
興味のある方は、ぜひ採用情報のページをご覧ください!

  翻译: