如何在 Elastic Beanstalk 多容器 docker 上使用 fluentd 日志驱动程序

Posted

技术标签:

【中文标题】如何在 Elastic Beanstalk 多容器 docker 上使用 fluentd 日志驱动程序【英文标题】:How to use fluentd log driver on Elastic Beanstalk Multicontainer docker 【发布时间】:2016-06-17 18:41:14 【问题描述】:

我尝试将 fluentd 日志驱动程序与以下 Dockerrun.aws.json 一起使用,

“AWSEBDockerrunVersion”:2, “容器定义”:[ “名称”:“阿帕奇”, "图像": "php:5.6-apache", “基本”:是的, “记忆”:128, “端口映射”:[ “主机端口”:80, “容器端口”:80 ], “日志配置”: “logDriver”:“流利的”, “选项”: “流利地址”:“127.0.0.1:24224” ]

但出现以下错误。

ERROR: Encountered error starting new ECS task: cancel the command.
    "failures": [
        
            "reason": "ATTRIBUTE",
            "arn": "arn:aws:ecs:ap-northeast-1:000000000000:container-instance/00000000-0000-0000-0000-000000000000"
        
    ],
    "tasks": []

ERROR: Failed to start ECS task after retrying 2 times.
ERROR: [Instance: i-00000000] Command failed on instance. Return code: 1 Output: beanstalk/hooks/appdeploy/enact/03start-task.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.

我应该配置什么?

【问题讨论】:

【参考方案1】:

看来你也可以通过你的应用环境目录下的.ebextensions/01-fluentd.config文件来完成,内容如下:

files:
  "/home/ec2-user/setup-available-log-dirvers.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/sh
      set -e
      if ! grep fluentd /etc/ecs/ecs.config &> /dev/null
      then
        echo 'ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","syslog","fluentd"]' >> /etc/ecs/ecs.config
      fi

container_commands:
  01-configure-fluentd:
    command: /home/ec2-user/setup-available-log-dirvers.sh

现在你必须部署一个新的应用版本(还没有 fluentd 配置),重建你的环境,添加 fluentd 配置:

  logConfiguration:
    logDriver: fluentd
    options:
      fluentd-address: localhost:24224
      fluentd-tag: docker.myapp

现在部署更新的应用程序,现在一切正常。

【讨论】:

谢谢迈克尔。几天后我会尝试并在这里报告结果。 我已经确认它工作正常。再次感谢。 这与哪个解决方案堆栈有关?我已将该文件添加到 .ebextensions 并验证 /etc/ecs/ecs.config 正在更新,但 ecs 代理未使用更新的日志记录驱动程序运行。我猜想 ecs 代理在该配置更改之前正在启动。 @matheeeny 在添加 .ebextensions 文件并使用该文件部署版本之后,您是否完成了环境重建(通过进入 beanstalk -> 环境 -> 操作 -> 重建环境)?我已经将它与Multi-container Docker 1.9.1 (Generic) 的一些早期版本一起使用。 我没有重建环境,但我做了一个不可变的部署,它拆除了实例并启动了新的实例。【参考方案2】:

我自己解决了这个问题。

首先,我准备了一个包含以下用户数据的自定义 ami。

#cloud-config
repo_releasever: 2015.09
repo_upgrade: none
runcmd:
  - echo 'ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","syslog","fluentd"]' >> /etc/ecs/ecs.config

其次,我定义了在我的环境 EC2 设置中创建的自定义 ami 的 ami id。最后,我将我的应用程序部署到 Elastic Beanstalk。之后,我环境中的fluentd log driver就可以正常工作了。

为了在 Elastic Beanstalk Multicontainer Docker 中使用 fluentd 日志驱动程序,需要在 /etc/ecs/ecs.config 中定义 ECS_AVAILABLE_LOGGING_DRIVERS 变量。 Elastic Beanstalk Multicontainer Docker 内部使用 ECS,因此相关设置在 ECS 文档中。 请阅读以下文档中的logConfiguration 部分: http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html

【讨论】:

【参考方案3】:

我已经在接受的答案中添加了一条评论,只需添加我用来让它为我工作的完整 ebextension 文件

files:
"/home/ec2-user/setup-available-log-dirvers.sh":
mode: "000755"
owner: root
group: root
content: |
  #!/bin/sh
  set -e
  if ! grep fluentd /etc/ecs/ecs.config &> /dev/null
  then
    echo 'ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","syslog","fluentd"]' >> /etc/ecs/ecs.config
  fi

container_commands:
 00-configure-fluentd:
  command: /home/ec2-user/setup-available-log-dirvers.sh
 01-stop-ecs:
  command: stop ecs
 02-stop-ecs:
  command: start ecs

我们只是在设置日志驱动程序后重述 ecs

【讨论】:

以上是关于如何在 Elastic Beanstalk 多容器 docker 上使用 fluentd 日志驱动程序的主要内容,如果未能解决你的问题,请参考以下文章