ElasticBeanstalkのログまわりの設定ベストプラクティス
CloudWatchへのストリーミング
マネジメントコンソールからダウンロードしてgrepかけるのはしんどいので、 基本的にはCloudWatchに流したい。
[設定] => [ソフトウェアの変更] で、CloudWatch Logs へのインスタンスログのストリーミング を有効化できる。
インスタンスではCloudWatchエージェントが動いていて、即時にログが送信されてくる。 (※古いプラットフォームを使っているとアップデートが必要)
送信されるログの種類はプラットフォームによって異なる。 例えばPythonの場合は、以下のログファイルが対象となり、 それぞれに対してロググループが作成される。
- /var/log/eb-activity.log
- /var/log/httpd/error_log
- /var/log/httpd/access_log
- /opt/python/log/supervisord.log
どのプラットフォームでどのログが対象になるかは、以下のリンク先にリストされている。 https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/AWSHowTo.cloudwatchlogs.html#AWSHowTo.cloudwatchlogs.loggroups
ストリーミングするには、インスタンスにCloudWatchの権限が必要。
デフォルトでは、 aws-elasticbeanstalk-ec2-role
というIAMロールが作成されているはず。
そこに以下のカスタムポリシーを作成してアタッチする。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:GetLogEvents", "logs:PutLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams", "logs:PutRetentionPolicy" ], "Resource": [ "*" ] } ] }
Apacheログのカスタマイズ
Apache2.2以降、アクセスログに internal dummy connection
というログが出力されるようになっているので、これを抑制する。
Apacheの設定ファイルをいじればいいのだが、直接編集することはできないし、 あまりするべきではないので、追加で設定ファイルを配置することにする。
ElasticBeanstalkは、 .ebextensions/
にファイルを置くことによって環境を様々にカスタマイズできる。
拡張子は .config
で、yamlとjson形式をサポートしている。
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/ebextensions.html
ファイルを作成するには files
キーを使用する。
files: "/etc/httpd/conf.d/custom.conf": mode: "000644" owner: root group: root content: | SetEnvIf User-Agent "internal dummy connection" nolog CustomLog logs/access_log combined env=!nolog
インラインで書く以外にも、S3のURLを指定することもできるらしい。
これでApacheがconfigを読み込んで設定を反映してくれる。
ELBのヘルスチェック
同じく、access_logのノイズになるので排除する。 やり方は同じ。
SetEnvIf User-Agent "ELB-HealthChecker" nolog
独自のログファイル
先ほどリストしたプラットフォームごとのログファイル以外にも、
任意のアプリケーションログもストリーミングしたいことがあるかと思う。
CloudWatch Logs のエージェントをハックする形で可能。