如何将 AWS EC2 cloud-init 日志流式传输到 ELK?

How to stream AWS EC2 cloud-init logs to ELK?

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

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

您可以CloudWatch Agent to stream logs to CloudWatch logs. From there you can stream those logs使用Elasticsearch。您必须订阅日志并将其指向您的 ELK 堆栈。

另一个可能更简单的解决方案是使用 fluentd。您可以使用它来收集所有 local logs and ship them directly to Elasticsearch.

我想出了几个方法。


使用 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。
  • 可以在 this page 的日志部分找到配置。
  • 请务必在 file_path 字段设置 /var/log/cloud-init-output.log
  1. 在 CloudWatch Logs 中创建 ElasticSearch 订阅过滤器。

当然有很多方法可以存档,这两个比较简单。