System Manager のインベントリデータをS3バケットへ集約できるようになったとのことで試してみました。

公式ドキュメント上にも EC2 -> System Manager -> S3 -> Athena -> QuickSight 連携方法がありました。

手順はドキュメント通りで問題無いので引っ掛かったポイントだけメモします。

インベントリ収集

  • [EC2] → [Systems Manager Shared Resources] → [Managed Instances] → [Setup Inventory]

Write Execution History to S3

インベントリのセットアップ時に Write Execution History to S3 でS3バケットへの書込設定があります。

項目名の通り、収集実行結果の成否を書き込むだけで、インベントリデータが保存されるわけではありません。

  • S3格納パス
{{ S3 Bucket Name }}/{{ S3 Key Prefix }}/{{ InstanceId }}/{{ AssociationId }}/{{ datetime(UTC) }}/awssoftwareInventory/collectSoftwareInventoryItems/{stdout|stderr}
  • 出力例
# 成功時
s3://xxx.bucket/xxx.keyprefix/i-0f7d0577f65XXXXX/8611acf6-f9a1-49b9-8907-XXXXXXXXXXXX/2017-mm-ddThh-mm-ss.077Z/awssoftwareInventory/collectSoftwareInventoryItems/stdout
# 失敗時
s3://xxx.bucket/xxx.keyprefix/i-0f7d0577f65XXXXX/8611acf6-f9a1-49b9-8907-XXXXXXXXXXXX/2017-mm-ddThh-mm-ss.077Z/awssoftwareInventory/collectSoftwareInventoryItems/stderr

インスタンスは一度に一つのインベントリのみ

インスタンスには、一度に 1 つのインベントリのみ関連付けることができます。インスタンスに 2 つ以上関連付けて設定した場合、その関連付けは実行されず、インベントリデータは収集されません。

重複設定を行った場合、stderr に以下のように出力されます。

aws:softwareInventory detected multiple inventory configurations associated to one instance. You can  associate multiple inventory configurations to an instance.
The association IDs are: e6df398e-a8fc-4b38-b349-XXXXXXXXXXXf and 8611acf6-f9a1-49b9-8907-XXXXXXXXXXX3.

リソースデータの同期

今回の本題です。特に引っ掛かる箇所は無いと思います。

  • [EC2] → [Systems Manager Shared Resources] → [Managed Instances] → [Resource Data Syncs] → [Create a Resource Data Sync]

同期とターゲット Amazon S3 バケットが異なるリージョンにある場合、データ転送料金がかかる場合があります。

特別理由が無いのであれば、S3バケットは同一リージョンに作成するのが良いと思います。

出力結果

  • S3格納パス
{{ Bucket Name }}/{{ Bucket Prefix }}/AWS:{{ Parameters }}/accountid={{ AWS AccountId }}/region={{ Region }}/resourcetype= ManagedInstanceInventory/{{ InstanceId }}.json
  • 出力例
    • バケット配下に Parameters 毎に出力
    • Athenaのパーティション向けにHiveフォーマットで階層が切られる
    • 出力形式はJSON
  • 出力例
# Parameters毎
$ aws s3 ls s3://{{ Bucket Name }}/{{ Bucket Prefix }}/
                           PRE AWS:AWSComponent/
                           PRE AWS:Application/
                           PRE AWS:InstanceDetailedInformation/
                           PRE AWS:InstanceInformation/
                           PRE AWS:Network/
# InstanceID.json
$ aws s3 ls s3://{{ Bucket Name }}/{{ Bucket Prefix }}/AWS:Application/accountid=XXXXXXXXXXXX/region=ap-northeast-1/resourcetype=ManagedInstanceInventory/
2017-mm-dd hh:mm:ss     123456 i-XXXXXXXXXXXXXXXXX.json

Athena でデータを使用

テーブル作成クエリもドキュメントに記載されていますので、順次実行していけば良いです。

バケット名とプレフィックスを書き換える必要がありますが、 ドキュメント内のクエリに不要な空白が入っていたり、置換前の名称が異なる部分があるので、少しだけ注意が必要です。

・・・
# 空白が入っている
) LOCATION 's3:// bucketname /bucketprefix/AWS:AWSComponent/'
・・・
# bucketname
) LOCATION 's3://bucketname/bucketprefix/AWS:WindowsUpdate/'
・・・
# bucket-name
) LOCATION 's3://bucket-name/bucketprefix/AWS:InstanceInformation/'
・・・
  • 利用例

QuickSight でデータを使用

  • 利用例

東京リージョン未対応

QuickSightは現時点では東京リージョンでは使用できません。 そのため、Athenaをデータソースとする場合はAthenaもQuickSightが対応しているリージョンを選択する必要があります。

SSMエージェント導入等、少々手間は入りますがAWS内でソフトウェア管理が完結できるのは良いですね。

元記事はこちら

AWS EC2 Systems Manager を S3 へ同期