Elastic Beanstalk单容器Docker - 使用awslogs日志记录驱动程序

17 logging amazon-web-services docker amazon-elastic-beanstalk

我正在使用其单容器Docker配置在Elastic Beanstalk上运行单个Docker容器,并尝试使用awslogs日志记录驱动程序将应用程序stdout发送到CloudWatch .

EB查找该容器的配置的Dockerrun.aws.json文件,但据我可以看到没有使用awslogs作为容器的日志驱动器(或添加任何其他标志的一个选项,docker run命令为此事).

我已经尝试docker run使用此处提供的答案黑客入侵,通过添加.ebextensions/01-commands.config包含内容的文件:

commands:
  add_awslogs:
    command: 'sudo sed -i "s/docker run -d/docker run --log-driver=awslogs --log-opt awslogs-region=eu-west-2 --log-opt awslogs-group=dockerContainerLogs -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'
Run Code Online (Sandbox Code Playgroud)

从某种意义上说,它可以修改运行脚本,并且日志会显示在CloudWatch中.

但EB应用程序终止了.容器已启动,但不响应请求.

我在容器日志中发现以下错误:

"logs"命令仅支持"json-file"和"journald"日志记录驱动程序(got:awslogs)

我找到了与ECS(不是EB)相关的类似问题的答案,建议使用awslog附加ECS_AVAILABLE_LOGGING_DRIVERS.但我没有在EB中找到此配置设置.

有什么想法吗?

小智 18

我在这里发布了从AWS支持中收到的答案:

由于Elastic Beanstalk Single Container环境将默认情况下将stdout和stderr保存在/ var/log/eb-docker/containers/eb-current-app /上,并且新的解决方案堆栈允许您选择将日志流式传输到cloudwatch,自动化在实例上配置AWSLogs代理,我建议做的是添加ebextension以将stdout和stderr日志文件添加到cloudwatch配置中,并使用已配置的代理将这些文件流式传输到cloudwatch日志.而不是触及AWS也不支持的预挂钩,因为挂钩可能会从解决方案堆栈版本更改为另一个版本.

关于错误,您看到"logs"命令仅支持"json-file"和"journald"日志驱动程序(got:awslogs)"此错误来自docker如何工作,当它配置为将日志发送到旁边的其他驱动程序时json-file或journald它将无法在本地显示日志,因为它没有本地副本.

### BEGIN .ebextensions/logs.config
option_settings:
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: StreamLogs
    value: true
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: DeleteOnTerminate
    value: false
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: RetentionInDays
    value: 7

files:
  "/etc/awslogs/config/stdout.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      [docker-stdout]
      log_group_name=/aws/elasticbeanstalk/environment_name/docker-stdout
      log_stream_name={instance_id}
      file=/var/log/eb-docker/containers/eb-current-app/*-stdouterr.log

commands:
  "00_restart_awslogs":
    command: service awslogs restart

### END .ebextensions/logs.config
Run Code Online (Sandbox Code Playgroud)


duc*_*rth 7

我能够扩展前一个多容器弹性beanstalk环境的答案以及注入环境名称.我必须在ec2角色中授予正确的权限才能创建日志组.您可以通过查看来查看它是否正常工作:

/var/log/awslogs.log
Run Code Online (Sandbox Code Playgroud)

这是在.ebextensions/logs.config中

option_settings:
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: StreamLogs
    value: true
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: DeleteOnTerminate
    value: false
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: RetentionInDays
    value: 14

files:
  "/etc/awslogs/config/stdout.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      [/var/log/containers/docker-stdout]
      log_group_name=/aws/elasticbeanstalk/`{ "Ref" : "AWSEBEnvironmentName" }`/docker-stdout.log
      log_stream_name={instance_id}
      file=/var/log/containers/*-stdouterr.log

commands:
  "00_restart_awslogs":
    command: service awslogs restart
Run Code Online (Sandbox Code Playgroud)

  • 这是我需要的指针,但是当我在我的多容器环境中尝试这个时,我只有一个容器的日志输出。所以我为每个日志文件创建了一个部分,就像这样 https://gist.github.com/jwhiting/e58d9e6a19d9311df1894f1b03c035a1 现在让它工作了,这样做的好处是每个容器的日志都在不同的流中,而不是合并为一个(正如我假设你的那样?) (2认同)