工程

使用 Filebeat 和 Elastic Stack 从 S3 收集 AWS 日志

来自各种不同 AWS 服务的日志(例如 S3 服务器访问日志、ELB 访问日志、CloudWatch 日志以及 VPC 流日志)均可存储在 S3 桶中。例如,S3 服务器访问日志会提供有关向桶提出的请求的详细记录。这一信息用处很大,但遗憾的是,AWS 针对多种操作创建了多个 .txt 文件,这使得用户必须分别打开每个 .txt 文件才能准确看到日志文件中记录了哪些操作。不仅如此,S3 服务器访问日志以一种十分复杂的格式进行记录,这也使得用户很难直接打开 .txt 文件便能找到所需信息。

幸运的是,通过使用 Elastic Stack,您的所有 AWS 日志均可轻松地进行索引、分析和可视化,这样您就可利用这些日志中包含的所有重要数据了。在本篇博文中我们便要看一看此过程到底有多简单。

介绍

在 Filebeat 7.4 中,用户可以选择使用 s3 输入,该输入能够允许用户从 S3 桶内的文件中检索事件,每个文件的每一行都会成为一个单独事件。除了 s3 输入,我们还针对 Filebeat AWS 模块提供了两个新的文件集:s3access 文件集和 elb 文件集(于 7.5 中新推出)。借助这些选项,用户可以从不同的 S3 桶收集日志,然后在一个集中位置对这些日志进行分析和可视化,根本用不着下载或手动打开每个文件。

如果对来自每个 S3 桶的日志文件进行轮询,这会造成重大延迟,为了避免这一延迟,我们决定将通知和轮询结合在一起:在创建新的 S3 对象时使用 Amazon Simple Queue Service (SQS) 来发送 Amazon S3 通知。Filebeat s3 输入会检查 SQS 以确定是否有关于在 S3 中所创建新对象的新消息,并会使用这些消息中的信息来从 S3 桶中检索日志。通过这一设置,无需再对每个 S3 桶进行定期轮询。取而代之,Filebeat s3 输入能够确保高速、可靠、近实时地从 S3 桶收集数据。

使用 SQS 配置 S3 事件通知

通过遵照下面四步,用户可以在桶上添加一个通知配置,此配置会请求 AWS S3 向某个 AWS SQS 队列发布 s3:ObjectCreated:* 类型的事件。有关更多详情,请参见有关配置桶通知示例的分步讲解

第 1 步:创建一个 SQS 队列和 S3 桶

使用 Amazon SQS 控制台在同一 AWS 区域内创建一个 SQS 队列和一个 S3 桶。

第 2 步:配置一个 SQS 队列

将附加于该队列的访问政策替换为下面的队列政策:

{
 "Version":"2012-10-17",
 "Id": "example-ID",
 "Statement": [
  {
   "Sid": "example-statement-ID",
   "Effect":"Allow",
   "Principal": {
    "AWS":"*"  
   },
   "Action": [
    "SQS:SendMessage"
   ],
   "Resource": "<SQS-queue-ARN>",
   "Condition": {
      "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:<bucket-name>" }
   }
  }
 ]
}

确保更改 <sqs-queue-arn><bucket-name>,使其与您的 SQS 队列 ARN 和 S3 桶名称匹配。

第 3 步:配置 S3 桶

使用 Amazon S3 控制台添加一个通知配置,以请求 Amazon S3 向 您的 Amazon SQS 队列 发布 s3:ObjectCreated:* 类型的事件。

配置 S3 桶

第 4 步:测试 S3-SQS 设置

向 S3 桶上传一个对象,并在 Amazon SQS 控制台中验证事件通知。

使用 Filebeat s3 输入

通过 s3 输入启用 Filebeat 后,用户便能够从 AWS S3 桶收集日志了。每份日志文件中的每一行均会成为一个单独事件,并存储在所配置的 Filebeat 输出(例如 Elasticsearch)中。如果只使用 s3 输入,日志消息会存储在每个日志的 message 字段,而不会经过任何解析。

当处理某条 SQS 消息所提到的某个 S3 对象时,如果所配置的可见性超时时间已过去一半但是处理仍在进行中,那么该 SQS 消息的可见性超时将会重置以确保该消息不会在处理进行期间返回到队列中。如在处理 S3 对象的过程中发生错误,那么该进程会终止,SQS 消息将会返回到队列中。

第 0 步:创建 IAM 策略

IAM 策略是一个实体,定义对象在您的 AWS 环境中的权限。需要为 Filebeat 创建具有特定权限的定制 IAM 策略。有关详细信息,请参阅创建 IAM 策略。以下是访问 SQS 和 S3 所需的权限列表:
  • s3:GetObject 
  • sqs:ReceiveMessage 
  • sqs:ChangeMessageVisibility 
  • sqs:DeleteMessage

第 1 步:安装 Filebeat

如要下载和安装 Filebeat,针对不同系统要使用不同的命令。举例说明,如果使用 Mac:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-darwin-x86_64.tar.gz
tar xzvf filebeat-7.5.1-darwin-x86_64.tar.gz

更多详情请参见安装 Filebeat

第 2 步:配置 s3 输入

下面这个例子为您演示了如何在 filebeat.yml 中启用 s3 输入:

filebeat.inputs:
- type: s3
  queue_url: https://sqs.us-east-1.amazonaws.com/1234/test-fb-ks
  visibility_timeout:300s
  credential_profile_name: elastic-beats

通过此配置,Filebeat 将会前往 test-fb-ks AWS SQS 队列并读取通知消息。从这些消息中,Filebeat 将会获得有关具体 S3 对象的信息,并使用此信息逐行读取对象。visibility_timeout 表示所接收的消息在被 ReceiveMessage 请求检索到之后有多长时间(单位为秒)不会出现在后续检索请求中。默认情况下,visibility_timeout 为 300 秒。最小值为 0 秒,最大值为 12 小时。为了进行 AWS API 调用,s3 输入会在其配置中要求提供 AWS 凭据。在上面的示例中,便给出了配置文件名称 elastic-beats 以进行 AWS API 调用。更多详情请参见 AWS 凭据配置

第 3 步:启动 Filebeat

对于 Mac 和 Linux:

sudo chown root filebeat.yml
sudo ./filebeat -e

更多详情请参见启动 Filebeat

使用 s3access 文件集收集 S3 服务器访问日志

在 Filebeat 7.4 中,已添加了 s3access 文件集,以便使用 s3 输入来收集 S3 服务器访问日志。服务器访问日志会针对向桶提出的每个请求提供详细记录,这些信息在安全和访问审计中有很大用处。默认情况下,服务器访问日志是禁用的。如要跟踪向您的桶提出的访问请求,您可以启用服务器访问日志。每条访问日志记录均会提供有关单个访问请求的详细信息,例如请求方、桶名称、请求时间、请求操作、请求状态,以及错误代码(如果相关)。

第 1 步:启用服务器访问日志

在具体 S3 桶的 Properties(属性)下面,您可以通过选择 Enable logging(启用日志)来启用服务器访问日志:

启用日志

第 2 步:在 Filebeat 中启用 aws 模块

在 Filebeat 的默认配置中,并不会启用 aws 模块。以下命令可启用 MacOS 和 Linux 系统中 modules.d 目录下的 aws 模块配置:

sudo ./filebeat modules enable aws

第 3 步:配置 aws 模块

默认情况下,s3access 文件集是禁用的。如要启用 s3access 文件集,请参见下面的 aws.yml:

- module: aws
  s3access:
    enabled: true
    var.queue_url: https://sqs.myregion.amazonaws.com/123456/myqueue
    var.credential_profile_name: fb-aws

第 4 步:启动 Filebeat

对于 Mac 和 Linux:

sudo chown root filebeat.yml
sudo ./filebeat -e

更多详情请参见启动 Filebeat

第 5 步:使用 Kibana s3access 文件集仪表板

s3access 文件集包括一个预定义的仪表板,名为 [Filebeat AWS] S3 Server Access Log Overview(S3 服务器访问日志概览)。通过在启动 Filebeat 时运行设置命令,您可以在 Kibana 中自动设置这些仪表板。

对于 Mac 和 Linux:

./filebeat setup --dashboards

有关详细信息,请参阅设置 Kibana 仪表板文档。

此仪表板是 AWS S3 服务器访问日志的概述。它会显示最重要的 URL,还会显示这些 URL 的响应代码、一段时间内的 HTTP 状态,以及所有错误日志。

AWS S3 服务器访问日志仪表板

后续操作

借助 Filebeat s3 输入,用户能够轻松地从 AWS 服务收集日志并将这些日志作为事件发送到我们 Elastic Cloud 上的 Elasticsearch Service,或者发送到使用默认分发包运行的集群。对于 7.4 版本,用户可以使用 s3access 文件集来收集和分析 S3 服务器访问日志。对于 7.5 版本,用户可以使用 elb 文件集来从下列来源收集日志:经典负载均衡器、应用程序负载均衡器,以及网络负载均衡器。我们近期将开始添加更多文件集来支持其他常用日志,例如 VPC 流日志、CloudWatch 日志和 Cloudtrail 日志。如果您有任何问题或反馈,敬请在 Beats 论坛上发帖哦!