首页 > 解决方案 > 如何将 AWS EC2 cloud-init 日志流式传输到 ELK?

问题描述

我的应用程序通过 AWS EC2 Javascript SDK 动态创建 EC2 实例。每次创建时,都会通过方法UserData中的参数运行一个 Bash 脚本runInstances。此 Bash 脚本的日志记录显示在/var/log/cloud-init-output.log实例中。目前,我必须手动登录到实例才能查看此文件,这很繁琐且不可扩展。

如何将此日志记录流式传输到外部目的地?我想使用ELK堆栈,但我的日志记录解决方案的具体细节可能不如弄清楚如何重定向cloud-init日志记录那么重要。

标签: loggingamazon-ec2elkcloud-init

解决方案


我想出了几种方法。


使用 Logstash 直接流式传输日志

这样,您需要在您的 EC2 实例上安装 Logstash。但是您可以将日志流式传输到您想要的任何地方,例如 Amazon ES、ElasticCloud 或您自己的 ElasticSearch 主机。

  1. 安装 Logstash
  1. 配置
  • Logstash 配置文件如下:
input {
  file {
    path => ["/var/log/cloud-init-output.log"] # specify log file path here
  }
}

# if you need to process log on the fly
# you can use filter plugin
# filter {}

output {
  elasticsearch {
    hosts => ["https://YOUR_ES_HOST"]
    index => "YOUR_INDEX_NAME"
    user => "YOUR_USERNAME"
    password => "YOUR_PASSWORD"
  }
}
  1. 启动 Logstash 服务

使用 CloudWatch 和 Amazon ES

实施时间更短,但需要 Amazon ES。

  1. 使用 CloudWatch 日志代理将日志推送到 CloudWatch Logs。
  • 可以在此页面的日志部分中找到配置。
  • 一定要/var/log/cloud-init-output.logfile_path现场设置。
  1. 在 CloudWatch Logs 中创建 ElasticSearch 订阅过滤器。

当然存档的方法有很多,这两种比较简单。


推荐阅读