変更(!?) WindowsインスタンスのログをCloudWatch Logsに転送する設定方法

記事タイトルとURLをコピーする

JAWS DAYS 2017も終わり。。春分の日も終わり。。。季節も春で暖かいかな?・・・と思いきや、日々の気温は上がったり下がったり。。

こんにちわ。週間天気予報の気温予報に一喜一憂している技術3課のすぎたに(わんころまる)です。

さて、先日Windowsインスタンスに WindowsログをCloudWatch Logsに転送する設定 をしていたのですが、うまくログがCloudWatch Logsに送られてこないのでAWSドキュメントを読み直したら、設定方法が変わっていた(追加された?)様なので、再操作したことをブログにしたいと思います。

良くなったCloudWatch のインスタンス設定

今までは、Launchしたインスタンスにリモートデスクトップでログインし、その中で設定ファイルを作成したり、Windows サービスのコントロールパネルからSSMエージェントを開始または再起動して設定を反映させる必要がありました。その方法もAWSドキュメントには書かれています。(CloudWatch のインスタンスを設定する » ローカル設定ファイルを使用して CloudWatch にインスタンスメトリクスを送信する
しかし、今回ご紹介させて頂く State Manager を使用する の方法ではWindowsインスタンスにログインすることなく作業を完結させることができます。

設定した時の情報

操作したときの情報は下記の通りです。過去にも設定方法の変更があったようなので今回操作した日付も書いておきますね。

評価に使ったWindowsインスタンス Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2017.01.11 (ami-e4394483)
実施日付 2017/03/18

WindowsインスタンスにはSSMやCloudWatch Logsへの権限となるIAM Roleを付ける必要があります。必ずWindowsインスタンスをLaunchするときにIAM Roleを付けて下さいね。こんな感じにしました。

IAM Role名 WindowsLog2CloudWatchLogs_role(好きな名前をつけてください)
管理ポリシー AmazonEC2RoleforSSM

ポリシー`下記の通り

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudwatch:*",
                "logs:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

Windowsインスタンスに最新バージョンのEC2Configをインストールする。

ドキュメントによると最新バージョンのEC2Config、SSMエージェントを使うことが推奨されている様なので(Systems Manager の前提条件)、更新をしておきます。Run CommandをつかうとWindowsインスタンスにRDPでログインする必要なく、複数台の構築の際は一度に更新ができますので便利です。

手順

  • EC2のマネージドコンソールより、左サイドにあるRun Commandを選択
  • Run Commandボタンを押す
  • Run a Commandの画面が表示される
  • Command Documentより、AWS-UpdateEC2Configを選択する
  • 画面を下にスクロールし、Target InstancesにあるSelect instancesのボタンを押す
  • 更新対象のインスタンスを選択する
  • そして最後に画面最下部にあるRunボタンを押す

これで、指定したWindowsインスタンスのEC2ConfigとSSM エージェントを更新インストールできます。
参考AWSドキュメント SSM エージェントのインストールと更新

CloudWatch Logに転送するWindowsインスタンスのログを決めるJSONファイルを用意する。

今回WindowsサーバーからCloudWatch Logsに転送するWindowsログは以下の3つとします。

  • Windows アプリケーションイベントログデータ(ApplicationEventLog)
  • セキュリティログデータ(SecurityEventLog)
  • システムイベントログデータ(SystemEventLog)

また、CloudWatch Logsに転送する際の、その他設定項目は以下の通りとしました。

取得するログレベル
CloudWatch Logsの保存期間設定(Expire Events After) 失効しない(Never Expire)
Log Group Name WANKORO-Windows-Log-Group(自由に設定して下さい)
  • 以上をふまえたJSONファイルの記述は以下の様になります
{
  "IsEnabled": true,
  "EngineConfiguration": {
    "Components": [
      {
        "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
        "Id": "ApplicationEventLog",
        "Parameters": {
          "Levels": "7",
          "LogName": "Application"
        }
      },
      {
        "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
        "Id": "SystemEventLog",
        "Parameters": {
          "Levels": "7",
          "LogName": "System"
        }
      },
      {
        "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
        "Id": "SecurityEventLog",
        "Parameters": {
          "Levels": "7",
          "LogName": "Security"
        }
      },
      {
        "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
        "Id": "CloudWatchLogs",
        "Parameters": {
          "AccessKey": "",
          "LogGroup": "WANKORO-Windows-Log-Group",
          "LogStream": "{instance_id}",
          "Region": "ap-northeast-1",
          "SecretKey": ""
        }
      }
    ],
    "Flows": {
      "Flows": [
        "ApplicationEventLog,CloudWatchLogs",
        "SecurityEventLog,CloudWatchLogs",
        "SystemEventLog,CloudWatchLogs"
      ]
    },
    "PollInterval": "00:00:15"
  }
}

CloudWatch Logsの設定をする。

では、作成したJSONファイルをWindowsインスタンスに設定して、WindowsインスタンスのログがCloudWatch Logsに転送されるように設定してみましょう。
以前はWindowsインスタンスにリモートデスクトップでログインしJSONファイルを指定されたフォルダーの指定されたファイル名で保存する必要がありましたが、EC2コンソールのSYSTEMS MANAGER SERVICESにあるState Managerから設定するとWindowsインスタンスにログインすること無く設定ができるので便利ですね。

では、やってみましょう!

  • マネージドコンソールでEC2の画面を開きます
  • 画面左サイドにあるSYSTEMS MANAGER SERVICESの下のState Managerをクリックします
  • Create Associationをクリックしてください
  • Select DocumentにあるAWS-ConfigureCloudWatchをクリックしてください
  • Document VersionでDefault version at runtimeを選択してください
  • 設定するWindowsインスタンスを選択して下さい
  • ParametersのPropertiesに先ほど作ったJSONファイルを貼り付けて下さい
  • そして Create Associationボタンをクリックしてください
  • 右下のCloseボタンを押して下さい
  • ※注意※これでおわりではありません!
  • 選択したインスタンスがStatus:Pendingで表示されています
  • そのインスタンスを選択して、Apply Association Nowボタンを押して下さい
  • 設定がWindowsインスタンスに設定されるとPendingがSuccessに変わります
  • 設定したJSONデータは、 C:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\AWS.EC2.Windows.CloudWatch.json ファイルに保存されてます。
  • なお、過去にEC2Config サービスを使用してローカル設定ファイルを使用するの方法でWindowsインスタンスのCloudWatch Logsを設定をされてた場合は、今回利用したState Managerの設定の方がEC2Configの設定より優先されます。

動作を確認する。

最後に動作確認をしてみましょう。
ログ転送を設定したWindowsインスタンスにログインするだけで、何行かのログがCloudWatch Logs画面、ロググループ名の下、さらにインスタンスIDの下に記録されていると思います。
もし、Windowsから意図的にテスト的なログイベントを発生させたい場合は、以下のようなコマンドをコマンドプロンプトかPower Shellで実行してみて下さい。
eventcreate /T ERROR /ID 1000 /L APPLICATION /D "Test Message 01"

  • こんな感じでログが保存される・・・の図

終わりに

はじめは設定方法が変わっていることに気づかず、「あれ?あれ?」状態でしたが、AWSドキュメントに立ち返ることが今回一番の早道でした。
次回、困ったときも、まずAWSドキュメントなど対象サービスのドキュメントをしっかり読む必要性を強く感じたものです。

う〜ん・・・今回はおもしろいオチを考えつくことはできませんでした。最後に、「サーバーワークスブログなのにこれでいいのか!?」というお叱りを受ける覚悟でポチっと投稿させて頂きます。