🔥

最速でEC2にcloudwatch agentをセットアップするドキュメント

2025/02/18に公開

ここでは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

とかしておく

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html

ここにインストールするための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 以下にファイルを配置すると設定ファイルとして読みこむよくある仕様だ。

/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/apache-log.json
{
  "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