AWS Elastic Beanstalk でログを採取する
参考) Viewing Logs from Amazon EC2 Instances in Your Elastic Beanstalk Environment
Elastic Beanstalk でログを採取する方法は主に以下の 3 つ。
- Web コンソールの Logs または eb logs コマンドで取得する
- ログファイルを S3 に保存する
- ログファイルへの追記を CloudWatch Logs に即時転送する
1. Web コンソールの Logs または eb logs コマンドでログを取得する
取得対象となるファイルは EC2 内の /opt/elasticbeanstalk/tasks 配下に設定されている。
名前 | 説明 | 設定ファイル |
---|---|---|
末尾ログ | 管理コンソールから「Last 100 Lines」で取得するログ | /opt/elasticbeanstalk/tasks/taillogs.d |
バンドルログ | 管理コンソールから「Full Logs」で取得するログ | /opt/elasticbeanstalk/tasks/bundlelogs.d |
ログ取得をおこなうとそれぞれ以下の場所に一時的にログファイルが保存され、一定時間で削除される。
- s3://elasticbeanstalk-(Region)-(AccountNumber)/resources/environments/logs/tail
- s3://elasticbeanstalk-(Region)-(AccountNumber)/resources/environments/logs/bundle
取得するログファイルを追加するには、.ebextensions に以下のように記述した (任意の名前).config ファイルを作成してデプロイする。
例)
files:
"/opt/elasticbeanstalk/tasks/taillogs.d/app.conf": # 末尾ログ
mode: "000644"
owner: root
group: root
content: |
/var/app/current/storage/logs/laravel.log
"/opt/elasticbeanstalk/tasks/bundlelogs.d/app.conf": # バンドルログ
mode: "000644"
owner: root
group: root
content: |
/var/app/current/storage/logs/*.log
補足
- 末尾ログのファイル指定にワイルドカードは指定不可(?)のようなので、Laravel の場合は single (日付なし) の設定で採取する必要がある。
2. ログファイルを S3 に保存する
設定 > ソフトウェアの「S3 ログストレージ」を「有効」にする。
.ebextensions/(任意のファイル名).config にて有効化する場合は以下のように記述する。(参照)
option_settings:
aws:elasticbeanstalk:hostmanager:
LogPublicationControl: true
ログファイルの保存先は s3://elasticbeanstalk-(Region)-(AccountNumber)/resources/environments/logs/publish
保存対象となるファイルは EC2 内の /opt/elasticbeanstalk/tasks/publishlogs.d に設定されている。保存する取得するログファイルを追加するには、.ebextensions に以下のように記述した (任意の名前).config ファイルを作成してデプロイする。
例)
files:
"/opt/elasticbeanstalk/tasks/publishlogs.d/app.conf":
mode: "000644"
owner: root
group: root
content: |
/var/app/current/storage/logs/*.log
3. CloudWatch Logs に即時転送する
参考) Using Elastic Beanstalk with Amazon CloudWatch Logs
設定 > ソフトウェアの「CloudWatch Logs へのインスタンスログのストリーミング」を「有効」にする。
.ebextensions/(任意のファイル名).config にて有効化する場合は以下のように記述する。(参照)
option_settings:
aws:elasticbeanstalk:cloudwatch:logs:
StreamLogs: true
対象となるファイルは /etc/awslogs/config に設定されている。転送するログファイルを追加するには、.ebextensions に以下のように記述した (任意の名前).config ファイルを作成してデプロイする。logs-streamtocloudwatch-linux.config - GitHub からサンプルをダウンロードしてカスタマイズすると良い。(サンプルには CloudWatch Logs Agent 自体の設定も含まれるため、Elastic Beanstalk の「CloudWatch Logs へのインスタンスログのストリーミング」設定を無効にしても設定したファイルだけをストリーミングすることができる。)
参考) CloudWatch Logs Agent Reference
files:
"/etc/awslogs/config/applogs.conf" :
mode: "000644"
owner: root
group: root
content: |
[laravel]
log_group_name=`{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "laravel"]]}`
log_stream_name={instance_id}
file=/var/app/current/storage/logs/*.log
すでにファイルが存在する場合、自動的に .bak ファイルが生成されるが、それも読み込まれてしまうため、削除するようにする。
commands:
remove_bak:
command: "rm -f /etc/awslogs/config/*.bak"
追加のログを出力する場合、別途 CloudWatch Logs に対するパーミッションを EC2 のロール (デフォルト: aws-elasticbeanstalk-ec2-role) に追加する。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:GetLogEvents",
"logs:PutLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
"logs:PutRetentionPolicy"
],
"Resource": [
"*"
]
}
]
}