AWSを少し使うとIDだらけになってしまうので、Nameタグ付けにはこだわりをもって対応してるのだけど、関連リソースを紐付けて管理する良い方法が未だに見出せていない。棚卸や削除漏れ抑止の為に部分一致で検索する為のスクリプトを作ったので、そのパーツを覚書として。
EC2のNameタグで部分一致検索
前回も書いたけど、これは”–filters”をアスタリスク指定で取った方が全然簡単。JMESPathの関数の多くは、valueの型を意識して動くようなので、string以外(この場合はnull)が混ざっていると想定通りの検索ができない。なので、not_nullを使ってNameタグが空で無いもののみを検索対象としている。一応結果の出力は、IDと名前を横並びでテキスト形式で表示させるところも以降全て揃えてみた。
KEYWORD=hogehoge aws ec2 describe-instances \ --query "Reservations[].Instances[?not_null(Tags[?Key==\`Name\`].Value)][]|[?contains(Tags[?Key==\`Name\`].Value|[0],\`\"${KEYWORD}\"\`)].[InstanceId,Tags[?Key==\`Name\`].Value|[0]]" \ --output text
EBSもNameタグで部分一致検索
EBSにはNameタグをつけずに運用しているところも多いのかもしれませんが。
KEYWORD=hogehoge aws ec2 describe-volumes \ --query "Volumes[?not_null(Tags[?Key==\`Name\`].Value)]|[?contains(Tags[?Key==\`Name\`].Value|[0],\`\"${KEYWORD}\"\`)].[VolumeId,Tags[?Key==\`Name\`].Value|[0]]" \ --output text
ENIもNameタグで部分一致検索
ENIは複数アタッチする要件でも無い限りはタグはつけていないかもしれない。何故このような仕様なのかは不明だが、ENIだけはTagではなくてTagSetというKeyにタグ情報が入ることに注意。
KEYWORD=hogehoge aws ec2 describe-network-interfaces \ --query "NetworkInterfaces[?not_null(TagSet[?Key==\`Name\`].Value)]|[?contains(TagSet[?Key==\`Name\`].Value|[0],\`\"${KEYWORD}\"\`)].[NetworkInterfaceId,TagSet[?Key==\`Name\`].Value|[0]]" \ --output text
AMIもNameタグで部分一致検索
AMIとSecurity GroupだけNameタグとは別にNameを持っているのが、管理上ややこしい。一応、AMI名とNameタグには同じものを設定してあるという前提。コマンドはもうほぼ同じだけど、privateなものだけを検索対象にするのでowner指定を忘れないとpublicも検索に行ってしまうので、コマンドがなかなか返ってこない。マニュアルには書いていないが、”–owners self”を”–owner self”でも値を取得することができた。
KEYWORD=hogehoge aws ec2 describe-images --owners self \ --query "Images[?not_null(Tags[?Key==\`Name\`].Value)]|[?contains(Tags[?Key==\`Name\`].Value|[0],\`\"${KEYWORD}\"\`)].[ImageId,Tags[?Key==\`Name\`].Value|[0]]" \ --output text
SnapshotもNameタグで部分一致検索
owner指定が必要なのはAMIと同じだけど、マニュアルではオプションが違う。”–owner-ids self”がマニュアル上の記載だけど、”–owner self”でも”–owner-id self”でも値を取得することができた。手動で実行するときはAMIもSnapshotも”–owner self”で覚えてしまった方が楽か。AMIと関連付けられたSnapshotが、判別しやすくなるともう少し管理が楽になると思うのだけど。
KEYWORD=hogehoge aws ec2 describe-snapshots --owner-ids self \ --query "Snapshots[?not_null(Tags[?Key==\`Name\`].Value)]|[?contains(Tags[?Key==\`Name\`].Value|[0],\`\"${KEYWORD}\"\`)].[SnapshotId,Tags[?Key==\`Name\`].Value|[0]]" \ --output text
Security GroupのInboudルールを少しだけ見やすく表示(おまけ1)
ポートがfrom~toのレンジになるのはどうやっても見づらいけど、出力順序だけ指定すれば読めなくは無い。Source指定が、CIDRだったり、Security Groupだったりするのをどうにかならないかと思っていたら、”||”を使ったらORで表現できたのがポイント。
aws ec2 describe-security-groups \ --query "SecurityGroups[].[GroupName,IpPermissions[].[FromPort,ToPort,IpProtocol,IpRanges[0].CidrIp||UserIdGroupPairs[0].GroupId]]" \ --output text
JMESPathでjoinもできた(おまけ2)
出力の仕方によってKeyの順序が変わるので、上手い制御の仕組みは無いものかと調べていたところ、偶然に上手く行ったので。ポイントはstringしかjoinできないところ。booleanやintegerが混ざっていると失敗するところに注意。
aws ec2 describe-instances \ --query "Reservations[].Instances[].[join(\`;\`,[Placement.AvailabilityZone,State.Name,PrivateIpAddress,VpcId,ImageId,SubnetId,InstanceType])]" \ --output text
JMESPathの関数がかなり使いこなせるようになってきたけど、Keyの出力順序や、”–output text”したときの改行入る入らないの制御等が、いまいち思い通りにならないです。