监控 CloudWatch 日志编辑

在本节中,您将学习如何使用 Amazon Data Firehose 将日志事件从 CloudWatch 日志导出到 Elastic 集群。

您将完成以下步骤

  • 在 Kibana 中安装 AWS 集成
  • 选择要监控的 CloudWatch 日志组
  • 在 Amazon Data Firehose 中创建传输流
  • 设置订阅过滤器以使用 Firehose 流转发日志
  • 在 Kibana 中可视化您的日志
开始之前编辑

我们假设您已经拥有

  • 一个 AWS 账户,该账户具有从 AWS 拉取必要数据的权限。
  • Elastic Cloud 上使用我们托管的 Elasticsearch Service 进行部署。该部署包括用于存储和搜索数据的 Elasticsearch 集群,以及用于可视化和管理数据的 Kibana。AWS Data Firehose 适用于 Elastic Stack 7.17 或更高版本,仅在 Elastic Cloud 上运行。

不支持 AWS PrivateLink。确保部署在 AWS 上,因为 Amazon Data Firehose 传输流专门连接到需要位于 AWS 上的端点。

步骤 1:在 Kibana 中安装 AWS 集成编辑
  1. 在 Kibana 中,导航到 管理 > 集成 并浏览目录以找到 AWS 集成。
  2. 导航到 设置 选项卡,然后单击 安装 AWS 资产
步骤 2:选择要监控的 CloudWatch 日志组编辑
CloudWatch log group

在本教程中,您将从基于 AWS Lambda 的应用程序收集应用程序日志,并将它们转发到 Elastic。

创建 Lambda 函数

如果您已经有 Lambda 函数,或者任何其他将日志发送到 CloudWatch 日志组的服务或应用程序,则可以跳过本节。记下您要从中收集日志事件的日志组,然后转到下一节。

与 AWS 中的许多其他服务和平台一样,Lambda 函数默认情况下会直接记录到 CloudWatch。

  1. 转到 AWS 控制台 并打开 AWS Lambda 页面。
  2. 单击 创建函数 并选择从头开始创建函数的选项。
  3. 选择 函数名称
  4. 作为 运行时,请选择最新版本的 Python。例如,Python 3.11。
  5. arm64x86_64 之间选择您想要的 架构
  6. 确认并创建 Lambda 函数。

    当 AWS 完成函数创建后,转到 代码源 部分,并将以下 Python 代码粘贴为函数源代码

    import json
    
    def lambda_handler(event, context):
        print("Received event: " + json.dumps(event))
  7. 单击 部署 将更改部署到源代码。

生成一些示例日志

函数准备就绪后,您可以多次调用它以生成示例日志。在函数页面上,请执行以下步骤

  1. 选择 测试
  2. 选择创建新测试事件的选项。
  3. 命名测试事件并 保存 更改。
  4. 单击 测试 按钮以执行该函数。

访问函数的日志组。通常,AWS 控制台提供了一个方便的链接,可以直接跳转到它为此函数的日志创建的日志组。您应该会看到类似于以下内容

CloudWatch log group with sample logs

记下此 Lambda 函数的日志组名称,因为您将在后续步骤中用到它。

步骤 3:在 Amazon Data Firehose 中创建流编辑
Amazon Firehose Stream
  1. 转到 AWS 控制台 并导航到 Amazon Data Firehose。
  2. 单击 创建 Firehose 流 并选择 Firehose 流的源和目标。除非您要从 Kinesis Data Streams 流式传输数据,否则请将源设置为 Direct PUT,将目标设置为 Elastic
  3. 提供一个有意义的 Firehose 流名称,以便您以后可以识别此传输流。

    对于高级用例,可以通过调用自定义 Lambda 函数来转换源记录。使用 Elastic 集成时,不需要这样做。

  4. 目标设置 部分中,设置以下参数:es_datastream_name = logs-aws.generic-default

Firehose 流现在可以将日志发送到您的 Elastic Cloud 部署。

步骤 4:将 Lambda 函数日志事件发送到 Firehose 流编辑
CloudWatch subscription filter

要将日志事件从 CloudWatch 发送到 Firehose,请打开 Lambda 服务正在记录的日志组并创建一个订阅过滤器。

为 Amazon Data Firehose 创建订阅过滤器

订阅过滤器 允许您从日志组中选择日志事件并将它们转发到其他服务,例如 Amazon Kinesis 流、Amazon Data Firehose 流或 AWS Lambda。

  1. 在日志组页面上,选择 订阅过滤器 并单击 创建 Amazon Data Firehose 订阅过滤器 按钮。

在此处,请执行以下步骤

  1. 选择目标。选择您在上一步中创建的 Firehose 流。
  2. 授予 CloudWatch 服务将日志事件发送到 Firehose 中的流的权限

    1. 使用信任策略创建新角色,该策略允许 CloudWatch 服务承担该角色。
    2. 为该角色分配一个策略,该策略允许“将记录”放入 Firehose 流中。
  3. 创建一个新的 IAM 角色,并使用以下 JSON 作为信任策略

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "logs.<REGION>.amazonaws.com"
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                    "StringLike": {
                        "aws:SourceArn": "arn:aws:logs:<REGION>:<ACCOUNT_ID>:*"
                    }
                }
            }
        ]
    }
  4. 使用以下 JSON 文件为 IAM 角色分配策略

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "firehose:PutRecord",
                "Resource": "arn:aws:firehose:<REGION>:<ACCOUNT_ID>:deliverystream/<YOUR_FIREHOSE_STREAM>"
            }
        ]
    }

新角色准备就绪后,您可以在订阅过滤器中选择它。

  1. 配置日志格式和过滤器。在 日志格式 选项中选择“其他”。
  2. 设置日志格式和过滤器

    如果要转发所有日志事件,可以清空过滤器模式。您可以使用 订阅过滤器模式 仅转发与该模式匹配的日志事件。同一页面上的 测试模式 工具允许您在创建订阅过滤器之前测试过滤器模式。

  3. 生成其他日志。

    再次打开 AWS Lambda 页面,选择您创建的函数,并多次执行它以生成新的日志事件。

检查是否有目标错误日志

AWS 控制台 上,导航到您的 Firehose 流并检查 目标错误日志 部分中的条目。

如果一切运行顺利,则此列表为空。如果出现错误,您可以查看详细信息。以下示例显示了一个由于身份验证设置错误而无法将记录发送到 Elastic Stack 的传输流

Firehose destination errors

Firehose 传输流报告

  • 失败的传送次数。
  • 失败详情。
步骤 5:在 Kibana 中可视化您的日志编辑
Vizualize logs in Kibana

随着日志流式传输到 Elastic Stack,您现在可以在 Kibana 中对其进行可视化。

在 Kibana 中,导航到 发现 页面并选择与 Firehose 流名称匹配的索引模式。以下是您转发到 logs-aws.generic-default 数据流的 Lambda 函数的日志示例

Sample logs in Discover