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で横断クエリし、ライセンス台帳の自動更新に活用できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ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" } ] }
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 | +---------------------------+----------------+
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 | +-------------+----------------------+--------+---------+--------------------+
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;
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
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権限を確認する |
>> AWSとAmazon Linuxの基礎から学ぶ(無料マニュアル)
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AWS SSM Automationで実現するEC2スケジュール起動停止設計|コスト削減VPC運用パターン
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます