☁️

【ハンズオン】Windows Server 2025 の イベントログ を CloudWatch Logs に収集してみた

2024/12/07に公開

こんにちは、𝙆.𝙈𝙪𝙧𝙖𝙠𝙖𝙢𝙞(@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

https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-create-vpc.html#create-vpc-endpoints

下表は、ssmの構成情報になります。残り2つは、「VPCエンドポイント名」と「サービス」項目の設定値をec2messagesssmmessagesに変えて作成してください。

項目 設定値(例)
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

本記事では、イベントログのINFORMATIONERRORレベルのログデータを CloudWatch に配信してみることにします。下記の内容をコピペしてください。log_group_namelog_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