✍️

CloudWatch Agent 稼働中の EC2 に Log 取得を追加する

2022/06/20に公開

事前準備

CloudWatch Agent のインストールは次のように行いました。

IAM ロール作成

EC2 に必要な権限を与えた IAM ロール を作成して、EC2 に権限を付与します。
EC2から CloudWatch にログをプッシュするための権限と、今回エージェントの設定を SSM (AWS Systems Manager) に保存するので、そのための権限を付与します。新たに作成するロールに次のポリシーを割り当てました。

  • CloudWatchAgentAdminPolicy
  • CloudWatchAgentServerPolicy
  • AmazonSSMManagedInstanceCore

EC2 に IAM ロールを割り当てる

先に作成した IAM ロールを EC2 に割り当てます。
EC2のダッシュボードの左側メニューから「インスタンス」を選択します。
対象の EC2 インスタンスを選択し、「アクション」の「セキュリティ」から「IAM ロールを変更」をクリックします。
作成したロールを選択し、「適用」をクリックします。

EC2 にログイン

各自必要なコマンドを実行して、EC2 インスタンスにログインしてください。

モジュールの取得

作業場所は /tmp として実行しました。

$ cd /tmp
$ wget https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
	:
長さ: 46979720 (45M) [application/octet-stream]
`amazon-cloudwatch-agent.rpm' に保存中

100%[=============================================>] 46,979,720   103MB/s 時間 0.4s   

2022-06-12 19:30:20 (103 MB/s) - `amazon-cloudwatch-agent.rpm' へ保存完了 [46979720/46979720]
$ 

インストール

$ sudo rpm -U ./amazon-cloudwatch-agent.rpm 
create group cwagent, result: 0
create user cwagent, result: 0
create group aoc, result: 0
create user aoc, result: 0
$ 

設定ファイルの作成

Wizard で設定ファイルを作成できます。
StatsD daemon を使わない、Log 出力しないこと以外は default choice のまま設定しました。

$ 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]:
2
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
			}
		}
	}
}
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]:
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
			}
		}
	}
}
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]:

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-linux]

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. ASIA3XJR65K2????????(From SDK)
2. Other
default choice: [1]:

Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.
$ 

パラメータストアに設定を保存しておくと、複数の EC2 に対して同じ設定を適用することが簡単にできるので、保存しました。

collectd インストール

metrics 収集のために collectd を利用するので、インストールが必要になります。

$ sudo amazon-linux-extras install collectd
Installing collectd
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
リポジトリーを清掃しています: amzn2-core amzn2extra-collectd amzn2extra-docker
                            : amzn2extra-kernel-5.10 mongodb-org-4.0
22 個の metadata ファイルを削除しました
8 個の sqlite ファイルを削除しました
0 個の metadata ファイルを削除しました
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                      | 3.7 kB  00:00:00     
amzn2extra-collectd                                             | 3.0 kB  00:00:00     
amzn2extra-docker                                               | 3.0 kB  00:00:00     
amzn2extra-kernel-5.10                                          | 3.0 kB  00:00:00     
mongodb-org-4.0                                                 | 2.5 kB  00:00:00     
(1/10): amzn2-core/2/x86_64/updateinfo                          | 477 kB  00:00:00     
(2/10): amzn2-core/2/x86_64/group_gz                            | 2.5 kB  00:00:00     
(3/10): amzn2extra-docker/2/x86_64/primary_db                   |  91 kB  00:00:00     
(4/10): amzn2extra-kernel-5.10/2/x86_64/updateinfo              |  14 kB  00:00:00     
(5/10): amzn2extra-collectd/2/x86_64/updateinfo                 |   76 B  00:00:00     
(6/10): amzn2extra-collectd/2/x86_64/primary_db                 |  60 kB  00:00:00     
(7/10): amzn2extra-docker/2/x86_64/updateinfo                   | 6.4 kB  00:00:00     
(8/10): amzn2extra-kernel-5.10/2/x86_64/primary_db              | 9.5 MB  00:00:00     
(9/10): mongodb-org-4.0/primary_db                              | 127 kB  00:00:00     
(10/10): amzn2-core/2/x86_64/primary_db                         |  63 MB  00:00:01     
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ collectd.x86_64 0:5.8.1-1.amzn2.0.2 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

=======================================================================================
 Package        アーキテクチャー
                             バージョン                リポジトリー               容量
=======================================================================================
インストール中:
 collectd       x86_64       5.8.1-1.amzn2.0.2         amzn2extra-collectd       706 k

トランザクションの要約
=======================================================================================
インストール  1 パッケージ

総ダウンロード容量: 706 k
インストール容量: 2.0 M
Is this ok [y/d/N]: y
Downloading packages:
collectd-5.8.1-1.amzn2.0.2.x86_64.rpm                           | 706 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告: RPMDB は yum 以外で変更されました。
  インストール中          : collectd-5.8.1-1.amzn2.0.2.x86_64                      1/1 
  検証中                  : collectd-5.8.1-1.amzn2.0.2.x86_64                      1/1 

インストール:
  collectd.x86_64 0:5.8.1-1.amzn2.0.2                                                  

完了しました!
	:
$ 

collectd サービスを enable にして、起動します。

$ sudo systemctl enable collectd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/collectd.service to /usr/lib/systemd/system/collectd.service.
$ sudo systemctl start collectd.service
$ 

CloudWatch Agent 起動

設定は AmazonCloudWatch-linux としてパラメータストアに保存したので、次で起動させます。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-linux
	:
$ 

もちろん、SSM から Run Command で実行させることも可能です。

  • コマンドドキュメント: AmazonCloudWatch-ManageAgent
  • Optional Configuration Location: AmazonCloudWatch-linux
  • ターゲット: 「インスタンスを手動で選択する」をクリックし、対象のインスタンスをチェック

これで、EC2 から CloudWatch に対してメトリクスが送られるようになりました。

本題(ログ収集の追加)

ここからが本題のログ収集の追加です。

追加する

パラメータストアに保存した設定 AmazonCloudWatch-linux を編集してもよいのですが、これを標準で用いる設定にしておきたかったので、追加できるようにログ収集部分のみを別設定として作成しました。

パラメータストアに新しい設定を作成する

AWS コンソールから System Manager、パラメータストア を選択します。

マイパラメータから「パラメータの作成」を選択します。

パラメータの作成では、適切な名前をつけ(今回は test-log-config)、利用枠はまずは「標準」選び、タイプは「文字列」、データ型は「text」にします。
「値」に設定項目を記述します。

{
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/messages",
                        "log_group_name": "/aws/ec2/test/messages",
                        "log_stream_name": "{instance_id}"
                    }
                ]
            }
        }
    }
}

テスト用なので /var/log/messages を取得することにし、ロググループは /aws/ec2/test/messages で、ストリームネームはインスタンスIDにしました。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a append-config -m ec2 -c ssm:test-log-config -s
	:
$ 

問題なく登録できれば、CloudWatch Log に /aws/ec2/test/messages というロググループが作成され、インスタンスID名のストリームが作成されます。稼働状況を確認するには、次のコマンドを実行することで確認できました。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status
{
  "status": "running",
  "starttime": "2022-06-20T06:22:13+0000",
  "configstatus": "configured",
  "cwoc_status": "stopped",
  "cwoc_starttime": "",
  "cwoc_configstatus": "not configured",
  "version": "1.247350.0b251780"
}
$ 

append-config した場合もファイルは独立してローカルに保存されており、restart 時にはそれぞれ参照してくれます。remove-config では、指定したファイルがローカルから削除されるようでした。

Discussion