この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは植木和樹です。AWSでEC2インスタンスをいろいろと起動した後、各EC2の情報を一覧で出力したい機会というのは多々あると思います。私はExcelの設計書に貼り付けたり、リザーブドインスタンスを購入する際の検討材料にするために頻繁に行っています。
本日はJSONパーサーjqを使って、EC2マネージメントコンソールに表示されているインスタンス一覧と同じ内容をCSVファイルに出力するためのaws-cliスニペットをご紹介します。
出力コマンド
下記が出力コマンドです。起動中("running")のインスタンスのみを出力しています。編集しやすいように改行をいれていますので、項目の追加・削除はご自由に。
aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.State.Name == "running") |
[
( .Tags[]| select(.Key == "Name") | .Value ) // "",
.InstanceId,
.InstanceType,
.Placement.AvailabilityZone,
.State.Name,
.Platform,
.EbsOptimized,
.VpcId,
.VirtualizationType,
.PublicDnsName,
.PublicIpAddress,
.PrivateIpAddress,
.KeyName
] | @csv' > ec2.csv
ポイントはNameタグを出力するのに括弧で括った中でselectを使っている点です。括弧でくくることで単純に項目名を指定して出力するだけでなく、関数を使うことができるようになります。またNameタグがついていない場合には//構文で空文字列を出力するようにしています。
あとは出力されたCSVファイル(ec2.csv)をExcelで読み込めば、簡単に加工できます。
まとめ
jqを使い始めてそろそろ1年になりますが、出力項目にカッコを使えることを先日まで知りませんでした。わざわざNameだけ画面みながら書き写してました。
ちなみにaws-cliの--queryというかJMESPathだけだとNameタグが改行の後に出力されてしまい、うまく1インスタンス=1行では出力できませんでした。やり方ご存知な方は教えていただけるとうれしいです。
aws ec2 describe-instances --query 'Reservations[*].Instances[?State.Name == `running`].[
Tags[?Key==`Name`].Value,
InstanceId,
InstanceType,
Placement.AvailabilityZone,
State.Name,
Platform,
EbsOptimized,
VpcId,
VirtualizationType
PublicDnsName,
PublicIpAddress,
PrivateIpAddress,
KeyName
]' --output text