oynix

于无声处听惊雷,于无色处见繁花

Elastic Beanstalk (EB) 引入 CloudWatch Log 服务

  • 原因
    现所有 EB 环境服务的 log,均以文件的形式,存储在 EB 机器本地。当机器因各种问题(包含但不限于 bug ),造成无法远程访问时,无法读取其上的 log 来定位问题。故引入 AWS 的 CloudWatch Log 服务。
  • 原理
    CloudWatch Log 是一项服务。功能是,以接近实时的速度以流的方式读取、并存储文件。

  • 配置

  1. 在项目根目录下创建名为.ebextentions的目录;
  2. .ebextentions中新建文件default.config,扩展名必须为.config,文件名任意,合法即可;
  3. 写入如下内容,部署时自动执行,具体见AWS文档
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    packages:
    yum:
    awslogs: []

    files:
    "/etc/awslogs/awscli.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
    [plugins]
    cwlogs = cwlogs
    [default]
    region = `{"Ref":"AWS::Region"}`

    "/etc/awslogs/awslogs.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
    [general]
    state_file = /var/lib/awslogs/agent-state

    "/etc/awslogs/config/logs.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
    [/var/log/automation/app.log]
    log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/automation/app.log"]]}`
    log_stream_name = {instance_id}
    file = /var/log/automation/app.log

    commands:
    "1_init_log_dir":
    cwd: /var/log/
    command: |
    mkdir automation
    chmod 775 automation
    chgrp wsgi automation
    chown wsgi automation
    ignoreErrors: true
    "2_check_awslogs":
    command: chkconfig awslogs on
    "3_reload_awslogs":
    command: service awslogs restart
  • 说明
    配置文件中使用了 3 个键,packagesfilescommands。具体说明可见AWS文档。
  1. packages
  • 使用 yum 安装 CloudWatch Log 服务,awslogs
  1. files:写入 awslogs 的配置文件,其中前两个 awscli.confawslogs.conf 在此不需要关心,只需关注第 3 个 logs.conf
  • log_group_name: 在 CloudWatch Log 中显示的 group 的名称,对应下图中红色框;
  • log_stream_name: 在 CloudWatch Log 中显示的 stream 的名称,对应下图中蓝色框;
  • file: 该数据流所关联的文件的绝对路径
  1. commands
    为便于查看和管理,统一将log放到了路径 /var/log/ 下,并每个独立程序使用一个目录,这里使用automation说明。在 2 中,参数 file 使用的值是 /var/log/automation/app.log,所以在启动前需先创建 automation 目录。
  • 1_init_log_dir: 创建目录并修改权限,EB环境中,程序的默认执行用户是 wsgi;

  • 2_check_awslogs: 更新 awslogs 服务;

  • 3_reload_awslogs: 重启 awslogs 服务。

  • 使用
    将配置文件 default.configlogs.conflog_group_namelog_stream_namefile以及 1_init_log_dir 替换为对应项目信息即可,在 CloudWatch Log 中可根据 group_namestream_name 查找 log

  • 扩展
    如有需要,可同时创建多个流,修改 logs.conf 即可,格式参考如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    "/etc/awslogs/config/logs.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
    [/var/log/messages]
    log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/messages"]]}`
    log_stream_name = {instance_id}
    file = /var/log/messages

    [/var/log/dmesg]
    log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/dmesg"]]}`
    log_stream_name = {instance_id}
    file = /var/log/dmesg

    [/var/log/automation/app.log]
    log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/automation/app.log"]]}`
    log_stream_name = {instance_id}
    file = /var/log/automation/app.log
------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2019/11/42670001e839/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道