【AWS】EC2のログをCloudWatchに送る


やりたいこと

EC2インスタンス内のログをAWSで管理したい。

ログをAWSで管理すると嬉しいこと

  • Zabbixなどの監視用ミドルを使わずにログを監視できる
  • ログをリアルタイムにLambdaで処理できる
  • S3に転送できたり、Kinesisと連携できたりする

用途は様々あるので、その手始めとしてCloudWatch Logsを使用してEC2内のログをCloudWatchに送る。

1. CloudWatch書き込み用のポリシーを作成してEC2のロールに紐づける

「IMA」→「ポリシー」→「ポリシーの作成」

「JSON」のタブを選択し、ポリシーを追加する。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
    ],
      "Resource": [
        "*"
    ]
  }
 ]
}

参考:https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/QuickStartEC2Instance.html

ポリシー名を記載して「ポリシーの作成」

作成したポリシーをEC2インスタンスのロールに紐づける。

2. EC2にCloudWatchLogsエージェントをインストールする。

※EC2のイメージはAmazonLinux2を使用しています

CloudWatchLogsエージェントのインストール
$ sudo yum update -y
$ sudo yum install -y awslogs
awscli.confの修正
$ sudo vi /etc/awslogs/awscli.conf

[default]
region = us-east-1
↓
[default]
region = ap-northeast-1

CloudWatchに送るログの指定を行っていきます。
デフォルトで/var/log/messagesを送る設定が記載されているので、それを修正して今回は/var/log/test.logを作成して、対象のログファイルとします。

awslogs.confの修正
$ sudo vi /etc/awslogs/awslogs.conf

[/var/log/test.log]
datetime_format = %b %d %H:%M:%S
file = /var/log/test.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/test.log
サービス起動
$ sudo systemctl start awslogsd
サービス自動起動設定
$ sudo systemctl enable awslogsd.service

これでインストールと設定は完了になるので、動作確認を行います。

3. 動作確認

対象のログファイルに文字列を記載します。

$ sudo vi /var/log/test.log

aaaaaa

CloudWatchのログを確認します。
「CloudWatch」→「ログ」→「ロググループ」

awslogs.confのlog_stream_nameの値をインスタンスIDにしているので、「ロググループ」→「インスタンスID」配下にEC2のログが出力されています。

awslogs.confの詳しい設定項目については公式を参考にしてください。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html