QUICKGUARD ホームページ >

AWS CloudWatch エージェントの設定をログインせずにやってみる

2018.10.25

前々回の「エンジニアのつぶやき備忘録」でAWS Systems Manager (SSM) Session Manager でインスタンス 操作を書きましたが、今日は応用編として、Windows Server で CloudWatch Logs へログを送る設定を リモートデスクトップなどでログインせずにやってみたいと思います。


環境

ちょっと古いWindows Server での対応を想定して、OSは Windows_Server-2008-R2 のEC2インスタンスを用意します。
使用したAMIは「Windows_Server-2008-R2_SP1-Japanese-64Bit-Base-2018.10.14」です。


EC2インスタンスの権限付与

EC2インスタンスに付与するIAMロールには、以下のポリシーの設定が必要です。

  • CloudWatchAgentServerPolicy
    CloudWatchエージェントがメトリクスを CloudWatch に送信する為の権限です。
  • CloudWatchAgentAdminPolicy
    EC2インスタンスからSystems Manager Parameter Store に設定ファイルを保存するための権限です。設定ファイルを Systems         Manager Parameter Store に保存しておくと、他のサーバーで同じエージェント設定を使用できるようになります
  • AmazonEC2RoleforSSM
    AWS Systems Manager の実行権限です。SSMを使うとインストールや設定が便利になります。

SSM Agent のインストール・更新

CloudWatch エージェントを使用するにはSSM Agentのバージョン 2.2.93.0 以降 が必要です。
使用したAMIにはSSM Agent がデフォルトでインストールされているので、EC2インスタンスの権限付与で AmazonEC2RoleforSSM を割り当てると マネージドインスタンスに表示されます。

CloudWatch エージェントにはSSM Agentのバージョン 2.2.93.0 以降 が必要ですので、SSM Agentのアップデートをします。
Run Command からAWS-UpdateSSMAgent を実行するのが簡単ですね。過去記事に詳しく書いてあるので、参考にしてください。
更新後のSSM Agentのバージョン は 2.3.136.0 でした。

SSM Agent がインストールされていないEC2インスタンスの場合は、手動でインストールが必要になりますので、こちらを参考にしてください。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-install-win.html


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

CloudWatch エージェントのインストールにもRun Commandが使用できます。
ドキュメント名にAWS-ConfigureAWSPackage を指定して、
[Action] リストで、[Install] を選択、
[Name] フィールドに、「AmazonCloudWatchAgent」と入力します。

CloudWatch エージェント設定ファイルを作成する

CloudWatch エージェントを起動する前に、EC2インスタンス上に設定ファイルを置く必要があります。
さすがにリモートデスクトップの出番か!?・・・いえいえ、過去記事を活かして、セッションマネージャーを使ってみましょう。今日は意地でもログインしない方向でセットアップしてみます。

CloudWatch エージェントの設定ファイルは、ウィザードを使用する方法と手動で設定しする方法があるのですが、試しにウィザードを使用して設定してみます。

まずは、インストールディレクトリに移動します。

PS C:\Windows\system32> cd 'C:\Program Files\Amazon'
PS C:\Windows\system32> cd 'C:\Program Files\Amazon\AmazonCloudWatchAgent'
PS C:\Program Files\Amazon\AmazonCloudWatchAgent> dir


    ディレクトリ: C:\Program Files\Amazon\AmazonCloudWatchAgent


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2018/10/25      3:07   11854336 amazon-cloudwatch-agent-config-wizard.exe
-a---        2018/10/25      3:07       8517 amazon-cloudwatch-agent-ctl.ps1
-a---        2018/10/25      3:07      17628 amazon-cloudwatch-agent-schema.json
-a---        2018/10/25      3:07   10360832 amazon-cloudwatch-agent-windows-migration.exe
-a---        2018/10/25      3:07   26575872 amazon-cloudwatch-agent.exe
-a---        2018/10/25      3:07    9486848 config-downloader.exe
-a---        2018/10/25      3:07   15305728 config-translator.exe
-a---        2018/10/25      3:07         11 CWAGENT_VERSION
-a---        2018/10/25      3:07       4705 LICENSE
-a---        2018/10/25      3:07         96 NOTICE
-a---        2018/10/25      3:07       2602 RELEASE_NOTES
-a---        2018/10/25      3:07    2445312 start-amazon-cloudwatch-agent.exe
-a---        2018/10/25      3:07     104223 THIRD-PARTY-LICENSES

ウィザードを起動して、順番に質問に答えていきます。


PS C:\Program Files\Amazon\AmazonCloudWatchAgent> .\amazon-cloudwatch-agent-config-wizard.exe
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [2]:
2
Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:

Which port do you want StatsD daemon to listen to?
default choice: [8125]

What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:

What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:

Do you have any existing CloudWatch Log Agent configuration file to import for migration?
1. yes
2. no
default choice: [2]:

Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:

Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:

Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:

Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:

Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:

Current config as follows:
{
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "Memory": {
                                "measurement": [
                                        "% Committed Bytes In Use"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "Paging File": {
                                "measurement": [
                                        "% Usage"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:

Do you want to monitor any customized log files?
1. yes
2. no
default choice: [1]:

Log file path:
C:\App\log\test/
C:\App\log\test.log
Log group name:
default choice: [test.log]

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any Windows event log?
1. yes
2. no
default choice: [1]:
2
Saved config file to config.json successfully.
Current config as follows:
{
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "C:\\App\\log\\test.log",
                                                "log_group_name": "test.log"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "Memory": {
                                "measurement": [
                                        "% Committed Bytes In Use"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "Paging File": {
                                "measurement": [
                                        "% Usage"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}
Please check the above content of the config.
The config file is also located at config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:

What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-windows]
AmazonCloudWatch-windows
Trying to fetch the default region based on ec2 metadata...
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]

Which AWS credential should be used to send json config to parameter store?
1. ASIAU4GBNZYD3N3WEACZ(From SDK)
2. Other
default choice: [1]:

Please make sure the creds you used have the right permissions configured for SSM access.
Which AWS credential should be used to send json config to parameter store?
1. ASIAU4GBNZYD3N3WEACZ(From SDK)
2. Other
default choice: [1]:

Please make sure the creds you used have the right permissions configured for SSM access.
Error in putting config to parameter store AmazonCloudWatch-windows: AccessDeniedException: User: arn:aws:sts::335413104135:assumed-role/CloudWatchAgentServerRole/i-0c58a9bd4238f21d4 is not authorized to perform: ssm:PutParameter on reso
urce: arn:aws:ssm:ap-northeast-1:335413104135:parameter/AmazonCloudWatch-windows
        status code: 400, request id: a7be8994-d574-4346-a87d-f68c2b2565e2
Please press Enter to exit...
exit
Program exits now.
PS C:\Program Files\Amazon\AmazonCloudWatchAgent> dir


    ディレクトリ: C:\Program Files\Amazon\AmazonCloudWatchAgent


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2018/10/25      3:07   11854336 amazon-cloudwatch-agent-config-wizard.exe
-a---        2018/10/25      3:07       8517 amazon-cloudwatch-agent-ctl.ps1
-a---        2018/10/25      3:07      17628 amazon-cloudwatch-agent-schema.json
-a---        2018/10/25      3:07   10360832 amazon-cloudwatch-agent-windows-migration.exe
-a---        2018/10/25      3:07   26575872 amazon-cloudwatch-agent.exe
-a---        2018/10/25      3:07    9486848 config-downloader.exe
-a---        2018/10/25      3:07   15305728 config-translator.exe
-a---        2018/10/25      3:52        821 config.json
-a---        2018/10/25      3:07         11 CWAGENT_VERSION
-a---        2018/10/25      3:07       4705 LICENSE
-a---        2018/10/25      3:07         96 NOTICE
-a---        2018/10/25      3:07       2602 RELEASE_NOTES
-a---        2018/10/25      3:07    2445312 start-amazon-cloudwatch-agent.exe
-a---        2018/10/25      3:07     104223 THIRD-PARTY-LICENSES


config.json という名前で設定ファイルができましたね。

パラメータストアにも、保存した設定ファイルが保存されています。

あらら??ログの部分しか保存されていないような・・・?

うーん・・・ウィザードで作成したjsonファイルをベースに作成して、手動で設定を完成させるのがいいかもしれませんね。

手動での設定内容はこちらを参考にしてください。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html


CloudWatch エージェントを開始する

CloudWatch エージェントの開始はRun Command から 実行できます。
ドキュメント名にAmazonCloudWatch-ManageAgent を指定して、
[Optional Configuration Location] にパラメータストアに保存した設定ファイルの名前を指定します。

今回は「AmazonCloudWatch-windows」です。その他のパラメータはデフォルト値のままです。

出力を確認すると、正常に完了しています。


以上で設定終わり!
どうですか?リモートデスクトップ不要で設定が完了しましたね。
Linux でもあまり手順には変わりがありませんので、お試しください。