はじめに
本記事はAWS環境においてCloudWatch エージェントを導入し、EC2及びECSに対してサーバ監視を行うための方法について記載しています。
CloudWatchはAWS環境におけるモニタリングシステムの総称です。
現在はSyntheticsなどの機能も充実しているため、アプリケーションのフロントエンドや、API監視等エンドポイントに対する監視も行うことができます。
CloudWatchのサーバ監視は従来の監視システムのように監視対象のサーバにエージェントをインストールし、マネージャーとなる管理サーバから監視するPull型ではなく、エージェントからメトリクスをCloudWatchに送信するPush型の監視方式になります。
CloudWatchを使用してEC2に対するサーバ監視を行う場合、標準メトリクスを用いた監視は限定的です。
CPU使用率などは標準メトリクスで監視可能ですが、メモリ使用率や、ディスク使用率等の監視を行うためにはCloudWatch エージェントをインストールしてカスタムメトリクスを取得するための設定が必要です。
CloudWatch エージェントの構築(EC2)
EC2を複数台運用しているなど環境に応じて、最適な構築及び運用方法は異なります。
環境に応じた最適な構築を行うためには、メトリクスを取得するために必要となる設定を理解することが重要です。
CloudWatch エージェントの導入方法は複数の手段があります。
以降、コマンドラインのインストールを軸に導入方法について解説します。
ロールの設定
前提としてCloudWatch エージェントを使用してメトリクスを書き込むためには、EC2に付与するロールに対して適切な権限が必要です。
IAMから使用するロールに対して、CloudWatchAgentServerPolicyのポリシーを付与します。
また、CloudWatch エージェントの設定として、AWS Systems ManagerのParameter Storeに設定値を書き込むためには、CloudWatchAgentAdminPolicyのポリシーが必要です。
なお、ロールの設定はインストール後でも大丈夫です。
CloudWatch エージェントのインストール
CloudWatch エージェントのインストール(コマンドライン)
コマンドラインのインストール方法を理解することで、後述するユーザーデータに渡すcloud-initなどと組み合わせた応用的な構築方法が実現できます。
インスタンスのOSがAmazon Linux 2の場合は、以下のコマンドを実行することでCloudWatch エージェントのインストールができます。
$ sudo yum install amazon-cloudwatch-agent
出力例
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00:00
Resolving Dependencies
--> Running transaction check
---> Package amazon-cloudwatch-agent.x86_64 0:1.247350.0-1.amzn2 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=================================================================================================================================================================
Package Arch Version Repository Size
=================================================================================================================================================================
Installing:
amazon-cloudwatch-agent x86_64 1.247350.0-1.amzn2 amzn2-core 45 M
Transaction Summary
=================================================================================================================================================================
Install 1 Package
Total download size: 45 M
Installed size: 203 M
Is this ok [y/d/N]: y
Downloading packages:
amazon-cloudwatch-agent-1.247350.0-1.amzn2.x86_64.rpm | 45 MB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
create group cwagent, result: 0
create user cwagent, result: 0
Installing : amazon-cloudwatch-agent-1.247350.0-1.amzn2.x86_64 1/1
Verifying : amazon-cloudwatch-agent-1.247350.0-1.amzn2.x86_64 1/1
Installed:
amazon-cloudwatch-agent.x86_64 0:1.247350.0-1.amzn2
Complete!
CloudWatch エージェントの設定
CloudWatch エージェントをインストール後、メトリクスを取得するためにはCloudWatch エージェントの設定が必要です。
CloudWatch エージェントの設定はagent
、metrics
、logs
の3つのセクションを持つJSONファイルに定義します。
従って、CloudWatch エージェントの設定を示すJSONファイルの仕様を満たしていれば、作成済みJSONのファイルを流用したり、新規に作成して構築することもできます。
初めて構築する場合はウィザードを使用して設定するのがお勧めです。
最適化されたデフォルトの設定値が記述された設定ファイルが生成されます。
ウィザードを使用して、CloudWatch エージェントの設定を行うためには以下のコマンドを実行します。
コマンド実行後、セクション毎に設定値を入力していきます。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
以下はコマンドの実行例です。
================================================================
= Welcome to the Amazon CloudWatch Agent Configuration Manager =
= =
= CloudWatch Agent allows you to collect metrics and logs from =
= your host and send them to CloudWatch. Additional CloudWatch =
= charges may apply. =
================================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
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]:
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [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 want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
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?
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]:
Do you want to aggregate ec2 dimensions (InstanceId)?
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]:
このセクションでここまでの設定値が反映されたJSONが出力されます。
出力例
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 60
},
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"statsd": {
"metrics_aggregation_interval": 60,
"metrics_collection_interval": 10,
"service_address": ":8125"
}
}
}
}
JSON確認後、引き続きウィザードで設定値を入力します。
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 have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
Log file path:
Log group name:
default choice: [.]
Log stream name:
default choice: [{instance_id}]
Log Group Retention in days
1. -1
2. 1
3. 3
4. 5
5. 7
6. 14
7. 30
8. 60
9. 90
10. 120
11. 150
12. 180
13. 365
14. 400
15. 545
16. 731
17. 1827
18. 3653
default choice: [1]:
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
このセクションで以下、パラメータストアの設定を除く、全ての設定値が反映されたJSONが出力されます。
出力例
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "",
"log_group_name": ".",
"log_stream_name": "{instance_id}",
"retention_in_days": -1
}
]
}
}
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 60
},
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"statsd": {
"metrics_aggregation_interval": 60,
"metrics_collection_interval": 10,
"service_address": ":8125"
}
}
}
}
最後にAWS Systems Manager(旧称 SSM)のパラメータストアに設定値を保存されるか聞かれます。
以下の例では保存しないため、2
を選択しています。
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/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]:
2
Program exits now.
上記コマンド実行後、CloudWatchの設定値が記述されたJSON形式の/opt/aws/amazon-cloudwatch-agent/bin/config.json
ファイルが生成されます。例えば、当ファイルを事前に用意することで、インスタンス作成時のスクリプトや、AnsibleなどIacに組みこむなどの応用ができます。
collectdのインストール
要件としてメモリ使用率や、ディスク使用率を取得したいだけであれば、はcollectdのインストールは不要です。
アプリケーションやサービスから追加のメトリクスを取得する場合はcollectdを追加でインストールします。
$ sudo amazon-linux-extras install collectd
CloudWatch エージェントの起動
CloudWatchの設定及び必要に応じてcollectdをインストール後、 CloudWatch エージェントを起動します。
CloudWatch エージェントを起動するためには以下のコマンドを実行します。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
出力例
****** processing amazon-cloudwatch-agent ******
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source file:/opt/aw
s/amazon-cloudwatch-agent/bin/config.json --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-clou
dwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwa
tch-agent/etc/common-config.toml --multi-config default
2022/06/06 10:25:38 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
Valid Json input schema.
I! Detecting run_as_user...
No csm configuration found.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
amazon-cloudwatch-agent has already been stopped
Created symlink from /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service to /etc/systemd/system/amazon-cloudwatch-agent.service.
Redirecting to /bin/systemctl restart amazon-cloudwatch-agent.service
CloudWatch エージェント起動後、カスタムメトリクスによる監視が始まります。
エージェント起動後、正常に監視ができていないと思われる場合は、/var/log/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log
ファイルを参照し、ログファイルにエラーが出力されていないか確認します。
例として、EC2インスタンスのロールに対する、適切な権限がない場合は以下のようなエラーが出力されます。
- エラーの出力例
2022-06-06T10:42:39Z E! cloudwatch: code: AccessDenied, message: User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/Ec2CdkStack-ec2Rolehoge/hoge is not authorized to perform: cloudwatch:PutMetricData because no identity-based policy allows the cloudwatch:PutMetricData action, original error: <nil>
2022-06-06T10:42:39Z W! 0 retries, going to sleep 200ms before retrying.
2022-06-06T10:42:39Z E! WriteToCloudWatch failure, err: AccessDenied: User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/Ec2CdkStack-ec2Rolehoge/hoge is not authorized to perform: cloudwatch:PutMetricData because no identity-based policy allows the cloudwatch:PutMetricData action
status code: 403, request id: 67202b5b-de6c-4843-8cad-dbdbe790a3f0
2022-06-06T10:43:05Z W! [processors.ec2tagger] ec2tagger: Error refreshing EC2 tags, keeping old values : +UnauthorizedOperation: You are not authorized to perfo
rm this operation.
CloudWatch エージェントの停止
取得するメトリクスを変更するなど、/opt/aws/amazon-cloudwatch-agent/bin/config.json
ファイルを変更した場合はプロセスの再起動が必要です。
CloudWatch エージェントを停止する場合は以下のコマンドを実行します。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop
CloudWatch エージェントのインストール(Run Command)
AWS Systems ManagerのRun Commandを使用して、複数のEC2インスタンスに対するCloudWatch エージェントのインストール、アンインストール、設定などの作業も一括で行うことができます。
具体的な手順については以下公式の「Systems Manager Run Command を使用して CloudWatch エージェントを起動する」を参照。
CloudWatch エージェントのインストール(cloud-int)
EC2インスタンスを起動する際に、ユーザーデータとしてスクリプトなどを渡すことでOSやMWの初期構築が簡単できます。
EC2ではシェルスクリプトと、cloud-initが使用できます。
EC2の起動テンプレートに、CloudWatch エージェントのインストール〜起動までの手順を組み込む例について以下に記載します。以下ではOSはAmazon Linux 2とし、ユーザーデータにcloud-intを用いてruncmd
に必要な構築手順を記述しています。
#cloud-config
uncmd:
- yum install -y amazon-cloudwatch-agent
-
- sh
- -c
- |+
cat > /opt/aws/amazon-cloudwatch-agent/bin/config.json <<EOF
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "\${aws:AutoScalingGroupName}",
"ImageId": "\${aws:ImageId}",
"InstanceId": "\${aws:InstanceId}",
"InstanceType": "\${aws:InstanceType}"
},
"metrics_collected": {
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
}
}
}
}
EOF
- /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
上記の例ではヒアドキュメントを用いてJSONファイルを作成しています。ヒアドキュメントの注意事項として、JSONファイルの中身を直接記述すると、上記の場合はappend_dimensions
の値に$
が入っているので変数展開されると値が空になってしまうため、正しく起動ができません。そのため、\
を足してエスケープすることで変数展開を回避しています。
CloudWatch エージェントのメトリクス確認
CloudWatch エージェント起動後、正常にメトリクスが取得できていることを確認します。
正常に取得できている場合はコンソール画面から、CloudWatchのメトリクスに「CWAgent」が追加されているのが確認できます。
「CWAgent」を押すと、設定した名前空間毎に対象のメトリクスが確認できます。
CloudWatch エージェントの構築(ECS)
ECS(起動タイプはEC2)を使用している環境で、何らかの理由でホストとなるEC2のメモリやディスク使用率を取得する監視要件がある場合、ECSでデプロイしたタスク定義のコンテナでホストのメトリクスを取得する方法について以下に記載します。
なお、EC2は事前に用意済みで適切なロールが付与されていて、ECSのクラスターも作成されていることを前提とします。
基本的には行う作業は以下になります。本記事ではポイントのみ解説します。
- IAMでECSのタスク定義に付与する、タスクロール及びタスク実行ロールの作成
- SSMにてパラメータの作成
- ECSのタスク定義及びサービスの作成
IAMでECSのタスク定義に付与する、タスクロール及びタスク実行ロールの作成
Amazon ECS での CloudWatch エージェントと X-Ray デーモンのデプロイを参考にしながら、事前にロールを作成します。
タスクロールはコンテナで使用されるIAMロールです。
コンテナがCloudWatchにメトリクスを書き込むために、CloudWatchAgentServerPolicyのポリシーを付与します。
また、タスク実行ロールはAWSのAPIを実行するために使用されるIAMロールのことです。
コンテナログをCloudWatchにログ転送する用途などで使用されます。
タスク実行ロールには以下のポリシーを付与します。
-
AmazonSSMReadOnlyAccess
-
AmazonECSTaskExecutionRolePolicy
-
CloudWatchAgentServerPolicy
SSMにてパラメータの作成
SSMのパラメータストアにて、取得するメトリクスを定義したパラメータ(JSON)を作成します。
ECSのタスク定義及びサービスの作成
タスクで使用するイメージはcloudwatch-agent/cloudwatch-agentを指定します。
メトリクスを取得するためのCloudWatchの設定値は、環境変数に渡すことでSSMのパラメータから取得することができます。環境変数のキーCW_CONFIG_CONTENT
に指定する値はパラメータストアで定義した名前と同じ名前を指定します。
必要に応じてログ出力を行う場合は以下のような設定を行います。awslogs-create-group
オプションを指定することで、ロググループが自動的に作成されます。
タスク作成後、サービスを作成します。サービススケジューラはDAEMONで良いでしょう。
サービス作成後タスクのデプロイを行い、CloudWatch エージェントのコンテナから、EC2のホストに対するメトリクスが取得できていることが確認できます。以下はディスクの空き容量の例です。
CloudWatch エージェントの設定について、ディスクのresources
オプションにはマウントポイントを指定します。ファイルシステム名を指定した場合は監視することができません。
おわりに
目的に対して意図した監視ができるかどうかを確認するためには、公式ドキュメントを読むのが一番です。
一次情報に触れることで構築手順の最適化や、仕様に対する理解が深まります。