私と私の猫の他は誰でも隠し事を持っている

野良プログラマ発、日々のアウトプット

【AWS CLI】ELB ターゲットグループの EC2 インスタンス一覧をワンライナーで表示する

数十程の EC2 インスタンス群をロードバランサ(ALB)経由でサービス提供しているのですが、インスタンス管理で「あれ? このサーバってどのサービスで使ってたんだっけ…」ってなった時に、コンソールからロードバランサのターゲットグループをひとつずつ確認するのは大変なので、AWS CLI, jq, bash を組み合わせて [ <ターゲットグループ名>, <インスタンスID>, <ポート番号> ] という構造のタブ区切りデータを出力してみた、ていう小ネタでつ。(註 : AWS-CLIJSON 形式出力設定になっている前提です)

パイプ連結が結構長いので、ひとつずつ順を追って。まず、アカウント内の ELB ターゲットグループの一覧は describe-target-groups で得られるので、jq でフィルタリングして [ <ターゲットグループ名>, ターゲットグループARN> ] という構造のタブ区切りデータに変換するにはこんな感じ。

aws elbv2 describe-target-groups | \
jq -r '.TargetGroups[] | [.TargetGroupName, .TargetGroupArn] | @tsv'

次に、指定ターゲットグループに紐付いている EC2 インスタンスを列挙するには describe-target-health というターゲット毎のヘルスステータス表示コマンドでできそう。これを jq でフィルタリングして [ <ターゲットID>, <ポート番号> ] という構造のタブ区切りデータに変換するにはこんな感じ。

aws elbv2 describe-target-health --target-group-arn <ターゲットグループARN> | \
jq -r '.TargetHealthDescriptions[] | [.Target.Id, .Target.Port] | @tsv'

以上を組み合わせて、 [ <ターゲットグループ名>, <インスタンスID>, <ポート番号> ] という構造のタブ区切りデータを出力するようにしたのが、これ↓。シェルの箇所は読みやすいように複数行化してます。

aws elbv2 describe-target-groups | \
jq -r '.TargetGroups[] | [.TargetGroupName, .TargetGroupArn] | @tsv' | \
while read NAME ARN
do
  aws elbv2 describe-target-health --target-group-arn $ARN | \
  jq -r '.TargetHealthDescriptions[] | ["'"$NAME"'", .Target.Id, .Target.Port] | @tsv'
done

文字通りのワンライナーなら、こう↓(長っ

aws elbv2 describe-target-groups | jq -r '.TargetGroups[] | [.TargetGroupName, .TargetGroupArn] | @tsv' | while read NAME ARN; do aws elbv2 describe-target-health --target-group-arn $ARN | jq -r '.TargetHealthDescriptions[] | ["'"$NAME"'", .Target.Id, .Target.Port] | @tsv' ; done

最後に grep に繋げてインスタンスIDでフィルタをかければ、どのターゲットグループで使われているのか一発です。イエーイ。