EC2インスタンスの情報をCLIとjqをつかってcsvにする。
Posted on
はじめに
【AWS】lambda のめんどくさい棚卸しを楽にするワンライナー の情報が便利だったので EC2インスタンスでの書き方を試してみました。
aws ec2 describe-instances
から取れるEC2インスタンスの情報から
Name,InstanceId,InstanceType の3つが書かれたcsvを作成します。
AWS CLIでは情報の取得からjqに渡すための出力まで、jqはcsvへの変換の役割分担にしています。
この役割分担の理由は,AWS CLI側でjqに合わせてることでjqのコマンドを定型化しておきたいためです。
検証環境
- OS : mac
- jqのバージョン : 1.6
- AWS CLIのバージョン : 2.0.10
取得する情報
実行中のEC2インスタンス[test]の情報取得を取得します。
まず結論
説明が長くなったので結論だけ先に記載します。 次のコマンドを実行してください。
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" "Name=tag:Name,Values=test" \
--query "Reservations[].Instances[].{\"インスタンス名\":Tags[?Key==\`Name\`]|[0].Value, \"インスタンスID\":InstanceId,\"インスタンスタイプ\":InstanceType}" \
| jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv'
csvの形で値がとれます。
"インスタンス名","インスタンスID","インスタンスタイプ"
"test","i-047b9331c231796b3","t3a.nano"
やってみた。
1) 【AWS CLI】取得したいインスタンスを[filters]を使って絞り込む。
aws ec2 describe-instances
のコマンドに対してオプション[filters]を指定して取得したいEC2インスタンスを絞ります。
今回は実行中のEC2インスタンス[test]の情報が欲しいので次のフィルターを指定します。
- instance-state-name -> running
- tag:Name -> test
■コマンド
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" "Name=tag:Name,Values=test"
2) 【AWS CLI】出力項目を[query]を使って絞り込む。
出力項目としては Name,InstanceId,InstanceType の3つが欲しいです。
[query]のオプションを追加して3つの情報だけ出力させるようにします。
ポイントとしては,複数あるtagの中からNameのValueが欲しいので
[Tags[?Key==`Name`].Valueとしているところです。
■コマンド
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" "Name=tag:Name,Values=test" \
--query "Reservations[].Instances[].[Tags[?Key==\`Name\`].Value,InstanceId,InstanceType]"
■出力
[
[
[
"test"
],
"i-047b9331c231796b3",
"t3a.nano"
]
]
3) 【AWS CLI】jqに取り込むために整形する
jqに取りこむためjsonに整形します。
jsonのkeyの部分はcsvのヘッダ行にしたい文字列にします。
また2)の出力ではNameが、配列に入っている状態でした。 このままだと、csvに変換ができないので次のように変更して配列から出してやります。
Tags[?Key==\`Name\`].Value → Tags[?Key==\`Name\`]|[0].Value
作成したコマンドは次のようになります。
■コマンド
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" "Name=tag:Name,Values=test" \
--query "Reservations[].Instances[].{\"インスタンス名\":Tags[?Key==\`Name\`]|[0].Value, \"インスタンスID\":InstanceId,\"インスタンスタイプ\":InstanceType}"
■出力
[
{
"インスタンス名": "test",
"インスタンスID": "i-047b9331c231796b3",
"インスタンスタイプ": "t3a.nano"
}
]
4) 【jq】jqに取り込んでcsvに変換する
3)で準備で取り込む準備ができたので,あとはjqを使ってcsvに変換します。
やることは3)のコマンド末尾に | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv'
を追加するだけです。
■コマンド
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" "Name=tag:Name,Values=test" \
--query "Reservations[].Instances[].{\"インスタンス名\":Tags[?Key==\`Name\`]|[0].Value, \"インスタンスID\":InstanceId,\"インスタンスタイプ\":InstanceType}" \
| jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv'
■出力
"インスタンス名","インスタンスID","インスタンスタイプ"
"test","i-047b9331c231796b3","t3a.nano"
まとめ
今回は、EC2インスタンス一台を取得してcsvにしました。
filters の指定を変更すればいろいろな条件のEC2インスタンスをcsvで一覧にできます。
【AWS】lambda のめんどくさい棚卸しを楽にするワンライナーのとおり csvになっているのでエクセルに貼って台帳にできるので、棚卸しに役立ちそうです。