AWS CLIにはかなり強くなってきたという感じはするけど、json文字列の操作に慣れてきただけのような気もする。ほぼ覚書。

SnapshotsをStartTimeで逆順ソート

ひとまずNameタグで凌いできたけど、過去分のスナップショットを作成日時順に逆順ソート、なんてのをCLIから自動化したいなんて要件は他にもあると思うので。

aws ec2 describe-snapshots --owner-ids self \
  --query 'reverse(sort_by(Snapshots,&StartTime))[].[SnapshotId,StartTime]'

terminatedステータスのインスタンスは除外

これも試行錯誤しているうちに上手く行ったので載せておく。

aws ec2 describe-instances \
  --query 'Reservations[].Instances[?State.Name!=`terminated`].[InstanceId,State.Name]'

 Alarm名を部分一致で検索

はじめEC2を部分一致で検索したかったのだけど、上手く行かなかったので、まずはシンプルな構造のjsonで動作を確認。

KEYWORD=test
aws cloudwatch describe-alarms \
  --query "MetricAlarms[?contains(AlarmName,\`${KEYWORD}\`)].[AlarmName]"

EC2のNameタグで部分一致

試行錯誤して辿り着いた方法がこちら。もちろんfiltersオプションの方が簡単なことはわかっているのだけど、filtersが使えないコマンドも多いので、理解して使えるようになることを目標にやってみた。でもやっぱりよくわからなかった。

KEYWORD=test
aws ec2 describe-instances \
  --query "Reservations[].Instances[?contains(Tags[?Key==\`Name\`].Value|[0],\`${KEYWORD}\`)].[Tags[?Key==\`Name\`].Value][]"

おそらく階層が深いので、”|[0]”とか最後の”[]”なんかがいるのだと思うのだけど、理由はよく理解できていない。こちらを参考にさせていただきました。

未だに原因がわからないまま突然上手く行ったりするのは、ちょっとした書式ミスが原因と思われるのだけど、なかなか解決できないことも多い。やっぱりjqの方が使いやすいのかも。grepとかawkとかで文字列処理してしまいたくなる衝動を抑えつつ。

TOP