web-dev-qa-db-ja.com

CloudwatchへのAmazon AWS Elastic Beanstalk EBSログ(Multi Docker Env)

すべてのログを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ログをリクエストしたときにも表示されます。しかし、クラウドウォッチには何もありません...

3
Matt The Ninja

公式AWS documentation によると、次のファイルはDocker Multicontainer EB環境用にすぐに収集されます。

  • /var/log/eb-activity.log
  • /var/log/ecs/ecs-init.log
  • /var/log/eb-ecs-mgr.log
  • /var/log/ecs/ecs-agent.log
  • /var/log/docker-events.log

これらのパスにはnginxログを含むディレクトリが含まれていないため、CloudWatchにストリーミングされないことは理にかなっています。

ログをストリーミングするには、CloudWatch Logsエージェントを設定して、コンテナーディレクトリ内のファイルを収集する必要があるようです。サンプル構成があります ここ 。率直に言って、Docker Multicontainerのデフォルト設定にコンテナーログが含まれていないことは少し奇妙ですが、AWSがこれを実装した方法は明らかにこれです。

1

次の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"
        }]
    }]
}
0
ALex_hha