最速でEC2にcloudwatch agentをセットアップするドキュメント
ここではdebian
先にロールを作る
CloudWatch Logsに書き込むという事は、EC2に然るべき権限がついてないといかんともしがたい。これはEC2のロールが定義されていないと厳しいので最初にロールを作っておく。ただし権限は後から追加する。先に枠を作って割当てておくイメージ
ロールを探し出して
ユースケースにはEC2
こんな感じでロールを作成していく。許可の割り当ては何も付けずスキップし、TestEC2CloudWatchRole
とした
EC2を起動
CloudWatchTest
で起動する
debian12をt4g.micro
で起動する。つまりARM
を選択した。
ポート80を解放しておくとapacheのテストにはよい
IAMロールを変更しておく
IAMロールが渡っていれば成功だ
EC2の中に入ってCloudwatch Log Agentを導入する
一応
sudo apt update && sudo apt upgrade -y
とかしておく
ここにインストールするためのbinaryのurlがあるので取得する。ここアーキテクチャを間違えないようにする必要がある。ここではARM64
という事になる。
wget https://amazoncloudwatch-agent.s3.amazonaws.com/debian/arm64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb
インストールされた
$ dpkg -L amazon-cloudwatch-agent
/opt
/opt/aws
/opt/aws/amazon-cloudwatch-agent
/opt/aws/amazon-cloudwatch-agent/etc
/opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d
/opt/aws/amazon-cloudwatch-agent/doc
/opt/aws/amazon-cloudwatch-agent/doc/amazon-cloudwatch-agent-schema.json
/opt/aws/amazon-cloudwatch-agent/THIRD-PARTY-LICENSES
/opt/aws/amazon-cloudwatch-agent/logs
/opt/aws/amazon-cloudwatch-agent/LICENSE
/opt/aws/amazon-cloudwatch-agent/NOTICE
/opt/aws/amazon-cloudwatch-agent/RELEASE_NOTES
/opt/aws/amazon-cloudwatch-agent/var
/opt/aws/amazon-cloudwatch-agent/bin
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
/opt/aws/amazon-cloudwatch-agent/bin/start-amazon-cloudwatch-agent
/opt/aws/amazon-cloudwatch-agent/bin/opentelemetry-jmx-metrics.jar
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl
/opt/aws/amazon-cloudwatch-agent/bin/config-translator
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader
/opt/aws/amazon-cloudwatch-agent/bin/CWAGENT_VERSION
/etc
/etc/systemd
/etc/systemd/system
/etc/systemd/system/amazon-cloudwatch-agent.service
/etc/init
/etc/init/amazon-cloudwatch-agent.conf
/etc/amazon
/usr
/usr/bin
/var
/var/log
/var/log/amazon
/var/run
/var/run/amazon
/etc/amazon/amazon-cloudwatch-agent
/usr/bin/amazon-cloudwatch-agent-ctl
/var/log/amazon/amazon-cloudwatch-agent
/var/run/amazon/amazon-cloudwatch-agent
こういう構成になっている
起動してエラーを確認する
sudo systemctl start amazon-cloudwatch-agent
その後 /var/log/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.logを見れば
$ cat /var/log/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log
2025/02/18 09:35:46 I! Return exit error: exit code=99
2025/02/18 09:35:46 I! No json config files found, please provide config, exit now
このように、設定ファイルが何もないというエラーになっている。これは予想通りなので停止しておく
sudo systemctl stop amazon-cloudwatch-agent
apacheのログをcloudwatchに送る
sudo apt install apache2 -y
とするとapache2が起動する。これのログはdefaultで /var/log/apache2/access.logにある
ls -l /var/log/apache2/access.log
-rw-r----- 1 root adm 0 Feb 18 09:45 /var/log/apache2/access.log
これを送信するのであるが、cloudwatchエージェントはcwagentという権限で起動するので、これを読めない
sudo -u cwagent cat /var/log/apache2/access.log
debianの場合admに加入させると読めるようになるのでそのようにする
sudo adduser cwagent adm
読めるようになりました
EC2からcloudwatchに書き込む設定とその確認
ここでは /test/apache2 というロググループを作成するものとする。これはawsコマンドで行うのであるが
$ aws logs create-log-group --log-group-name "/test/apache2"
An error occurred (AccessDeniedException) when calling the CreateLogGroup operation: User: arn:aws:sts::****:assumed-role/TestEC2CloudWatchRole/i-07979bd5fcb84ba33 is not authorized to perform: logs:CreateLogGroup on resource: arn:aws:logs:ap-northeast-1:****:log-group:/test/apache2:log-stream: because no identity-based policy allows the logs:CreateLogGroup action
とまあこのようになる。必要なポリシーを作ってアタッチしよう
ポリシーの作成
https://us-east-1.console.aws.amazon.com/iam/home?region=ap-northeast-1#/policies より、ポリシーの作成を押す
以下のようなjsonを与える
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:ap-northeast-1:<アカウントID>:log-group:/test/*"
}
]
}
これは**/test/* **以下に権限を与えている事を意味している
TestCloudWatchPolicy
という名前で保存した。
さらに TestEC2CloudWatchRole
にこのポリシーをアタッチする
これで権限が与えられたのでロググループを作成してみる
aws logs create-log-group --log-group-name "/test/apache2"
エラーなし
確認してみる
aws logs describe-log-groups --log-group-name-prefix "/test"
これは追加の権限が必要なので、webから見るのが早い
ログを送信してみる
ではこの /test/apache2へログを送信する
まずstreamを作成する
aws logs create-log-stream --log-group-name "/test/apache2" --log-stream-name "accesslog"
aws logs create-log-stream --log-group-name "/test/apache2" --log-stream-name "errorlog"
aws logs put-log-events \
--log-group-name "/test/apache2" \
--log-stream-name "accesslog" \
--log-events '[{"timestamp":'$(date +%s%3N)', "message":"This is a test access log entry from EC2"}]'
aws logs put-log-events \
--log-group-name "/test/apache2" \
--log-stream-name "errorlog" \
--log-events '[{"timestamp":'$(date +%s%3N)', "message":"This is a test error log entry from EC2"}]'
こんな感じで送信して確認する
このような形で記録されていればEC2 → CloudWatchへのログ送信権限のテストは完了。
この段階でロググループを削除する
apache2のログを送信する設定を書く
これは /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d 以下にファイルを配置すると設定ファイルとして読みこむよくある仕様だ。
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/apache2/access.log",
"log_group_name": "/test/apache2",
"log_stream_name": "{instance_id}-accesslog",
"timestamp_format": "%d/%b/%Y:%H:%M:%S"
},
{
"file_path": "/var/log/apache2/error.log",
"log_group_name": "/test/apache2",
"log_stream_name": "{instance_id}-errorlog",
"timestamp_format": "%Y/%m/%d %H:%M:%S"
}
]
}
}
}
}
これで起動する
このようにログが転送されていればok。このような明らかなスキャンに関しては別途対応が必要かもしれない(WAFとかを検討しましょう)
まとめ
ここでは最低限ログをCloudwatch Log Agent
を通じて送信できるようにするチュートリアルでありますが、とりあえず送信しているだけなのでretention_in_days
などのパラメーターをチェックし何日保存するとかそういう細かいのをやる必要がある気もします。
Discussion