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とかで文字列処理してしまいたくなる衝動を抑えつつ。