fragen stichworte

Amazon AWS Elastic Beanstalk EBS-Protokolle in Cloudwatch (Multi Docker Env)

Ich möchte alle meine Protokolle in Cloudwatch anzeigen. Ich habe derzeit eine Multi-Docker-Elastic-Beanstalk-Umgebung.

Ich habe für die Protokolle ausgewählt, dass sie zur Cloudwatch übergehen sollen, indem Sie zu

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

Dies ist aktiviert.

Wenn ich in Cloudwatch schaue, sehe ich die folgenden Bits.

/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

Die nginx-Zugriffs-/Fehlerprotokolle werden jedoch nicht angezeigt.

Ich habe dies in meinem Dockerrun.aws.json

"mountPoints":[
        {
          "sourceVolume": "awseb-logs-nginx",
          "containerPath": "/var/log/nginx"
        }

Wenn ich SSH für die Instanz mit diesem Inhalt auf einhalte, kann ich sehen, dass diese Protokolle (wenn ich auf URLs stoße) (wie erwartet) im lokalen Pfad von /var/log/containers/nginx/access.log usw.

generiert werden

Auch wenn ich zu EBS gehe> Protokolle und aktuelle Protokolle anfordern Ich kann sie auch sehen, was sich im Zugriffsprotokoll befindet, es wird einfach nicht an CloudWatch gesendet?

Ich habe mich gefragt, ob ich einen Log Group mit dem richtigen Pfad einrichten müsste. Ich habe es versucht, aber es wurde nicht belegt.

Ich bin sicher, dass mir etwas fehlt, um dies auf Cloudwatch zu übertragen, vielen Dank im Voraus!

Update: Ich habe da unten folgendes hinzugefügt, was als erforderlich vorgeschlagen wurde. Diese Datei befindet sich im Ordner .ebextensions mit dem Namen 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

Immer noch keine Freude, da ich sie immer noch sehen kann, wenn ich Anforderungsprotokolle anrufe oder die letzten 100 Protokolle anfordere. Aber nichts in Cloudwatch ...

antworten

Gemäß der offiziellen AWS -Dokumentation werden die folgenden Dateien für Docker Multicontainer EB-Umgebungen standardmäßig gesammelt:

  • /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

Da diese Pfade nicht das Verzeichnis enthalten, in dem sich die Nginx-Protokolle befinden, ist es sinnvoll, dass sie nicht an CloudWatch übertragen werden.

Um Ihre Protokolle zu streamen, müssen Sie den CloudWatch Logs-Agenten so konfigurieren, dass er die Dateien im Containerverzeichnis sammelt. Es gibt Beispielkonfigurationen hier. Ehrlich gesagt ist es ein bisschen seltsam, dass die Standardkonfiguration für Docker Multicontainer keine Containerprotokolle enthält, aber anscheinend hat AWS dies implementiert.

Wir verwenden die folgenden Ebextensions, um Anwendungsprotokolle (nginx/ror) in cloudwatch zu streamen

$ 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 ]"

Und Rotation nach S3-Richtlinie

$ 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 ]"

Unser Dockerrun.aws.json sieht wie

aus  
$ 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"
        }]
    }]
}