【ハンズオン】Windows Server 2025 の イベントログ を CloudWatch Logs に収集してみた
こんにちは、𝙆.𝙈𝙪𝙧𝙖𝙠𝙖𝙢𝙞(@mrk_17tksm) です。
AWSは2024年11月6日(現地時間)に「Windows Server 2025」のEC2 AMIを一般公開しました🎉
Windows Server 2022で採用していた Amazon CloudWatch Agent によるログ収集の方式が、引き続き利用可能かどうか確認してみました。
※本記事では、東京リージョンでリソース作成を行っています。
いきなり結論
Amazon CloudWatch Agent を利用したログ収集の方式は利用可能です🙌
ただし、執筆時点(2024/12/1)では、Systems Managerの一部機能(Run Command)が Windows Server 2025 に対応していません。Run Command による Amazon CloudWatch Agent
のインストール作業ができないことになります。
事前に Amazon CloudWatch Agent
をインストールされた Windows Server の AMI を準備→展開する運用を最優先に検討ください。
検証環境を作成する(任意)
プライベートサブネットにEC2をデプロイして、Systems Manager Agent経由でリモートアクセスできる検証環境を作成します。本記事では、VPCエンドポイントによるプライベート構成を前提としています。
※パブリックサブネットに NAT Gateway をデプロイした環境は、この章に従う必要はありません。「WindowsイベントログをCloudWatch Logsへ転送する」の手順から始めてください。
下記にこの章で紹介する検証環境を示します。リモートアクセスには Fleet Manager を利用します。
(1)VPC と サブネット を作成する
VPCとサブネットを作成していきます。下表はEC2とVPCエンドポイント用のサブネットに分離していますが、統合しても構いません。サブネット内で利用できるIPアドレスの数に注意してください。
サービス名 | リソース名 | 設定値(例) | 用途 |
---|---|---|---|
VPC | techblog-vpc | 192.168.0.0/16 | ー |
サブネット① | techblog-private-snet-ec2-apne1a | 192.168.0.0/28 | EC2専用プライベートサブネット |
サブネット② | techblog-private-snet-vpce-apne1a | 192.168.1.0/28 | VPCE専用プライベートサブネット |
VPC内でVPC エンドポイントのホスト名を名前解決できるようにするため、VPCの「DNS解決」と「DNSホスト名」を有効化してください。
(2)セキュリティグループ を作成する
EC2とVPCエンドポイントのそれぞれに割り当てるセキュリティグループを作成していきます。EC2用のセキュリティグループから作成することを推奨します。
項目 | 設定値(例) |
---|---|
セキュリティグループ名 | techblog-sg-ec2 |
説明 | Dedicated security group for EC2 (Windows Server 2025) instances. |
VPC | techblog-vpc |
受信ルール | <※初期値> |
送信ルール | <※初期値> |
項目 | 設定値(例) |
---|---|
セキュリティグループ名 | techblog-sg-vpce |
説明 | Dedicated security group for VPC endpoints. |
VPC | techblog-vpc |
受信ルール | HTTPS(443)ポート、EC2用のセキュリティグループ(techblog-sg-ec2) |
送信ルール | <※初期値> |
(3)VPC エンドポイント を作成する
VPCエンドポイント を作成していきます。
Systems Manager を利用するためには、下記 3つのインターフェイス型VPCエンドポイントが必要です。
- com.amazonaws.ap-northeast-1.ssm
- com.amazonaws.ap-northeast-1.ec2messages
- com.amazonaws.ap-northeast-1.ssmmessages
下表は、ssm
の構成情報になります。残り2つは、「VPCエンドポイント名」と「サービス」項目の設定値をec2messages
とssmmessages
に変えて作成してください。
項目 | 設定値(例) |
---|---|
VPCエンドポイント名 | techblog-vpce-ssm |
タイプ | AWSのサービス |
サービス | com.amazonaws.ap-northeast-1.ssm |
VPC | techblog-vpc |
DNS 名を有効化 | 有効化 |
サブネット | techblog-private-snet-vpce-apne1a |
セキュリティグループ | techblog-sg-vpce |
ポリシー | フルアクセス |
(4)Windows Server 2025(EC2インスタンス) を作成する
EC2インスタンス を作成していきます。EC2 AMIは、「Windows_Server-2025-Japanese」とカタログ検索すると表示されます。本記事では、キーペアを使用しません。RDPなどでGUI操作をしたい場合は、事前にキーペアを発行してください。
項目 | 設定値(例) |
---|---|
EC2インスタンス名 | techblog-ws2025 |
AMI(ID) | Windows_Server-2025-Japanese-Full-Base-2024.11.19(ami-015764e21606d9688) |
インスタンスタイプ | <予算に合わせて...> t3.medium |
キーペア | キーペアなしで続行 (推奨されません) |
VPC | techblog-vpc |
サブネット | techblog-private-snet-vpce-apne1a |
パブリック IP の自動割り当て | 無効化 |
ファイアウォール (セキュリティグループ) | techblog-sg-ec2 |
ストレージ | 1×30GiB, gp3 ルートボリューム |
(5)EC2 インスタンスプロファイル を作成・割り当てる
EC2インスタンス が Systems Manager にアクセスできるように IAMロール を付与していきます。
IAMロール を作成します。
項目 | 設定値(例) |
---|---|
サービスまたはユースケース | EC2, EC2 Role for AWS Systems Manager |
許可ポリシー | AmazonSSMManagedInstanceCore |
ロール名 | techblog-ec2profile |
IAMロール を EC2インスタンス に付与します。
(6)動作確認 − リモートアクセスする
ノードアクションから「ターミナルセッション を開始する」を押下します。
リモートアクセスに成功すると、下記のような画面になります。
Windowsイベントログ を CloudWatch Logs へ転送する
Windows Server AMI で作成された EC2インスタンスには、Amazon CloudWatch Agent
が初期インストールされていません。また、EC2インスタンスに Amazon CloudWatch Agent の操作権限を付与する必要があります。
(1)CloudWatch 関連のポリシーを EC2 インスタンスプロファイル に追加する
EC2インスタンス内で起動された Amazon CloudWatch Agent
が CloudWatch Logに書き込むため、IAMロール(techblog-ec2profile)に CloudWatchAgentServerPolicy
を追加します。
(2) CloudWatch Logs に ログ収集する ための プライベート経路 を作成する
ログ収集のみであれば、 com.amazonaws.ap-northeast-1.logs
のVPCエンドポイント経由で CloudWatch Logs にログデータを配信できます。対象のVPCエンドポイントを作成していきます。
項目 | 設定値(例) |
---|---|
VPCエンドポイント名 | techblog-vpce-logs |
タイプ | AWSのサービス |
サービス | com.amazonaws.ap-northeast-1.logs |
VPC | techblog-vpc |
DNS 名を有効化 | 有効化 |
サブネット | techblog-private-snet-vpce-apne1a |
セキュリティグループ | techblog-sg-vpce |
ポリシー | フルアクセス |
(3)Amazon CloudWatch Agent を EC2インスタンス にインストールする準備をする
さて、ここで問題発生です。
執筆時点では、Run Command on Systems Manager のAPIが Windows Server 2025 をサポートしていません。ならば、S3バケットを作成して、VPCエンドポイント(Gateway)経由でインストーラを取得しようと考えましたが、Windows Server 2025 AMI には aws-cliやAWS SDK などがプリインストールされていないため、S3バケット内のオブジェクトデータ(msi)をダウンロードできません。
対策方法は、下記の2パターンです。
a. 一時的に EC2インスタンス を NAT Gateway + Internet Gateway 経由でインターネットアクセスできる構成にすること
b. 一時的に パブリックサブネット を作成して、インストーラの配信サーバ(EC2など) を設けること
複数のツールをインストールするため、導入が簡単なaのパターンを紹介します。
① NAT Gateway をデプロイするパブリックサブネットを作成する
サブネット名:techblog-public-snet-nat-apne1a
② NAT Gateway(public)を作成する
NAT Gateway名:techblog-natgw-apne1a
③ Internet Gateway を作成して、VPCに割り当てる
Internet Gateway名:techblog-igw
④ パブリック用の ルートテーブル を作成して、ルートを設定する
ルートテーブル名:techblog-public-rtb
⑤ 動作確認 − インターネットアクセスする
PS C:\Windows\system32> ping 8.8.8.8 -n 5
8.8.8.8 に ping を送信しています 32 バイトのデータ:
8.8.8.8 からの応答: バイト数 =32 時間 =3ms TTL=57
8.8.8.8 からの応答: バイト数 =32 時間 =2ms TTL=57
8.8.8.8 からの応答: バイト数 =32 時間 =2ms TTL=57
8.8.8.8 からの応答: バイト数 =32 時間 =2ms TTL=57
8.8.8.8 からの応答: バイト数 =32 時間 =2ms TTL=57
8.8.8.8 の ping 統計:
パケット数: 送信 = 5、受信 = 5、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 2ms、最大 = 3ms、平均 = 2ms
(4)パッケージ管理ツール を EC2インスタンス にインストールする
お好きな パッケージ管理ツール をインストールしていきます。本記事では、Chocolatey
を使用します。
Windows Terminal上で、下記のコマンドを実行してセットアップしていきます。
Chocolatey
をインストールするためには、実行ポリシーを変更します。
PS C:\Windows\system32> Set-ExecutionPolicy Bypass -Scope Process -Force
Chocolateyをインストールします。
PS C:\Windows\system32> Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
正常にインストールできたか、確認します。
PS C:\Windows\system32> choco --version
2.4.1
(5)テキストエディタツール を EC2インスタンス にインストールする
お好きな テキストエディタツール をインストールしていきます。本記事では、Vim
を使用します。
Vim
をインストールします。
PS C:\Windows\system32> choco install vim -y
正常にインストールできたか、確認します。
PS C:\Windows\system32> vim --version
VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Dec 2 2024 22:16:25)
(6)Amazon CloudWatch Agent を EC2インスタンス にインストールする
Windows Terminal上で、下記のコマンドを実行してインストーラを取得していきます。5分ほど待ちます。
PS C:\Windows\system32> Invoke-WebRequest -Uri "https://amazoncloudwatch-agent.s3.amazonaws.com/windows/amd64/latest/amazon-cloudwatch-agent.msi" -OutFile "C:\Users\Public\Downloads\amazon-cloudwatch-agent.msi" -UseBasicParsing
C:\Users\Public\Downloads\
に amazon-cloudwatch-agent.msi
がダウンロードされたか確認します。
PS C:\Windows\system32> cd C:\Users\Public\Downloads\
PS C:\Users\Public\Downloads> Get-ChildItem
ディレクトリ: C:\Users\Public\Downloads
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/12/06 19:47 115458048 amazon-cloudwatch-agent.msi
amazon-cloudwatch-agent.msi
をサイレント起動します。
PS C:\Users\Public\Downloads> msiexec /i amazon-cloudwatch-agent.msi /quiet
サービスの状態を確認します。「Stopped」になっていることを確認しました。
PS C:\Users\Public\Downloads>
Get-Service | Where-Object { $_.DisplayName -like "*CloudWatch*" }
Status Name DisplayName
------ ---- -----------
Stopped AmazonCloudWatc... Amazon CloudWatch Agent
(7) (3)で作成したリソースを削除する
(割愛します)
(8) Amazon CloudWatch Agent の 設定ファイル を作成する
Amazon CloudWatch Agent はコンピューティングリソースの「agent、metrics、logs、traces」の値を CloudWatch に配信することができます。どのログ、CloudWatch ロググループ、ログの保持期間などの構成情報をJSON形式の設定ファイルに定義することが必要です。Windows Server の場合、C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\
に設定ファイルをデプロイする必要があります。設定ファイル名は任意で構いません。
設定ファイル(amazon-cloudwatch-agent.json
)を作成します。
PS C:\Users\Public\Downloads>
cd C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\
PS C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs>
vim amazon-cloudwatch-agent.json
本記事では、イベントログのINFORMATION
とERROR
レベルのログデータを CloudWatch に配信してみることにします。下記の内容をコピペしてください。log_group_name
とlog_stream_name
は任意の値を指定できます。
{
"logs": {
"logs_collected": {
"windows_events": {
"collect_list": [
{
"event_name": "System",
"event_levels": [
"INFORMATION",
"ERROR"
],
"log_group_name": "techblog_WindowsEventLogs/System",
"log_stream_name": "techblog_{instance_id}"
}
]
}
}
}
}
vim の場合は :wq
と保存してください。
(9) Amazon CloudWatch Agent を起動する
Amazon CloudWatch Agent を起動していきます。AmazonCloudWatchAgent has been started
と表示されると成功です。
PS C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs>
& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -s -c file:amazon-cloudwatch-agent.json
****** processing amazon-cloudwatch-agent ******
I! Trying to detect region from ec2
D! [EC2] Found active network interface
I! imds retry client will retry 1 timesSuccessfully fetched the config and saved in C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_amazon-cloudwatch-agent.json.tmp
Start configuration validation...
2024/12/06 20:55:39 Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_amazon-cloudwatch-agent.json.tmp ...
2024/12/06 20:55:39 I! Valid Json input schema.
I! Trying to detect region from ec2
D! [EC2] Found active network interface
I! imds retry client will retry 1 times2024/12/06 20:55:39 Configuration validation first phase succeeded
Configuration validation second phase succeeded
Configuration validation succeeded
AmazonCloudWatchAgent has been stopped
AmazonCloudWatchAgent has been started
動作確認
CloudWatchコンソールのロググループを確認すると、設定ファイルで指定した ロググループ と ログストリーム が生成されています。
ログイベント に記録されていれば成功です。
さいごに
Windows Server のプロセス監視やログ収集を目的としてロギングエージェントを導入するシナリオは非常に一般的です。導入時の注意点や手順の流れについて、このブログが少しでも参考になれば幸いです!
Discussion