
SSMインベントリとAthenaを使ったインスタンス棚卸し例
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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)環境で活用していますが、 アカウント横断でインスタンス情報を棚卸しできるのはとても便利です。 特に「あのアプリのバージョンを急ぎ棚卸ししたい」といったケースで役立っています。
参考になれば幸いです。









