
Systems Manager で パッケージの一覧を取得してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
やってみた
管理対象EC2インスタンスの作成
OSはAmazon Linux2 を使用しました。Amazon Linux2 には最初からSystems Manager(以降、SSM)のエージェントがインストール済みです。
条件
AWS管理ポリシーのAmazonEC2RoleforSSMがアタッチされているIAMロールを作成し、EC2インスタンスに設定してください。
EC2インスタンスはインターネットアクセスが可能なサブネットに作成してください、アウトバウントど戻りの通信が可能であればOKです。
インベントリを有効にする
SSMエージェントがインストールされているだけではミドルウェアの状態は把握できません、インベントリを有効にするという作業を行う必要があります。
下記のリンクからSSMのインベントリ画面にアクセスしてください。
https://ap-northeast-1.console.aws.amazon.com/systems-manager/inventory?region=ap-northeast-1
アクセスするとSSMエージェントがインストールされたEC2インスタンス(以降、マネージドインスタンス)が表示されます。
私の環境ではマネージドインスタンスが1台のみで、インベントリが無効状態なので左側の円グラフでは全てがDisabledになっています。
インベントリを有効にしましょう、画面右上のセットアップインベントリをクリックします。

セットアップインベントリの画面ではターゲットEC2インスタンスの指定や取得する項目を設定します。
今回はデフォルトまま、全てのインスタンスを対象で設定しました。
- 名前
- インベントリの名前を指定します
 
 - ターゲット
- ターゲットEC2インスタンスを指定します
- 全て
 - タグ
- 1組のキー項目・値に一致するインスタンスのみ指定
 
 - インスタンスの手動選択
- 複数選択可能
 
 
 
 - ターゲットEC2インスタンスを指定します
 

- スケジュール
- インベントリデータの収集間隔
- 分・時間・日単位で指定
 
 
 - インベントリデータの収集間隔
 - パラメータ(各データの収集を有効にするか制御)
- Applications
- アプリケーション(パッケージ)の情報
 
 - AWS Components
- SSMエージェントなどの情報
 
 - Network Config
- NICに関する情報
 - IPアドレス・サブネットマスク・MACアドレス・DHCPサーバ等
 
 - Windows Updates
 
 - Applications
 

- パラメータ
- Instance Detailed Information
- 主にCPUに関する情報
 - ソケット数・コア数・動作周波数・Hyper-Threadingの状態
 - ソケット数・コア数・動作周波数・Hyper-Threadingの状態
 
 - Services
 - Windows Roles
 - Custom Inventory
 - ファイル
 - Windows レジストリ
 
 - Instance Detailed Information
 

- 詳細設定
- 実行履歴をS3に書き込む
 
 

インベントリを確認する
AWS Systems Manager → 共有リソース → マネージドインスタンス で対象のインスタンスのインベントリタブで内容を確認できます。

リソースデータ同期の設定
SSMインベントリの内容はAmazon Athena および Amazon QuickSight で扱うことができます。その為には保存用のS3バケットを作成し同期の設定を行う必要があります。
任意のS3バケットを作成し下記のバケットポリシーを設定してください。 バケットポリシーは以下の表に従って置換が必要です。
| 置換前 | 置換後 | 
| backet-name | バケット名 | 
| bucket-prefix | ディレクトリ名 任意で決めてOK | 
| account-id | AWSアカウント番号 | 
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SSMBucketPermissionsCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "ssm.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::bucket-name"
        },
        {
            "Sid": " SSMBucketDelivery",
            "Effect": "Allow",
            "Principal": {
                "Service": "ssm.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": ["arn:aws:s3:::bucket-name/bucket-prefix/*/accountid=account-id/*"],
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}
作成したバケットにデータを同期する設定を行います。
https://ap-northeast-1.console.aws.amazon.com/systems-manager/inventory?region=ap-northeast-1
リソースデータの同期をクリックします。

- 同期名
- 任意の名前
 
 - バケット名
- 作成したバケットの名前
 
 - バケットプレフィックス
- バケットポリシーと一致するようにプレフィックスを入力
 
 
値を入力して作成をクリックします。

Athenaでテーブル化
データをAthenaでテーブル化してみましょう。
https://ap-northeast-1.console.aws.amazon.com/athena/home?force=®ion=ap-northeast-1#query
データベースを作成します。
CREATE DATABASE ssminventory

テーブルを作成します。
bucket-name・bucket-prefixは置換してください。
CREATE EXTERNAL TABLE IF NOT EXISTS ssminventory.AWS_Application ( Name string, ApplicationType string, Publisher string, Version string, InstalledTime string, Architecture string, URL string, Summary string, PackageId string ) PARTITIONED BY (AccountId string, Region string, ResourceType string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://bucket-name/bucket-prefix/AWS:Application/'
テーブルを分割します。
MSCK REPAIR TABLE ssminventory.AWS_Application
テーブルをプレビューしてみます。データベースでssminventoryを選んでオプションからテーブルのプレビューを実行します。

表示されました!

S3に保存されたデータの確認
S3にはどういった形式で保存されているのか確認してみましょう。
Applicationはバケット内の下記に保存されています。
bucket-name / bucket-prefix /AWS:Application/accountid=account-id /region=ap-northeast-1/resourcetype=ManagedInstanceInventory / instance-id.json
ファイルをダウンロードして確認してみましょう。
{
  ApplicationType :  Development/Languages ,
  InstalledTime :  2018-08-11T02:02:08Z ,
  Architecture :  x86_64 ,
  Version :  2.7.14 ,
  Summary :  An interpreted, interactive, object-oriented programming language ,
  PackageId :  python-2.7.14-58.amzn2.0.3.src.rpm ,
  Publisher :  Amazon Linux ,
  Release :  58.amzn2.0.3 ,
  URL :  http://www.python.org/ ,
  Name :  python ,
  resourceId :  i-xxxxxxxxxxxxxxxxx ,
  captureTime :  2018-09-07T06:52:49Z ,
  schemaVersion :  1.1 
}
例としてPythonの箇所を抽出しました。Athenaを利用せずにS3からjsonをダウンロードして利用することも可能です。
あとがき
SSMインベントリ機能でパッケージを可視化してみました。定期的にパッケージのリストをレポートする場合や脆弱性発覚時に影響のあるEC2インスタンスを特定したい時などに活用できそうです。
SSHでインスタンスにログインして、コマンド実行...みたいなオペレーションを繰り返すのと比較すると圧倒的に楽ですね。
ぜひぜひ、活用してみてください!






