EC2上のアプリのログをawslogsを使ってCloudWatch Logsに送信する

概要

EC2上で動くアプリケーションのログを awslogs を使ってCloudWatch Logsに送信する手順です。

環境

  • Amazon Linux AMI release 2018.03
  • awslogs 1.1.4-1.12
  • EC2インスタンスにはインスタンスプロファイルがアタッチ済み

手順

  • EC2インスタンスに割り当てられているインスタンスプロファイルに、CloudWatch Logsへの書き込み権限を与える

    インラインポリシーで許可する例

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents",
            "logs:DescribeLogStreams"
          ],
          "Resource": [
            "*"
          ]
        }
      ]
    }
    
  • EC2インスタンスに awslogs をインストールする

    yum install -y awslogs
    
  • awslogs の設定を行う

    • 設定ファイルは /etc/awslogs/awslogs.conf にある

    • どのファイルを、どの頻度で、どのロググループに送るのか等を設定できる

      設定の記述方法は CloudWatch Logs エージェントのリファレンス を参照

    • 設定の例

      /etc/awslogs/awslogs.conf
      [general]
      state_file = /var/lib/awslogs/agent-state
      use_gzip_http_content_encoding = true
      
      [/var/www/log/application.log]
      file = /var/www/log/application.log*
      log_group_name = application-log
      log_stream_name = {instance_id}
      datetime_format = '%Y-%m-%dT%H:%M:%S%z'
      time_zone = LOCAL
      initial_position = start_of_file
      encoding = utf_8
      
  • システム起動時に awslogs サービスが起動するようにする

    chkconfig awslogs on
    
  • awslogs サービスを起動する

    service awslogs start
    

背景

EC2でWebアプリケーションを構築していて、ログをインスタンスにアタッチしているEBSに書き込むと以下のような不都合が発生します。

  • メンテナンス作業で、以前作成したAMIからインスタンスを作成して稼働中のインスタンスと差し替えるといった操作をする場合、AMI作成時点から作業時までのログが失われる
  • EC2インスタンスのストレージを徐々に圧迫する
  • EBSはハードウェア障害時の内容は保証されず、ログが失われる可能性がある
  • 複数台のインスタンスを起動して冗長構成を取っている場合、ログを確認するのが手間(EFSを利用すれば解消できるかも)

EC2インスタンスに可能な限り状態を持たせないようにするため、CloudWatch Logsにエクスポートするようにしたいと考えました。

感想

awslogs を使うことで簡単にログをCloudWatch Logsに送信できました。CloudWatch Logsにフィルタを設定してログを監視することもできそうです。

EC2インスタンスからログの保存という役割は追い出せたものの、CloudWatch Logsも保存容量に応じた費用がかかるので、定期的にS3にアーカイブする設定も作った方が良さそうです。

インスタンスプロファイル経由で認証情報を得られるかと思いきや、作業環境では前任者がIAMユーザーを作成して認証情報を ~/.aws/credentials に書き込んでいたためハマりました。

参考にさせていただいたサイト