amazon-cloudwatch-agentのインストールとAmazonLinux2のログとメモリ・ディスク使用率のCloudWatch設定
CloudWatch Logs エージェントの非推奨awslogsではなく、Amazon Linux 2 においての新しい統合CloudWatchエージェントのamazon-cloudwatch-agentによるEC2インスタンスであるAmazon Linux 2 のCloudWatchのログとメトリクス(メモリとディスクの使用率)の収集監視表示設定です。SSHで設定する場合です。この記事では、AWS Systems Manager(SSM)はウィザードでNoを選択しています。また,CloudWatchロググループのKMSのCMKを使った暗号化は別記事となります。
- IAM設定(EC2にアタッチされているIAMロールにIAMポリシーを追加)
- CloudWatchロググループ作成
- EPELパッケージ有効化
- collectdインストール
- CloudWatchエージェントをEC2インスタンスにインストール(SSH)
- CloudWatchエージェント設定ファイルをウィザードで作成
- ClouddWatchエージェントを起動
CloudWatch にメトリクスデータを書き込むためのアクセス許可IAMポリシー
IAMポリシーを作成。
ポリシー名 CloudWatch_PutMetricData
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "○△×○△×○△×○△×",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}
IAMロールにアタッチ
EC2インスタンスのIAMロールに上記のIAMポリシーをアタッチします。
- IAMへ
- ロールへ
- CloudWatchを設定しようとているEC2インスタンスにアタッチされたIAMロール名を選んでクリック
- 「ポリシーをアタッチします」をクリック
- 「CloudWatch_PutMetricData」のIAMポリシーにチェックを入れる
- 「ポリシーをアタッチ」
IAM設定(EC2にアタッチされているIAMロールにIAMポリシーを追加)
IAMロールはEC2インスタンス1台に1つしかアタッチ出来ませんのでご注意ください。EC2インスタンス向けのIAMロールは、EC2インスタンスの初回起動時に、役割(ロール)を含まずにEC2インスタンス名-roleという感じで命名して、EC2起動時は、IAMポリシー無しでIAMロールを最初からアタッチしておくと便利だと思います。
- IAMへ
- ロールへ
- IAMポリシーを設定したいIAMロール名(EC2インスタンス)をクリック
- 「ポリシーをアタッチします」をクリック
- 「検索」でポリシー名「CloudWatchAgentServer」を探し、チェックを入れる
- 「ポリシーのアタッチ」をクリック
CloudWatchロググループ作成
- CloudWatchへ
- ロググループへ
- 「ロググループを作成」へ
- ロググループ名を入力
- Retention settingを選ぶ 例)1ヶ月
- 「作成」をクリック
※ロググループ名の命名参考
EX) /aws/プロジェクト名/ec2/webserver01/rails/app
EPELパッケージ有効化
Amazon Linux2 でRHEL 7 用の EPEL リリースパッケージをインストールし、EPEL リポジトリを有効にする。collectdは、EPEL無しにインストールできません。
sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
有効化済リポジトリを一覧表示
sudo yum repolist
collectdインストール
CloudWatchエージェントは、collectdを使います。そのため、事前にAmazon Linux2 でcollectdのインストールが必要です。
collectdは、CPU使用率・ディスクパーティションの使用量(ディスク使用率)・ネットワークインタフェースの通信量・ロードアベレージ・メモリ使用量・スワップ使用量・TCPコネクション数等のサーバの統計情報を収集するためのオープンソースソフトウェア。
CloudWatchでいうところのメトリクスにあたる。Amazon Linux2 でEPELパッケージを有効にした後、collectdのインストールが必要です。
sudo yum install -y collectd
StatsDについて
StatsDは、アプリケーションやサービスから追加のカスタムメトリクスを取得します。さまざまなアプリケーションからメトリクスを収集できる一般的なオープンソースソリューション。少し後で、CloudWatchエージェント設定ファイル作成にてStatsDが出てきます。
CloudWatchエージェントをEC2インスタンスにインストール(SSH)
Amazon Linux2 でSSHで以下コマンドでインストール。
sudo yum install amazon-cloudwatch-agent
ヘルプコマンド
amazon-cloudwatch-agent-ctl -help
CloudWatchエージェント設定ファイル作成
Amazon Linux2 で以下のコマンドで作成ウィザードが始まります。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
ウィザードの質問事項について、返答は基本的にはすべてデフォルトでOKですが、
- (EC2インスタンス内のログの)file_path
- (CloudWatchログ画面の)log_group_name
- (CloudWatchログ画面の)log_stream_name
これら3つの命名については、おそらく個々に命名ルールを決めて設定することになります。
また、以下の質問は、EC2インスタンス内の/var/log/messagesログファイルをCloudWatchロググループに持っていく設定を1つした後、さらに別のEC2インスタンス内のログをCloudWatchロググループに持ってきますか?ということです。phpやRubyなどのログもCloudWatchに設定したい場合は、1を選択、もう他にCloudWatchに追加したいログはないという場合は 2 を選択してください。
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
やや長いですが、以下、ウィザードで聞かれる項目です。※最後のAWS Systems Manager(SSM)はNoを選択しています。
※Current config as follows: のあとのjsonは参考のために複数併記パターン向けに変えています。
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:
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]:
1
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
1
Which port do you want StatsD daemon to listen to?
default choice: [8125]
8125
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
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]:
4
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
1
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
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]:
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]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
1
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"metrics": {
"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]:
1
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/Amazon CloudWatch/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]:
1
Log file path:
/var/log/messages
Log group name:
default choice: [messages]
/aws/プロジェクト名/ec2/web/Ruby/logs
Log stream name:
default choice: [{instance_id}]
インスタンスID-リソース名-LogStream
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.
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/rails_app.log",
"log_group_name": "/aws/プロジェクト名/ec2/webserver01/rails/app",
"log_stream_name": "インスタンスID-リソース名-rails-app-LogStream"
},
{
"file_path": "/var/log/secure",
"log_group_name": "/aws/プロジェクト名/ec2/webserver01/linux/secure",
"log_stream_name": "インスタンスID-リソース名-linux-secure-LogStream"
},
{
"file_path": "/var/log/messages",
"log_group_name": "/aws/プロジェクト名/ec2/webserver01/linux/messages",
"log_stream_name": "インスタンスID-リソース名-linux-messages-LogStream"
},
{
"file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
"log_group_name": "/aws/プロジェクト名/ec2/webserver01/amazon-cloudwatch-agent",
"log_stream_name": "インスタンスID-リソース名-cloudwatch-agent-LogStream"
}
]
}
}
},
"metrics": {
"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.
以降、上記config.jsonを書き換え、CloudWatch Logsもロググループを追加したりしてCloudWatchにログを設定できる。書き換えるたびに、エージェントの起動コマンドを実行して読み込ませるようにしてください。
ClouddWatchエージェント起動
設定ファイルの作成ウィザードがすべて終わるとCurrent config as follows:で「設定ファイルの中身」とThe config file is also located atで「Amazon Linux2 内の設定ファイルのフルパス」が表示されるので、それをもとにAmazon Linux2 で以下のコマンドを実行します。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:設定ファイルのサーバー内フルパス
デフォルトで進めている方はおそらく、
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
がClouddWatchエージェント起動になります。
CloudWatchで表示されていることを確認
CloudWatch画面でAmazon Linux 2のログは、CloudWatchログ⇒ロググループ⇒「/aws/プロジェクト名/ec2/web/Ruby/logs」をクリックで確認できます。
CloudWatch画面でメトリクスメモリ使用率は、CloudWatchメトリクス⇒(すべてのメトリクス)⇒リージョン(Tokyo)⇒CWAgent⇒「ImageId,InstanceId,InstanceType」をクリック⇒メトリクス名で「mem_used_percent」です。
CloudWatch画面でディスクの使用率は、CloudWatchメトリクス⇒(すべてのメトリクス)⇒リージョン(Tokyo)⇒CWAgent⇒「ImageId,InstanceId,InstanceType,device,fstype,path」をクリック⇒メトリクス名で「disk_used_percent」です。
CloudWatchインサイトでCloudWatchログの可視化/分析
CloudWatchのログ可視化/分析は、CloudWatchのインサイトにて、ロググループを1~複数個選択、クエリ(サンプルクエリもあり)を投げてグラフなどの結果を見ることが出来ます。
※CloudWatchのコストが・・・・、という場合、CloudWatchで保管する期間を短くしてS3への保存も可能。
CloudWatchLogsにストリームが作られない場合
次のコマンドでステータスがactive(running)であることを確認してください。
systemctl status amazon-cloudwatch-agent
さらに、パブリックサブネットのEC2インスタンスなら、EC2インスタンスのセキュリティグループのインバウンド/アウトバウンドでHTTPSが開いているか確認してください。パブリックサブネットの踏み台専用のEC2インスタンスでSSHだけ許可していて、HTTP/HTTPSのセキュリティグループを閉じていることなどがありえます。
プライベートサブネットの場合、EC2インスタンスのセキュリティグループに加えて、以下3つのVPCエンドポイントが必要です。それぞれVPCエンドポイントのセキュリティグループがCloudWatchLogsでログを取りたいEC2インスタンスのサブネットやアベイラビリティゾーンを許可しているか確認してください。
- com.amazonaws.ap-northeast-1.monitoring
- com.amazonaws.ap-northeast-1.ec2
- com.amazonaws.ap-northeast-1.logs
VPCエンドポイントを追加する場合、事前に専用のセキュリティグループにタグのNameで命名しておくことを推奨します。
VPCエンドポイントは、リージョンに対してサービス(AWSリソース)毎に1つです。EC2インスタンスが同じAZで異なるサブネットにある場合は、EC2インスタンスのセキュリティグループから指定するHTTPSのセキュリティグループを同じVPCエンドポイントに向けます。