BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】EC2インスタンスのログをCloudWatchに出力する(CloudWatchエージェントを導入する)方法[Windows編]

こんにちは!
BFT名古屋支店の、佐野です。

前回の記事ではLinuxインスタンスにCloudWatchエージェントを導入し、CloudWatchへインスタンスのログを出力する手順を解説しました。
そして今回は、同じことをWindows(Windows server2019)のインスタンスで行なう手順をお送りいたします。

前回の記事で少しだけ触れた通り、全体的な流れはLinuxの場合とほぼ同じです。
しかしインストーラをダウンロードする経路が少々違ったり、CloudWatchエージェント設定時の質問が異なったりと、細かい違いがぽつぽつとありますので、別記事として述べさせていただきます。
(前回の記事を経由せず、検索などでこちらに直接来る方もおられると思います)


はじめに

今回に関してはWindowsのシステムログを出力することをゴールとして解説していきます。
CloudWatchエージェントインストール時の途中に出力するログを追加できる選択肢がありますので、もしシステム以外のログを出力したい場合は別途その際に追加してください。


インスタンスへ割り当てるIAMロールの作成

Linuxの手順でも述べましたが、インスタンスがCloudWatchにログを出力するには、インスタンス自体がCloudWatchにアクセスし、ログを書き込む権限が必要になります。
勿論これはWindowsの場合でも同じですので、最初にCloudWatchにログを書き込む為の権限を持つIAMロールを作成します。
(この部分はLinuxの場合の手順と同様になります)

まずAWSマネジメントコンソールからIAMを選択し、ロール項目の中にある「ロールの作成」を選択します。
そしてユースケースの選択から「EC2」を選択し、さらに「次のステップ:アクセス権限」を選択します。

f:id:bftnagoya:20201204185545p:plain

Attach アクセス権限ポリシーにて以下のポリシー2つを選択し、「次のステップ:タグ」を選択します。

  • CloudWatchAgentAdminPolicy
  • CloudWatchAgentServerPolicy

f:id:bftnagoya:20201204185549p:plain

タグの設定画面では任意のタグを入力(しなくてもOKです)し、「次のステップ:確認」を選択。
確認画面では任意のロール名とロールの説明を入力した後「ロールの作成」選択します。
(ロールの説明は必須項目ですが、デフォルトのままでもOKです)

作成後はAWSマネジメントコンソールに戻ってEC2を選択し、今回CloudWatchにログ出力させるインスタンスを選択後、以下の手順で作成したIAMロールをインスタンスにアタッチします。 (2020/12/4 現在)

  1. 「アクション」を選択
  2. 展開されたメニューから「セキュリティ」を選択
  3. さらに「IAMロールの変更」を選択
  4. 「IAMロール」で作成したIAMロールを選択して「保存」を選択

f:id:bftnagoya:20201204185557p:plain

f:id:bftnagoya:20201208114953p:plain

これでCloudWatchにログを書き込む権限をインスタンスに付与できたことになります。


CloudWatchエージェントのインストール

権限の準備はIAMロールを付与することで整いましたので、次はCloudWatchエージェントのインストールを行ないます。
まずは以下のURLからCloudWatchエージェントのインストーラーをダウンロードします。

https://s3.amazonaws.com/amazoncloudwatch-agent/windows/amd64/latest/amazon-cloudwatch-agent.msi
※AWSの公式ドキュメントからアナウンスされているURLです。

CloudWatchエージェントを導入するインスタンス以外でダウンロードした場合は、対象のインスタンスにRDP接続などを行ない、インストーラを対象のインスタンスにコピー&ペーストしてください。
その際の場所は任意で大丈夫ですが、迷った時はデスクトップ上に配置してください。
インストーラは変更なければ「amazon-cloudwatch-agent.msi」というファイル名称になります。

導入するインスタンス上にインストーラをダウンロードないし配置したら、そのインストーラを実行してください。
CloudWatchエージェントのインストールが自動的に進められ、特に確認などなくインストールは自動的に完了・終了されます。

インストーラの終了後、インストールがされたことを確認するためにステータスとバージョンの確認を行ないます。
インスタンスWindows PowerShellを起動し、以下のコマンドを実行してださい。
実行した結果“status”が“stopped”になっていて、“version”が表示されていれば、正常にインストールされています。

& $Env:ProgramFiles\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1 -m ec2 -a status

以上でCloudWatchエージェントのインストールは完了になりますが、Linuxの場合と同様、CloudWatchエージェントをインストールしただけではCloudWatchにログが出力されません。
CloudWatchにログを出力するためには、この後に行なうCloudWatchエージェントの設定が必要となります。


CloudWatchエージェントの設定

今回はCloudWatchエージェント設定ファイルを作成するウィザードを使用します。
これを実行するとWindowsの場合は約23問の質問が提示され、それに回答を入力していく形で設定が進められます。
Linuxの場合よりも質問数が少し多めですが、ほとんどデフォルト設定で問題ありません。
ただしメトリクス(数値項目)に関連する箇所と、どのログを取得するか設定する箇所のみ、デフォルトでない設定とすることを考慮する必要があります。

まずはインスタンスコマンドプロンプトを起動し、以下のコマンドを順に実行してCloudWatchエージェントの設定ウィザードを起動させましょう。

cd "C:\Program Files\Amazon\AmazonCloudWatchAgent"
amazon-cloudwatch-agent-config-wizard.exe

CloudWatchエージェントの設定ウィザードが起動したら、表示される質問に対し回答を行なっていきます。
その中で要注意となる質問は以下の通りです。

  • [12番目] デフォルトのメトリクス設定としてどのレベルが必要か?
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None

選択したものに応じてCloudWatchで取得できるメトリクス(数値項目)に違いがあります。
ログの取得のみを目的とするならばBasicあるいはNoneで問題ありませんが、もしメトリクスの取得にも重点を置いているならば吟味しましょう。
レベルによるメトリクスの取得項目は以下の通りです。
(Windows serverをOSとするEC2インスタンスの場合)

レベル メトリクス
Basic Memory % Committed Bytes In Use
LogicalDisk % Free Space
Standard Memory % Committed Bytes In Use
Paging File % Usage
Processor % Idle Time、Processor % Interrupt Time、Processor % User Time
PhysicalDisk % Disk Time
LogicalDisk % Free Space
Advanced Memory % Committed Bytes In Use
Paging File % Usage
Processor % Idle Time、Processor % Interrupt Time、Processor % User Time
LogicalDisk % Free Space
PhysicalDisk % Disk Time、PhysicalDisk Disk Write Bytes/sec、PhysicalDisk Disk Read Bytes/sec、PhysicalDisk Disk Writes/sec、PhysicalDisk Disk Reads/sec
TCPv4 Connections Established、 TCPv6 Connections Established
  • [15番目] Windowsイベントログを監視しますか?
Do you want to monitor any Windows event log?
1. yes
2. no


(1を選択すると以下のように表示)
Windows event log name:

Windowsのイベントログを取得するかどうかの質問です。
システムログはイベントログのひとつですので、1.yesで回答します。
その後どのイベントログを取得するかを問われますので、システムログを表す「System」を入力します。
もしシステムログを取得せず、他の種類のイベントログを取得したい場合は、そのイベントログ名を指定することでそのログを取得することができます。

またこの後のいくつかの質問を解凍した後、以下の質問が出されます。

Log group name:

(Log file pathを入力後)
Log stream name:

Log group nameはCloudWatch上のロググループの名称となります。
CloudWatchではロググループというくくりでログをまとめていますので、ログの保存先となるロググループ名をここで入力します。
特に指定はないので、デフォルトのまま、あるいは任意の名称を入力して問題ありません。
また任意の名前とする場合、取得先のホスト名を変数として使用できる以下の例がおすすめです。

{local_hostname}_System

Log stream nameはロググループ内に作成されるログそのものの名称です。
こちらも特に指定はありませんので、デフォルトあるいは任意の名称を入力して問題ありませんが、インスタンスIDを表示できる以下の例がおすすめとなります。

{local_hostname}_{instance_id}
  • [22番目] 監視する追加のWindowsイベントログを指定しますか?
Do you want to specify any additional Windows event log to monitor?
1. yes
2. no

15番目の質問で設定したログの他にも取得したいログがある場合は1.yes、そうでない場合は2.noを選択してください。
1.yesを選択した場合は15番目の質問同様、取得したいイベントログ名、Log group name、Log stream nameを聞かれることになります。
ここでCloudWatchにログを出力するログファイルを指定した後も、繰り返しこの質問が提示されますので、出力したい分のログファイルを全て追加した後、2.noを選択してください。

以上3項目が要注意とすべき質問となります。
全て回答をし終えると、そのままウィザードが終了します。
これでCloudWatchエージェントの設定ファイルの作成は完了です。


CloudWatchエージェントの起動

実際にCloudWatchエージェントを起動し、ログが取得できるかを確認します。
PowerShellを起動してから以下のコマンドを実行し、作成した設定ファイルをCloudWatchエージェントに反映してCloudWatchエージェントを起動させます。

& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -c file:"C:\Program Files\Amazon\AmazonCloudWatchAgent\config.json" -s

さらに以下のコマンドを実行して、CloudWatchエージェントの“status”が“running”となっていることを確認します。

& $Env:ProgramFiles\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1 -m ec2 -a status

CloudWatchエージェントが起動していることを確認したら、一度AWSマネジメントコンソールに戻り、CloudWatchを選択します。
そしてメニューからロググループを選択し、ロググループの一覧の中から先程設定したLog group nameと同じ名前のロググループを選択します。
その中に設定したLog stream nameの名前でログストリームが出力されていれば、CloudWatchへのログ出力が成功しています。


最後に

今回はWindowsにおけるCloudWatchエージェントの導入と、CloudWatchへのログ出力の方法を解説しました。
前回のLinuxでの方法と合わせて、EC2インスタンスのログの出力(および監視)はほぼカバーできるかと思います。

またLinuxの場合に触れたのと同じく、プライベートサブネット上に存在するインスタンスでCloudWatchにログを出力したい場合、S3の場合などと同じくVPCエンドポイントの設定が必要となります。
次回以降それについても軽く触れていきます。