JMESPath で aws-cli JSON をフィルタ
ここ最近参加させていただいてる AWS CLIハンズオンにて良くでてくるのが JMESPath。
JSONを扱うクエリ言語なんですが aws-cli の --query オプションで使える。
JSONツールの jq が入ってなくても結構なことができるんだって知ったので、むやみにツールの組み合わせよりも、オプション進めたほうがいいなって思うようになってます。
ちなみにJMESPATH公式サイトは、インタラクティブにためせるので、シェルでごちゃごちゃやるよりも便利かも?
aws-cli で JMESPath使う
僕自身の経験が浅いので、初級と上級のみの紹介となります(笑)
初級?:CloudWatch Logs でヒットしたイベントの LogStreamName だけとる
$ aws logs filter-log-events \ --log-group-name ${LOGS_GROUP_NAME} \ --max-items ${LOGS_EVENT_MAX_ITEMS} \ --query 'events[]."logStreamName"
これで grep と連携しなくても、欲しい情報だけに絞り込みができますね。
かつJSONオブジェクトを壊してないのがいいな。
EC2とか死ぬほど情報あるから大変。
上級?:IAM ポリシーの CreateDate(日付)が最新のものをフィルタ
max_by で日付を指定すると、最新の日付が取れるという話を、こちらのハンズオンでシェアいただいた。
$ aws iam list-policy-versions \ --policy-arn ${IAM_POLICY_ARN} \ --query "max_by(Versions[], &CreateDate).VersionId" \ --output text
JmesPath は、数値だけじゃなく日付も使えるのですね。
このあたりの関数が日付に便利そう。
その他
先人の知恵を聞く・学ぶ機会は大切だなーと思う日々です。
ついつい知った気になるけど、謙虚に学び続けます。
(昨日参加したハンズオンのレポートかけてないから、身代わりにこちらのエントリーを書いてみました。ぼそ)
jq.py は どこからやってくる?
Python の jmespath ライブラリに含まれています。
aws-cli 使ってないところでも、ちゃんとナレッジ使えます。
jmespath は aws-cli (正確には botocore) の依存ライブラリです。
なので aws-cli が入っていれば jp.py も存在してるってことですね。
pip だと、次のように確認ができました。 ( show -f オプション知らなかった! )
$ pip3 show -f jmespath
Name: jmespath
Version: 0.10.0
Summary: JSON Matching Expressions
Home-page: https://github.com/jmespath/jmespath.py
...
Files:
../../../bin/__pycache__/jp.cpython-37.pyc
../../../bin/jp.py
jmespath-0.10.0.dist-info/DESCRIPTION.rst
jmespath-0.10.0.dist-info/INSTALLER
...
$ pip3 show botocore
Name: botocore
Version: 1.17.20
Summary: Low-level, data-driven core of boto 3.
Home-page: https://github.com/boto/botocore
Author: Amazon Web Services
...
Requires: docutils, python-dateutil, jmespath, urllib3
Required-by: s3transfer, awscli