SSMインベントリとAthenaを使ったインスタンス棚卸し例
SSMインベントリのリソースデータの同期 機能を使うことで、 収集したメタデータ(インベントリデータ)を S3バケットへ送信できます。 S3バケットのインベントリデータに対して Amazon AthenaやQuickSight を使って分析ができます。
今回はAthenaを使ったEC2インスタンス棚卸しのユースケースをいくつか紹介します。
要旨
以下 ユースケースごとのサンプルクエリを紹介しています。
- インスタンス一覧をとりあえず取得する
- インスタンスに付与されているタグ一覧を取得する
- インスタンスの名前(Nameタグ)、OS情報を取得する
- 特定アプリケーションのバージョンを取得する
- 特定の関連付け(SSMドキュメント)の実行結果ステータスを取得する
前提
以下のブログで作成したテーブルに対するクエリを想定しています。
また、そもそもの SSMインベントリ(& リソースデータ同期) セットアップ部分は割愛します。 以下ドキュメントやブログを参照ください。
- インベントリ収集の設定 - AWS Systems Manager
- チュートリアル: リソースデータの同期を使用してインベントリデータを集約する - AWS Systems Manager
- AWS Organizations環境でなるべく楽にSSMインベントリデータを集約したい | DevelopersIO
インスタンス一覧をとりあえず取得する
SELECT * FROM aws_instanceinformation WHERE instancestatus != 'Terminated'
インスタンスステータスが終了(= Terminated)以外のEC2インスタンスを列挙します。 このSELECT文は以降のクエリでも部分的に活用していきます。
インスタンスに付与されているタグ一覧を取得する
WITH instances AS ( SELECT * FROM aws_instanceinformation WHERE instancestatus != 'Terminated' ), tag AS ( SELECT * FROM aws_tag ) SELECT instances.instanceid as InstanceID, tag.key as TagKey, tag.value as TagValue, instances.accountid as AccountID, instances.region as Region FROM tag INNER JOIN instances ON instances.resourceid = tag.resourceid
インスタンスのタグを棚卸します。
インスタンスの名前(Nameタグ)、OS情報を取得する
WITH instances AS ( SELECT * FROM aws_instanceinformation WHERE instancestatus != 'Terminated' ), tag AS ( SELECT * FROM aws_tag WHERE key = 'Name' ) SELECT tag.value as Name, instances.instanceid as InstanceID, instances.platformtype as PlatformType, instances.platformname as PlatformName, instances.platformversion as PlatformVersion, instances.accountid as AccountID, instances.region as Region FROM instances LEFT JOIN tag ON instances.resourceid = tag.resourceid
インスタンスのOS情報を棚卸しします。 Nameタグの情報を付与して、結果を解釈しやすくしています。
特定アプリケーションのバージョンを取得する
WITH instances AS ( SELECT * FROM aws_instanceinformation WHERE instancestatus != 'Terminated' ), tag AS ( SELECT * FROM aws_tag WHERE key = 'Name' ), app AS ( SELECT * FROM aws_application WHERE name = 'curl' ) SELECT tag.value as NameTag, instances.instanceid as InstanceID, app.name as AppName, app.version as AppVersion, instances.accountid as AccountID, instances.region as Region FROM app INNER JOIN instances ON app.resourceid = instances.resourceid LEFT JOIN tag ON app.resourceid = tag.resourceid
このクエリでは curl アプリケーションのバージョン一覧を棚卸ししています。 curl 部分を、棚卸ししたいアプリケーション名に置き換えてください。
特定の関連付け(SSMドキュメント)の実行結果ステータスを取得する
WITH instances AS ( SELECT * FROM aws_instanceinformation WHERE instancestatus != 'Terminated' ), tag AS ( SELECT * FROM aws_tag WHERE key = 'Name' ), compliance AS ( SELECT * FROM aws_complianceitem WHERE documentname = 'AWS-UpdateSSMAgent' ) SELECT tag.value as NameTag, instances.instanceid as InstanceID, compliance.documentname as DocumentName, compliance.status as ComplianceStatus, compliance.executiontime as ExecutionTime, instances.accountid as AccountID, instances.region as Region FROM compliance INNER JOIN instances ON compliance.resourceid = instances.resourceid LEFT JOIN tag ON compliance.resourceid = tag.resourceid
このクエリでは SSMエージェントの更新(AWS-UpdateSSMAgent)の実行結果を棚卸ししています。 AWS-UpdateSSMAgent 部分を、棚卸ししたいSSMドキュメント名に置き換えてください。
おわりに
EC2インスタンス棚卸しのサンプルクエリを共有しました。
私はマルチアカウント(AWS Organizations)環境で活用していますが、 アカウント横断でインスタンス情報を棚卸しできるのはとても便利です。 特に「あのアプリのバージョンを急ぎ棚卸ししたい」といったケースで役立っています。
参考になれば幸いです。