[小ネタ]AWS CLIでAWS Systems Manager(SSM) インベントリを使用して、EC2にインストールされている特定のアプリケーションのバージョン一覧をまとめて取得する

2023.01.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS事業本部 梶原@福岡オフィスです。

「ちょっと急ぎでAWS環境のEC2にインストールされてるアプリケーションのバージョンわかりますか?」
(XX台くらいあるぞマジカ)
という時に慌てふためかない為のコマンドです。

前提条件

EC2インスタンスがSSM管理下(マネージドインスタンス)にあることが前提条件となります
管理台数が多いと、入れててよかったSSMということがまま、ありますのでこの機会に導入をご検討ください

マネージドインスタンスにする方法については以下ブログ等をご参考ください

EC2 インスタンスが AWS Systems Manager のマネージドインスタンス一覧に表示されません

実行コマンド

AWS CLI と jq を使用して、
特定のアプリケーション(今回は"java"で始まる)がインストールされているEC2インスタンスの一覧を取得後に、アプリケーションのバージョン情報を取得しています。

AWS コンソールにログインし、右上のCloudShell[>_]を起動して、以下のコマンドを実行してください

APP_NAME の部分を 検索したいアプリ名に変更してご使用ください

※注意
アプリケーション名を指定しない場合、list-inventory-entries コマンドは通常一度ですべてのアプリケーション情報を返しきれませんので
実際はインストールされていても一度では情報を取得できない事があります。その場合は名称を指定するか、繰り返し処理をはさむなどの修正をおこなってください。

APP_NAME="java"
aws ssm get-inventory --filters Key="AWS:Application.Name",Values=[$APP_NAME],Type="BeginWith" --output json | \
jq '.Entities[].Id' | \
xargs -I {} aws ssm list-inventory-entries --instance-id "{}" --type-name "AWS:Application" --filters Key=Name,Values=$APP_NAME,Type="BeginWith" | \
jq -r ".InstanceId, (.Entries[] | [.Name, .Version] | @tsv)"

実行結果(例)

上記を実行すると以下のように、インスタンスIDとともにAPP_NAMEで指定したアプリケーションのバージョンと共に出力されます。(例です)

i-xxxxxxx
java-1.7.0-openjdk      1.7.0.xxx
javapackages-tools      0.xxx
i-yyyyyyy
java-11-openjdk      xxxx
javapackages-tools   xxx

まとめ

ちょっとバタバタつくったので、誤動作する可能性もありますが、ご活用またご自由に変更ください。
なお、上記でみつかった特定のインスタンスに対して、パッチをあてたい!更新したい!といった場合にもSSM管理下であれば、一括で更新することもできますので 参考情報や、パッチマネージャーのエントリーなどをご参考にしてください

参考情報

AWS Systems Manager(SSM) インベントリを使ってインスタンスにインストールされているアプリケーションをチェックする

AWS Systems Manager Patch Managerの記事一覧
https://dev.classmethod.jp/tags/aws-systems-manager-patch-manager/