EC2上で動くアプリケーションのログを awslogs
を使ってCloudWatch Logsに送信する手順です。
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 エージェントのリファレンス を参照
設定の例
[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に書き込むと以下のような不都合が発生します。
EC2インスタンスに可能な限り状態を持たせないようにするため、CloudWatch Logsにエクスポートするようにしたいと考えました。
awslogs
を使うことで簡単にログをCloudWatch Logsに送信できました。CloudWatch Logsにフィルタを設定してログを監視することもできそうです。
EC2インスタンスからログの保存という役割は追い出せたものの、CloudWatch Logsも保存容量に応じた費用がかかるので、定期的にS3にアーカイブする設定も作った方が良さそうです。
インスタンスプロファイル経由で認証情報を得られるかと思いきや、作業環境では前任者がIAMユーザーを作成して認証情報を ~/.aws/credentials
に書き込んでいたためハマりました。