【问题标题】:Elastic Beanstalk Single Container Docker - use awslogs logging driverElastic Beanstalk 单容器 Docker - 使用 awslogs 日志记录驱动程序
【发布时间】:2017-06-18 04:15:17
【问题描述】:

我在 Elastic Beanstalk 上使用其 Single Container Docker Configuration 运行单个 Docker 容器,并尝试使用 awslogs logging driver 将应用程序标准输出发送到 CloudWatch。

EB 为容器的配置寻找 Dockerrun.aws.json 文件,但据我所知,没有选项可以使用 awslogs 作为容器的日志记录驱动程序(或将任何其他标志添加到 @ 987654324@ 命令)。

我尝试使用here 提供的答案入侵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'

这很有效,因为它修改了运行脚本,并且日志显示在 CloudWatch 中。

但是 EB 应用程序死掉了。容器已启动,但未响应请求。

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

“logs”命令仅支持“json-file”和“journald”日志记录 驱动程序(获得:awslogs)

我找到了与 ECS(不是 EB)相关的类似问题的答案,建议将 ECS_AVAILABLE_LOGGING_DRIVERS 附加到 awslogs。但是我在EB中没有找到这个配置设置。

有什么想法吗?

【问题讨论】:

    标签: amazon-web-services logging docker amazon-elastic-beanstalk


    【解决方案1】:

    我在此处发布从 AWS 支持收到的答复:

    由于 Elastic Beanstalk 单容器环境将保存标准输出 和 /var/log/eb-docker/containers/eb-current-app/ 上的标准错误 默认,并且由于新的解决方案堆栈允许您选择流式传输 登录到 cloudwatch,自动配置 AWSLogs 代理 在这些实例上,我建议做的是添加一个 ebextension 将 stdout 和 stderr 日志文件添加到 cloudwatch 配置 并使用已配置的代理将这些文件流式传输到 云观察日志。而不是触摸 pre-hooks ,这也不是 AWS 支持,因为钩子可能会从解决方案堆栈版本更改为 另一个。

    关于您看到的错误,仅支持“logs”命令 对于“json-file”和“journald”日志驱动程序(得到: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
    

    【讨论】:

      【解决方案2】:

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

      /var/log/awslogs.log
      

      这在 .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
      

      【讨论】:

      • 这是我需要的指针,但是当我在我的多容器环境中尝试这个时,我只得到了一个容器的日志输出。所以我为每个日志文件创建了一个部分,就像gist.github.com/jwhiting/e58d9e6a19d9311df1894f1b03c035a1 现在让它工作,这样做的好处是每个容器的日志都在单独的流中,而不是合并到一个流中(我假设你的是?)
      • 你们太棒了。
      猜你喜欢
      • 2020-07-04
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2023-03-14
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多