AWS SSM WindowsのInventory機能でライセンス管理を自動化するVPC設計|資産台帳の統合

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > AWS(Amazon Linux) > AWS SSM WindowsのInventory機能でライセンス管理を自動化するVPC設計|資産台帳の統合
「EC2上のWindowsサーバーに何のソフトが何本入っているか、台帳に記録されていますか?」
EC2の台数が増えるほど、ライセンス管理を手作業で続けることは現実的ではなくなる。監査対応やコスト最適化の場面で「どのインスタンスにどのソフトウェアが入っているか」をすぐに出せないと、担当者は手動で各サーバーをログインして確認する羽目になる。

AWS Systems Manager(SSM)のInventory機能を使えば、WindowsインスタンスのインストールされたアプリケーションからWindowsサービス、レジストリの値まで自動収集してS3に蓄積できる。インターネットに出さないVPC設計(Interface型エンドポイント)と組み合わせれば、セキュリティ要件の厳しいシステムでも安全に運用できる。

この記事では、AWS SSM WindowsのInventory機能の設定手順と、SSMエンドポイントをマルチAZで冗長化するVPC設計を、実際のAWS CLIの出力を交えて解説します。対象読者はVPC内のWindowsインスタンスを中央管理したいインフラエンジニアです。

この記事のポイント

・AWS SSM InventoryでWindowsのアプリ・サービス・レジストリを自動収集できる
・インターネット不要の構成はInterface型エンドポイント3つでマルチAZ冗長化できる
・State ManagerのInventory関連付けでタグ指定の全インスタンス一括適用が可能
・収集データはS3+Athenaで横断クエリし、ライセンス台帳の自動更新に活用できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜAWS SSM InventoryでWindowsライセンス管理を行うのか

EC2上のWindowsサーバーが数台なら、RDPでログインしてプログラムの追加と削除を確認すればよい。だが、本番・検証・DR環境を合わせると30台、50台と増えていくと、手動での棚卸しは現実的ではなくなる。

AWS Systems Manager(SSM)のInventory機能は、SSMエージェント(Windows Server 2016以降は標準インストール済み)を通じてインスタンスの構成情報を定期的にS3に送信する仕組みだ。収集は設定した間隔で自動実行され、差分のみ更新される設計になっている。

Inventoryを使った資産管理の全体像を整理すると以下のようになる。

・AWS Config:AWSリソース(EC2インスタンス自体やSGの設定)の変更履歴を追跡する
・SSM Inventory:インスタンス内部の情報(インストール済みソフトウェア・OS設定・サービス)を収集する
・AWS License Manager:SSM Inventoryのデータを利用してライセンスルールを定義・アラート通知する

SSM Inventoryで収集したデータをLicense Managerと連携させると、ライセンスの過剰使用をリアルタイムで検知できる構成が作れる。

AWS SSM WindowsのInventoryで収集できる情報

SSM InventoryがWindowsで収集できるインベントリタイプを整理する。

1. 標準インベントリタイプ(Windows向け主要6種)

・AWS:Application:インストール済みアプリケーション(名前・バージョン・発行元・インストール日)
・AWS:WindowsUpdate:適用済みWindowsUpdateのKB番号・インストール日
・AWS:WindowsRegistry:指定したレジストリキーの値(カスタムキーを設定して取得)
・AWS:WindowsRole:インストール済みの役割と機能(IIS・Hyper-Vなど)
・AWS:Service:Windowsサービスの名前・状態・起動種別
・AWS:Network:ネットワークインターフェース情報(MACアドレス・IPアドレス)

2. カスタムInventoryによる拡張

標準タイプで取れない情報は、インスタンス上にJSONファイルを配置することでカスタムInventoryとして収集できる。「社内ライセンスキーの管理番号」や「資産管理番号」をJSONで記録しておけば、他のInventoryデータと一緒にS3に蓄積される。

カスタムInventoryのJSONはインスタンスの以下のパスに保存する。

# カスタムInventoryの配置パス(Windows) C:\ProgramData\Amazon\SSM\InventoryData\ # ファイル名は半角英数字で拡張子 .json # 例: asset-custom.json { "SchemaVersion": "1.0", "TypeName": "Custom:AssetManagement", "Content": [ { "AssetId": "ASSET-2024-WEB-001", "LicenseKey": "XXXX-XXXX-XXXX-XXXX", "PurchaseDate": "2024-04-01" } ] }

TypeNameは「Custom:」で始まる名前を付ける(このプレフィックスが必須)。JSONを配置した後、次の定期収集のタイミングで自動的にSSMに取り込まれる。

VPC設計:SSMエンドポイントをマルチAZで冗長化する

SSMエージェントはデフォルトでインターネット経由でAWSのSSMエンドポイントに接続する。プライベートサブネットに配置したWindowsインスタンスをNATなしで管理するには、VPCエンドポイント(Interface型)が必要だ。

1. 必要なVPCエンドポイント3種

SSMの機能を使うためには以下の3つのエンドポイントが全て必要になる。

・com.amazonaws.リージョン.ssm:SSMのメイン通信(Inventory・Run Command・Session Manager)
・com.amazonaws.リージョン.ssmmessages:Session Managerのインタラクティブシェル通信
・com.amazonaws.リージョン.ec2messages:EC2インスタンスからのメッセージ送受信

この3つ全てをInterface型で作成する必要がある。1つでも欠けると、Inventoryの収集やセッション接続が失敗する。

2. Interface型エンドポイントのマルチAZ配置

Interface型エンドポイントはAZごとにENI(Elastic Network Interface)を作成する仕組みだ。東京リージョン(ap-northeast-1)でap-northeast-1a・1c・1dの3AZに分散配置する場合、1つのエンドポイントに対して3つのENIが作られる。どれか1つのAZが障害になっても残りのAZで通信を継続できる。

AWS CLIでSSMエンドポイントを作成する例(VPC ID・サブネットIDはマスク済み)。

# SSMエンドポイントを3AZのプライベートサブネットに作成 aws ec2 create-vpc-endpoint \ --vpc-id vpc-0a1b2c3d4e5f6a7b8 \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.ap-northeast-1.ssm \ --subnet-ids \ subnet-011aa222bb333cc4 \ subnet-055ee666ff777aa8 \ subnet-099bb000cc111dd2 \ --security-group-ids sg-0fedcba987654321 \ --private-dns-enabled # 作成後の確認 aws ec2 describe-vpc-endpoints \ --filters Name=service-name,Values=com.amazonaws.ap-northeast-1.ssm \ --query 'VpcEndpoints[*].{ID:VpcEndpointId,State:State}' \ --output table ---------------------------------------------- | DescribeVpcEndpoints | +---------------------------+----------------+ | ID | State | +---------------------------+----------------+ | vpce-0aabb1122ccdd3344 | available | +---------------------------+----------------+

ssmmessages と ec2messages も同じコマンドで作成する。--private-dns-enabled を付けることで、インスタンスからは通常のAWSエンドポイントFQDN(ssm.ap-northeast-1.amazonaws.com等)がVPCエンドポイント経由に自動解決される。

3. セキュリティグループ設定(最小権限)

エンドポイント用のセキュリティグループ(sg-0fedcba987654321)に設定するルールは最小限に絞る。

・インバウンド:TCP 443(HTTPS)、ソース=Windowsインスタンスに付与したSGのID
・アウトバウンド:制限なし(デフォルト設定のまま)

ポイントは、インバウンドのソースをVPC CIDRブロック全体ではなく、管理対象Windowsインスタンスに付与したSGにすることだ。インスタンスが増えた際もSGへのアタッチだけで対応でき、IP管理の手間がなくなる。

設定手順:IAMロール → エージェント確認 → Inventory関連付け

1. IAMロール(AmazonSSMManagedInstanceCore)をアタッチする

WindowsインスタンスがSSMエンドポイントと通信するには、EC2インスタンスプロファイルにIAMロールが必要だ。最低限必要なポリシーは AmazonSSMManagedInstanceCore(AWS管理ポリシー)1つでよい。

既存インスタンスにIAMロールをアタッチする場合の手順。

# インスタンスプロファイルを作成してロールをアタッチ aws iam create-instance-profile \ --instance-profile-name SSMWindowsInstanceProfile aws iam add-role-to-instance-profile \ --instance-profile-name SSMWindowsInstanceProfile \ --role-name AmazonSSMRoleForInstancesQuickSetup # EC2インスタンスにアタッチ aws ec2 associate-iam-instance-profile \ --instance-id i-0a1b2c3d4e5f6a7b8 \ --iam-instance-profile Name=SSMWindowsInstanceProfile

2. SSMエージェントの状態確認

IAMロールとエンドポイントの設定が正しければ、インスタンスがSSM管理対象として表示される。

# SSM管理対象のWindowsインスタンスを確認 aws ssm describe-instance-information \ --filters Key=PlatformType,Values=Windows \ --query 'InstanceInformationList[*].{ ID:InstanceId, OS:PlatformName, Ver:PlatformVersion, Agent:AgentVersion, Ping:PingStatus }' \ --output table ------------------------------------------------------------------------------------ | DescribeInstanceInformation | +-------------+----------------------+--------+---------+--------------------+ | Agent | ID | OS | Ping | Ver | +-------------+----------------------+--------+---------+--------------------+ | 3.3.987.0 | i-0a1b2c3d4e5f6a7b8 | Windows Server 2022 | Online | 10.0.20348 | | 3.3.987.0 | i-0c2d3e4f5a6b7c8d9 | Windows Server 2022 | Online | 10.0.20348 | +-------------+----------------------+--------+---------+--------------------+

PingStatusが Online になっていれば、エンドポイント経由でSSM通信が確立されている。Offlineの場合は「トラブルシュート」のセクションを参照してほしい。

3. State ManagerでInventory関連付けを作成する

Inventory収集は「関連付け(Association)」で設定する。対象インスタンスをタグ(例: Platform=Windows)でまとめて選択できるため、新しいWindowsインスタンスを追加したときも自動的に収集対象に含まれる。

# Inventory関連付けをCLIで作成(タグでWindowsインスタンスを一括対象) aws ssm create-association \ --name AWS-GatherSoftwareInventory \ --targets Key=tag:Platform,Values=Windows \ --schedule-expression "rate(1 day)" \ --parameters \ applications=Enabled,\ awsComponents=Enabled,\ windowsRegistry=Enabled,\ windowsRoles=Enabled,\ windowsUpdates=Enabled,\ services=Enabled,\ networkConfig=Enabled # 関連付けの実行状態を確認 aws ssm list-associations \ --association-filter-list Key=AssociationName,Value=AWS-GatherSoftwareInventory \ --query 'Associations[*].{Name:Name,Status:Overview.Status,Last:LastExecutionDate}' \ --output table --------------------------------------------------------------------------- | ListAssociations | +------------------------------+------------------------------+-----------+ | Last | Name | Status | +------------------------------+------------------------------+-----------+ | 2026-10-14T03:00:00.000Z | AWS-GatherSoftwareInventory | Success | +------------------------------+------------------------------+-----------+

収集間隔は rate(1 day)(1日1回)で十分だ。変更頻度が高い環境では rate(30 minutes) にすることもできるが、S3への書き込みが増えるためコストと相談して決める。

収集データをS3+AthenaでInventory台帳に統合する

Inventory関連付けが成功すると、収集データがS3バケット配下に以下の構造で蓄積される。

・s3://バケット名/アカウントID/リージョン/インスタンスID/AWS:Application/
・s3://バケット名/アカウントID/リージョン/インスタンスID/AWS:WindowsUpdate/

AthenaでこのデータをクエリするとInventoryを横断検索できる。全WindowsインスタンスのMicrosoft製品インストール状況を取得するAthenaクエリの例を示す。

-- 全WindowsインスタンスのMicrosoft製品インストール状況を一覧取得 SELECT resourceid AS instance_id, json_extract_scalar(content, '$.Name') AS app_name, json_extract_scalar(content, '$.Version') AS version, json_extract_scalar(content, '$.Publisher') AS publisher, json_extract_scalar(content, '$.InstalledTime') AS installed_at FROM ssm_inventory_aws_application WHERE json_extract_scalar(content, '$.Publisher') LIKE '%Microsoft%' ORDER BY instance_id, app_name;

このクエリ結果をEventBridge + Lambdaで日次実行し、社内のCMDB(構成管理データベース)に自動で取り込む設計が、AWS SSM Windowsの資産台帳統合の典型的なパターンだ。

AWSとAmazon Linuxを組み合わせたサーバー管理の基礎から学びたい方は、AWSとAmazon Linuxの活用ガイド(入門記事)も参考にしてほしい。

トラブルシュート:InventoryデータがS3に届かない場合

1. PingStatusがOfflineのとき

VPCエンドポイント経由で通信できていない可能性がある。インスタンスから以下の3エンドポイントへのTCP 443の疎通をPowerShellで確認する。

# Windows PowerShellで疎通確認(SSMエンドポイント) Test-NetConnection -ComputerName ssm.ap-northeast-1.amazonaws.com -Port 443 Test-NetConnection -ComputerName ssmmessages.ap-northeast-1.amazonaws.com -Port 443 Test-NetConnection -ComputerName ec2messages.ap-northeast-1.amazonaws.com -Port 443 # 正常な場合の出力例 ComputerName : ssm.ap-northeast-1.amazonaws.com RemoteAddress : 172.31.xx.xxx RemotePort : 443 TcpTestSucceeded : True

TcpTestSucceeded: False になる場合は、エンドポイントのSGのインバウンド443が正しく設定されているか、サブネットのルートテーブルを確認する。

2. AssociationのStatusがFailedのとき

IAMロールの設定ミスが最も多い原因だ。インスタンスに付与したIAMロールに AmazonSSMManagedInstanceCore が含まれているか確認する。

・IAMロール未アタッチ:コンソールでEC2インスタンスの「IAMロール」列を確認する
・S3バケット権限不足:InventoryのS3送信先バケットにバケットポリシーが必要な場合がある(ssm:PutInventory・s3:PutObject)
・SSMエージェントが古い:Windows Server 2016以前のAMIはSSMエージェントが古いことがある。PowerShellで Get-Service AmazonSSMAgent を確認し、最新版に更新する

本記事のまとめ

AWS SSM WindowsのInventory機能でライセンス管理を自動化するために必要な構成をまとめる。

やること ポイント
VPCエンドポイント作成 ssm / ssmmessages / ec2messages の3種をInterface型でマルチAZに配置する
セキュリティグループ エンドポイントにTCP 443インバウンドを許可。ソースは管理対象インスタンスのSGを指定する
IAMロール EC2インスタンスプロファイルに AmazonSSMManagedInstanceCore をアタッチする
Inventory関連付け AWS-GatherSoftwareInventory をState Managerでタグ指定して全インスタンスに一括適用する
S3+Athena統合 収集データをAthenaでクエリし、CMDBやライセンス台帳に自動連携する
トラブルシュート PingStatus Offline → エンドポイント疎通確認。Association Failed → IAMロール・S3権限を確認する
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、AWSでのサーバー管理に必要な基礎から実践的なコマンド操作まで体系的にまとめた無料マニュアルを配布しています。
>> AWSとAmazon Linuxの基礎から学ぶ(無料マニュアル)

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。