すべてのログをcloudwatchで表示したいと思います。私は現在、マルチDocker Elastic beanstalk環境を使用しています。
ログに移動して、cloudwatchにプッシュすることを選択しました
Elastic Beanstalk > App > Env > Configuration > Software Configuration > CloudWatch Logs
これは有効です。
クラウドウォッチを見ると、次のビットが表示されます。
/aws/elasticbeanstalk/myapp-staging/var/log/docker-events.log
/aws/elasticbeanstalk/myapp-staging/var/log/eb-activity.log
/aws/elasticbeanstalk/myapp-staging/var/log/eb-ecs-mgr.log
/aws/elasticbeanstalk/myapp-staging/var/log/ecs/ecs-agent.log
/aws/elasticbeanstalk/myapp-staging/var/log/ecs/ecs-init.log
しかし、nginxアクセス/エラーログは表示されません。
これはDockerrun.aws.json
にあります
"mountPoints":[
{
"sourceVolume": "awseb-logs-nginx",
"containerPath": "/var/log/nginx"
}
これが含まれているインスタンスにSSHで接続すると、/var/log/containers/nginx/access.log
などのローカルパス上に(期待どおりに)これらのログが生成される(期待どおり)ことがわかります。
また、[EBS]> [ログ]に移動して最近のログをリクエストすると、アクセスログの内容も確認できますが、CloudWatchに送信されていませんか?
Log Group
を正しいパスでセットアップする必要があるかどうか疑問に思いました。これを試してみましたが、設定されませんでしたか?
これをCloudwatchにプッシュするための何かが欠けていると確信しています。
更新:必要なものとして提案された以下を追加しました。このファイルは、.ebextensions
という名前のnginx_logs.conf
フォルダにあります。
packages:
yum:
awslogs: []
files:
"/etc/awslogs/config/nginx_logs.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/log/containers/nginx/access.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/containers/nginx/access.log"]]}`
log_stream_name = {instance_id}
file = /var/log/containers/nginx/access.log*
[/var/log//containers/nginx/error.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/containers/nginx/error.log"]]}`
log_stream_name = {instance_id}
file = /var/log/containers/nginx/error.log*
commands:
"01":
command: chkconfig awslogs on
"02":
command: service awslogs restart
それでも喜びはありません。繰り返しますが、リクエストログまたは最後の100ログをリクエストしたときにも表示されます。しかし、クラウドウォッチには何もありません...
公式AWS documentation によると、次のファイルはDocker Multicontainer EB環境用にすぐに収集されます。
これらのパスにはnginxログを含むディレクトリが含まれていないため、CloudWatchにストリーミングされないことは理にかなっています。
ログをストリーミングするには、CloudWatch Logsエージェントを設定して、コンテナーディレクトリ内のファイルを収集する必要があるようです。サンプル構成があります ここ 。率直に言って、Docker Multicontainerのデフォルト設定にコンテナーログが含まれていないことは少し奇妙ですが、AWSがこれを実装した方法は明らかにこれです。
次のebextensionsを使用して、アプリケーション(nginx/ror)ログをcloudwatchにストリーミングします
$ cat .ebextensions/cw-logs.config
files:
"/etc/awslogs/config/nginx-access-log.conf":
mode: "000644"
owner: root
group: root
encoding: plain
content: |
[nginx-access.log]
datetime_format = %Y-%m-%dT%H:%M:%S%f
file = /var/log/containers/project1-staging/nginx_access.log
buffer_duration = 5000
log_stream_name = project1_staging_{instance_id}
initial_position = start_of_file
log_group_name = PROJECT1_STAGING_NGINX
"/etc/awslogs/config/app-log.conf":
mode: "000644"
owner: root
group: root
encoding: plain
content: |
[app-access.log]
datetime_format = %Y-%m-%dT%H:%M:%S
file = /var/log/containers/project1-staging/app.log
buffer_duration = 5000
log_stream_name = project1_staging_{instance_id}
initial_position = start_of_file
log_group_name = PROJECT1_STAGING_APP
commands:
00-cmd:
command: chkconfig --level 35 awslogs on
test: "[ -s /usr/sbin/awslogsd ]"
container_commands:
00-cmd:
command: service awslogs restart
test: "[ -s /etc/awslogs/config/nginx-access-log.conf -a -s /etc/awslogs/config/app-log.conf ]"
S3ポリシーへのローテーション
$ cat .ebextensions/cw-logs-s3-rotation.config
files:
"/tmp/logrotate-project1-staging.conf":
mode: "000644"
owner: root
group: root
encoding: plain
content: |
/var/log/containers/project1-staging/*.log {
size 512M
weekly
rotate 0
missingok
compress
notifempty
copytruncate
dateext
dateformat -%Y-%m-%d_%s
olddir /var/log/containers/project1-staging/rotated
lastaction
aws s3 mv --recursive /var/log/containers/project1-staging/rotated/ \
s3://app-logs-archive-s3-bucket/project1-staging/$(date '+%Y')/
endscript
}
container_commands:
00-cmd:
command: mv /tmp/logrotate-project1-staging.conf /etc/logrotate.elasticbeanstalk.hourly/logrotate.elasticbeanstalk.applogs-project1-staging.conf
test: "[ -f /tmp/logrotate-project1-staging.conf ]"
Dockerrun.aws.jsonは次のようになります
$ cat Dockerrun.aws.json
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [{
"name": "project1-staging",
"image": "0123456789.dkr.ecr.us-east-1.amazonaws.com/project1:staging_v.1234567",
"cpu": {{ env['DOCKER_CPU'] }},
"memory": {{ env['DOCKER_MEMORY'] }},
"essential": true,
"portMappings": [{
"hostPort": 80,
"containerPort": 80
},
{
"hostPort": 443,
"containerPort": 443
}],
"mountPoints": [{
"sourceVolume": "awseb-logs-project1-staging",
"containerPath": "/home/app/project1/log"
}]
}]
}