Amazon AWS Elastic Beanstalk EBS регистрирует в Cloudwatch (мульти докер Env)

Я хотел бы просмотреть все мои журналы в cloudwatch. В настоящее время у меня есть многопрофильная среда Elastic beanstalk.

Я выбрал журналы для отправки в cloudwatch, перейдя в

Elastic Beanstalk > App > Env > Configuration > Software Configuration > CloudWatch Logs

Это включено.

Когда я смотрю в cloudwatch, я вижу следующие биты..

/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 для экземпляра с этим содержимым, я вижу, что эти журналы (когда я нажимаю URLS) генерируются (как и ожидалось) по локальному пути /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 журналов. Но ничего в облачном часе...

2 ответа

Согласно официальной документации AWS, для среды 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 для сбора файлов в каталоге контейнеров. Здесь приведены примеры конфигураций. Честно говоря, немного странно, что конфигурация по умолчанию для Docker Multicontainer не включает журналы контейнеров, но, очевидно, именно так AWS реализовал это.

Мы используем следующие расширения для потоковой передачи журналов приложений (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"
        }]
    }]
}
Другие вопросы по тегам