SSMで　オンプレミスの　windows PC（サーバでない）　のアプリ一覧取得

[AWS を使って社内PCのソフトウェア管理（SAM)](https://qiita.com/zanjibar/items/a61a7121e186811e4a9e)に書いたように、なんと、SSMが、通常のPCでも使えます。Mac や、Linux Desktop でも、つかえるようです。

SSMは、エージェントアプリケーションです。対象となるシステム（EC2に加えてオンプレミス）の情報をAWSにおくったり、AWS側からの設定で対象となるシステムのプログラムをおくりこんで実行するものです。EC2だけでなくオンプレミス（AWSの外にあるいわゆる自社システム）も、AWSの管理下におけるのがポイントです。

# SSM のオンプレミスへのインストール方法

公式の解説は、[これ](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-managedinstances.html)です。読んでもよくわかりませんが、頑張って読みましょう。

内容は

##### [SSM用の IAM サービスロールを作成する](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-service-role.html)

SSMだけでなくS3を使えるロールをつくると便利です。たくさん情報とってくる場合には、S3に保存する必要があります。

#### [アクティベーション(activation-id)を作成する](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-managed-instance-activation.html)
上記ロールを付与するトークン(activation-id)作成です。オンプレミス側からこのトークンをおくります。トークンの寿命は短めで、一ヶ月以上は設定できないようになっています。

#### [Windows に SSM エージェント をインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-install-managed-win.html)

トークン(activation-id)をつかってインストールです。

#### マネージドインスタンスの確認

うまくインストールされて認識されると、コンソールからSSM のメニューにはいり、マネージドインスタンスでみつけることができます。オンプレミスは、mi-  ではじまるIDが使われます。このIDにしたがって、SSMの設定をします。

# SSM の設定

SSMはいろんなことができますので、どんなことをしたらいいかの設定をします。
それが、関連づけを設定するという機能です。コンソール画面からも可能ですが、
画面の挙動がいまいちよくわかりません。現時点では、コマンドラインで設定するほうが楽です。
参考になるのは[このページ](https://dev.classmethod.jp/cloud/aws/ec2-systems-manager-new-inventory-type/)です。

コマンドラインの権限は、ssm の権限ありでいけるとは思いますが、システム管理者で作業しました。

```
PARAMETER_FILE_NAME=f.json
aws ssm create-association \
    --name AWS-GatherSoftwareInventory \
    --targets Key=instanceids,Values=["mi-xxxxxxxxxxxxxxx"] \
    --schedule-expression "cron(0 */30 * * * ? *)" \
    --parameters file://${PARAMETER_FILE_NAME}
```
ここでは、対象(m1-xxxxxxxxxxxxxxx)のソフトの状態（AWS-GatherSoftwareInventory ）を30分ごとにあつめると設定しています。対象の mi-xxxxxxxxxxxxxxx は、適宜変更してください。

f.json の内容は、
アプリや、ファイルの情報をとってこいなどというものです。
windows のレジストリもとってくることができます。

```
{
    "applications": ["Enabled"],
    "awsComponents": ["Enabled"],
    "files": ["[{\"Path\":\"C:\\Program Files\",\"Pattern\":[\"*.exe\"],\"Recursive\":true}]"],
    "networkConfig": ["Enabled"],
    "windowsUpdates": ["Enabled"],
    "instanceDetailedInformation": ["Enabled"],
    "services": ["Enabled"],
    "windowsRegistry": ["[{\"Path\":\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Office\",\"Recursive\":true}]"],
    "windowsRoles": ["Enabled"],
    "customInventory": ["Enabled"]
}
```

- アプリケーション一覧を取得するのは、AWS:Application と記述します。

```
aws ssm list-inventory-entries \
    --instance-id mi-xxxxxxxxxxxxxxx \
    --type-name AWS:Application
```

- 結果　は、json で戻ります。

```
{
    "TypeName": "AWS:Application",
    "InstanceId": "mi-xxxxxxxxxxxxxxx",
    "SchemaVersion": "1.1",
    "CaptureTime": "2018-12-16T05:07:27Z",
    "Entries": [
        {
            "Architecture": "i386",
            "Name": "Amazon SSM Agent",
            "PackageId": "{5cf51930-b158-4496-94b5-0ed7f0238f42}",
            "Publisher": "Amazon Web Services",
            "Version": "2.3.136.0"
        },

以下略
```

- これで、適当にJSON処理してアプリ一覧つくったりできます。
- レジストリ情報も取得できますが、範囲が広すぎるとエラーになります。限定するといいです。
- バッチコマンド使ってこの程度はできますが、JSONで情報もどってきたりするので少しは便利です。レジストリまでみることができれば、ライセンス管理もできるのでいいのではないでしょうか、今後に期待です。