如何在 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 日志驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Amazon linux 2 在 Elastic beanstalk 中使用多容器 docker?

如何将特定日志文件从多容器 Docker Elastic Beanstalk 流式传输到 CloudWatch?

如何将 Let encrypt 添加到在 Elastic Beanstalk 上运行的多容器中

如何在 Elastic Beanstalk 应用程序中的 Docker 容器之间共享卷?

具有私有存储库的 Elastic Beanstalk 多容器 Docker CannotPullContainerError

使用 cloudformation 在 Elastic Beanstalk 上启动 docker 多容器