EC2(Ubunutu)のcloudwatchエージェントのインストール方法【AWS】

cloudwatchアイキャッチ画像

EC2(Ubunutu)のcloudwatchエージェントのインストール方法【AWS】

CloudWatchの概要

Amazon CloudWatchは、AWSリソースやアプリケーションの監視を行うサービスです。

CPU使用率などのシステムのパフォーマンスを示す時系列のデータポイント(測定値)のセットをメトリクスと呼び、このメトリクスの取得やそれをもとにしたしきい値監視はCloudWatchの代表的な機能です。

CloudWatchは、監視の基本機能にとどまらず、ロギング(ログの収集)やイベント管理機能、情報集約のためのダッシュボードなど多岐にわたる機能を提供します。

参考:参考:AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解)

CloudWatchはAWS監視の代表的な機能ですね。コストの監視もできるのでAWSを使用したことがある人は誰でもみたことがあるサービスだと思います。

CPU使用率、ディスク使用率、ネットワークなどの情報を取得でき大変便利です。

そんな大変便利なCloudWatchですが、欠点が1つあります。

それは”詳細情報までは取得できない”ということです。

例えば下の図を見てください。

AWS CloudWatchCPU使用率

図を見ると基本的にはCPU使用率は20%未満で収まっているのですが、一部CPU使用率が40%台まで急増しているのがわかると思います。

アプリが原因かと思われますが、CloudWatchでは「何のプロセスが」「どのくらい」CPUを食っているのかわかりません。

これでは問題が発生しても原因が特定できないので、監視の意味がありませんね。

そこで使用するのがCloudWatchエージェントです。

CloudWatchエージェントを用いればプロセス監視もできるようになるので、監視の粒度がぐっとあがります。

また導入も非常に楽なので、AWSを使用している方はぜひ導入を検討してみてください。

CloudWatcエージェントの導入手順

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

まず初めに監視対象のEC2(今回はUbuntu)にCloudWatchエージェントをインストールしてみます。

AWS公式サイトよりCloudWatchエージェントのダウンロードリンクを確認してみましょう

下記のサイトにサクセスしUbuntuのダウンロードリンクをコピーします

Ubuntuのダウンロードリンク

UbuntuのAWSダウンロードリンク

上記リンクをコピーしたら「wget」コマンドで取得しましょう。

EC2インスタンスへSSH接続後、下記コマンドを実行

wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
wget実行コマンド

一応「ls」で状況確認。ダウンロードできてますね

ls確認結果

この「deb」パッケージを解凍します。下記コマンドを実行

sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
sudo結果

次にウィザードで設定ファイル(json)を作成します、下記コマンドを実行

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

質問は下記のように回答してください。

※基本的にデフォルトの回答で問題ないですが、下記の18番目と10番目の質問はデフォルトとは違うので気をつけてください。
・Do you want to monitor any log files?
・Do you want to store the config in the SSM parameter store?

ubuntu@ip-10-0-10-235:~$ 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]:

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"
}
}
}
}
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]:
2
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
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"
}
}
}
}
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.

インストール確認

下記コマンドを実行してインストールを確認します。

apt list --installed | grep cloudwatch
apy実行結果

EC2インスタンスにCloudWatchエージェントの権限を付与

次にCloudWatchエージェントをインストールしたEC2がCloudWatchにアクセスできるように権限を付与します。

IAMロールの作成

IAMのダッシュボードに移動し左側のロールを選択、「ロールを作成」をクリック

IAMロールダッシュボード

下記のように情報を入力

IAM信頼されたエンティティを選択

CloudWatchAgentAdminPolicyとCloudWatchAgentServerPolicyにチェックを入れて「次へ」を選択

IAM CloudWatchエージェント権限

確認画面です、任意のロール名を入力して「ロールを作成」をクリック

IAMロール権限確認

ロールの作成が完了しました。

次はEC2にアタッチしていきましょう。

アタッチ完了画面

EC2にIAMロールをアタッチ

EC2のダッシュボードに移動してアクション→セキュリティ→IAMロールを変更をクリック

IAMロール変更画面

先ほど作成したIAMロールを選択します。

IAMロール変更画面

確認

EC2インスタンス詳細画面の「セキュリティ」よりIAMロールが変更になっているのを確認できます。

インスタンスのIAMロール画面

CloudWatchエージェント設定ファイルの配置

下記ディレクトリに移動して、CloudWatch設定ファイルを配置します。

cd /opt/aws/amazon-cloudwatch-agent/etc 
sudo vi amazon-cloudwatch-agent.json

設定ファイル(amazon-cloudwatch-agent.json)は以下のように設定してください。

{
        "metrics": {
                "metrics_collected": {
                        "procstat": [
                                {
                                        "exe": "ubuntu",
                                        "measurement": [
                                                "cpu_time",
                                                "pid_count"
                                        ]
                                }
                        ]
                }
        }
}

AmazonCloudWatchエージェントのサービスを再起動させます。

sudo systemctl restart amazon-cloudwatch-agent
systemctl status amazon-cloudwatch-agent

導入確認

ではCloudWatchエージェントを用いてログが収集できているのを確認してみましょう。

CloudWatchのダッシュボードに移動し「すべてのメトリクス」をクリック「CWAgent」ができているので、こちらのリンクをクリック

CWAgent リンク確認画面

すると下記のような図が出ますのでsshdをチェック、実際にsshdのプロセスを取得できていることが確認できました。

※色々実験してたので、表示は異なります。

sshdクラウドウォッチ確認画面

CloudWatchエージェントは今まで触ったことがなかったのですが、導入が非常に楽でびっくりしました。

簡単に導入できるので、AWSを使用されている方はぜひ導入を検討してみてください。

以上です。誰かの参考になれば幸いです。