AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

JMESPath で aws-cli JSON をフィルタ

ここ最近参加させていただいてる AWS CLIハンズオンにて良くでてくるのが JMESPath。

JSONを扱うクエリ言語なんですが aws-cli の --query オプションで使える。


f:id:hidehara:20200710180250p:plain


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 は、数値だけじゃなく日付も使えるのですね。


このあたりの関数が日付に便利そう。

  • max_by の場合
    • 第2引数の & の指定で並び替えした最大オブジェクトを返してくれる
  • sort_by の場合
    • 第2引数の & の指定で並び替えした最大オブジェクトを返してくれる
    • かつ [*] を使うことでオブジェクトを スライスのように扱える ([1]だとソートした結果の1番目のみ)
    • かつ. {Key: Key, Size: Size} で出力も調整できる

その他


先人の知恵を聞く・学ぶ機会は大切だなーと思う日々です。

ついつい知った気になるけど、謙虚に学び続けます。


(昨日参加したハンズオンのレポートかけてないから、身代わりにこちらのエントリーを書いてみました。ぼそ)

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