AWSEC2 Systems Manager

AMIMOTO AMIでJSON生成ツール”jo”を使用して、EC2 Systems ManagerのInventory Managerを使ってみる

個人的にトライしていることで、コマンドラインからJSONを生成する必要が出てきたので入れてみました。 参考記事 https://dev.classmethod.jp/tool/jo-installed-amazon-li […]

広告ここから
広告ここまで

個人的にトライしていることで、コマンドラインからJSONを生成する必要が出てきたので入れてみました。

参考記事

https://dev.classmethod.jp/tool/jo-installed-amazon-linux-ec2-and-readed-manual-document/

AMIMOTO AMIの場合のインストールコマンド

AMIMOTO AMIではGitなどのコマンドがインストール済ですので、Amazon Linuxを利用した場合より手順が少なくなります。

[ec2-user@ip-172-30-1-95 jo]$ cd /tmp/
[ec2-user@ip-172-30-1-95 jo]$ git clone git://github.com/jpmens/jo.git
[ec2-user@ip-172-30-1-95 jo]$ cd jo
[ec2-user@ip-172-30-1-95 jo]$ autoreconf -i
configure.ac:19: installing 'build-aux/install-sh'
configure.ac:19: installing 'build-aux/missing'
Makefile.am: installing 'build-aux/depcomp'
[ec2-user@ip-172-30-1-95 jo]$ ./configure
[ec2-user@ip-172-30-1-95 jo]$ make check
[ec2-user@ip-172-30-1-95 jo]$ sudo make install
make[1]: ディレクトリ `/tmp/jo' に入ります
 /bin/mkdir -p '/usr/local/bin'
  /usr/bin/install -c jo '/usr/local/bin'
 /bin/mkdir -p '/usr/local/share/man/man1'
 /usr/bin/install -c -m 644 jo.1 '/usr/local/share/man/man1'
make[1]: ディレクトリ `/tmp/jo' から出ます
[ec2-user@ip-172-30-1-95 jo]$ jo -v
jo 1.0

joでJSONを作ってみる

key=value形式で引数を渡すと簡単にJSON化してくれます。

$ jo test=1234 sample=hoge
{"test":1234,"sample":"hoge"}

コマンド実行結果も代入可能です。

$ jo a=122 hoge=bbb wp=`wp core version --path=/var/www/vhosts/i-0a441b6f3a8dfa5dd/` | jq .
{
  "a": 122,
  "hoge": "bbb",
  "wp": "4.7.2"
}

お行儀の良い書き方ではない気もしますが、-aオプションを組み合わせるとネストしたJSONも作れそうです。

$ jo -a $(jo a=b) $(jo b=c) | jq .
[
  {
    "a": "b"
  },
  {
    "b": "c"
  }
]

頑張ればEC2 Systems ManagerのInventory ManagerへのリクエストJSONなんかも作れます。

$ INSTANCEID=`/usr/bin/curl -s https://169.254.169.254/latest/meta-data/instance-id`
$ ITEMS=$(jo -a \
$(jo CaptureTime=$(date +%Y-%m-%dT%H:%M:%SZ) \
TypeName=Custom:SampleInvent \
Content=$(jo -a $(jo hoge=fuga)) \
SchemaVersion=\"1.0\") | sed 's/\\"//g')
$ aws ssm put-inventory  --instance-id "${INSTANCEID}"  --items "`echo ${ITEMS}`"
$ aws ssm  list-inventory-entries --instance-id ${INSTANCEID} --type-name  Custom:SampleInvent | jq .
{
  "InstanceId": "i-0a441b6f3a8dfa5dd",
  "TypeName": "Custom:SampleInvent",
  "Entries": [
    {
      "hoge": "fuga"
    }
  ],
  "SchemaVersion": "1.0",
  "CaptureTime": "2017-03-06T01:19:56Z"
}

Amazon Linuxだけなのかそういう仕様なのかまでちょっと調べれてないのですが、「1.0」という値を文字列として渡すところでちょっとハマったため、エスケープかけたのちにsedで除去しています。

sedするまえの値はこんな感じです。

$ jo -a $(jo CaptureTime=$(date +%Y-%m-%dT%H:%M:%SZ) TypeName=Custom:SampleInvent Content=$(jo -a $(jo hoge=fuga)) SchemaVersion=\"1.0\") | jq .
[
  {
    "CaptureTime": "2017-03-06T01:15:32Z",
    "TypeName": "Custom:SampleInvent",
    "Content": [
      {
        "hoge": "fuga"
      }
    ],
    "SchemaVersion": "\"1.0\""
  }
]

参考

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts