使用 Beats 监控 Amazon Web Services (AWS)

编辑

使用 Beats 监控 Amazon Web Services (AWS)编辑

在本教程中,您将学习如何使用 Elastic 可观测性监控您的 AWS 基础设施:日志和基础设施指标。

您将学到什么编辑

您将学习如何

  • 创建和配置 S3 存储桶
  • 创建和配置 SQS 队列。
  • 安装和配置 Filebeat 和 Metricbeat 以收集日志和基础设施指标
  • 从 S3 收集日志
  • 从 Amazon CloudWatch 收集指标

准备工作编辑

使用我们在 Elastic Cloud 上托管的 Elasticsearch Service 创建部署。该部署包括用于存储和搜索数据的 Elasticsearch 集群,以及用于可视化和管理数据的 Kibana。

在本教程中,我们假设您的日志和基础设施数据已经发送到 CloudWatch。我们将向您展示如何将数据从 CloudWatch 流式传输到 Elasticsearch。如果您不知道如何将您的 AWS 日志和基础设施数据放入 CloudWatch,Amazon 提供了许多关于此特定主题的文档

步骤 1:创建 S3 存储桶编辑

要在 Elasticsearch 中集中您的日志,您需要有一个 S3 存储桶。Filebeat 是您将用来收集日志的代理,它有一个用于 S3 的输入。

AWS S3 控制台 中,点击 创建存储桶。为存储桶指定一个 名称 并指定您希望部署它的 区域

S3 bucket creation

步骤 2:创建 SQS 队列编辑

您现在应该有一个可以导出日志的 S3 存储桶,但您还需要一个 SQS 队列。为了避免从每个 S3 存储桶轮询所有日志文件造成的严重延迟,我们将使用 Amazon Simple Queue Service (SQS)。这将在创建新的 S3 对象时向我们提供 Amazon S3 通知。Filebeat S3 输入 检查 SQS 中是否有关于 S3 中创建的新对象的新的消息,并使用这些消息中的信息从 S3 存储桶中检索日志。通过这种设置,不需要定期轮询每个 S3 存储桶。相反,Filebeat S3 输入保证了从 S3 存储桶中以速度和可靠性近乎实时地收集数据。

创建一个 SQS 队列,并将我们的 S3 存储桶配置为在 S3 存储桶中出现新日志时向 SQS 队列发送消息。转到 SQS 控制台

确保在与 S3 存储桶相同的区域创建队列。

Queue Creation

创建一个标准 SQS 队列,并使用 JSON 对象编辑访问策略以定义高级访问策略

<sqs-arn> 替换为 SQS 队列的 ARN,将 <s3-bucket-arn> 替换为您刚刚创建的 S3 存储桶的 ARN,将 <source-account> 替换为您的源账户。

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

步骤 3:启用事件通知编辑

现在您的队列已创建,请转到您创建的 S3 存储桶的属性,然后点击 创建事件通知

指定您希望在每次创建对象事件时发送通知。

Event Notification Setting

将目标设置为您刚刚创建的 SQS 队列。

Event Notification Setting

步骤 4:安装和配置 Filebeat编辑

要使用 Elastic Stack 监控 AWS,您需要两个主要组件:用于存储和分析数据的 Elastic 部署以及用于收集和发送数据的代理。

安装 Filebeat编辑

下载并安装 Filebeat。

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.14.2-amd64.deb
sudo dpkg -i filebeat-8.14.2-amd64.deb
设置资产编辑

Filebeat 附带预定义的资产,用于解析、索引和可视化您的数据。运行以下命令以加载这些资产。这可能需要几分钟时间。

./filebeat setup -e -E 'cloud.id=YOUR_DEPLOYMENT_CLOUD_ID' -E 'cloud.auth=elastic:YOUR_SUPER_SECRET_PASS' 

在此命令中替换您的 Cloud ID 和管理员的 用户名:密码。要查找您的 Cloud ID,请点击您的 部署

设置 Filebeat 是一项需要额外权限的管理员级别任务。作为最佳实践,使用管理员角色进行设置,并使用更严格的角色进行事件发布(您将在下一步中执行此操作)。

配置 Filebeat 输出编辑

接下来,您将配置 Filebeat 输出到 Elasticsearch Service。

  1. 使用 Filebeat 密钥库来存储 安全设置。将 Cloud ID 存储在密钥库中。

    ./filebeat keystore create
    echo -n "<Your Deployment Cloud ID>" | ./filebeat keystore add CLOUD_ID --stdin
  2. 要以最小权限将日志存储在 Elasticsearch 中,请创建一个 API 密钥以将数据从 Filebeat 发送到 Elasticsearch Service。登录 Kibana(您可以从 Cloud Console 登录,无需输入任何权限),然后选择 管理开发工具。发送以下请求

    POST /_security/api_key
    {
      "name": "filebeat-monitor-gcp",
      "role_descriptors": {
        "filebeat_writer": {
          "cluster": [
            "monitor",
            "read_ilm",
            "cluster:admin/ingest/pipeline/get", 
            "cluster:admin/ingest/pipeline/put" 
          ],
          "index": [
            {
              "names": ["filebeat-*"],
              "privileges": ["view_index_metadata", "create_doc"]
            }
          ]
        }
      }
    }

    Filebeat 需要额外的集群权限才能发布日志,这与 Metricbeat 配置不同。您可以在 此处 找到更多详细信息。

  3. 响应包含一个 api_key 和一个 id 字段,可以以下列格式存储在 Filebeat 密钥库中:id:api_key

    echo -n "IhrJJHMB4JmIUAPLuM35:1GbfxhkMT8COBB4JWY3pvQ" | ./filebeat keystore add ES_API_KEY --stdin

    确保指定了 -n 参数;否则,由于在 API 密钥末尾添加了换行符,您将遇到痛苦的调试过程。

  4. 要查看是否已存储这两个设置,请运行以下命令

    ./filebeat keystore list
  5. 要将 Filebeat 配置为输出到 Elasticsearch Service,请编辑 filebeat.yml 配置文件。将以下行添加到文件末尾。

    cloud.id: ${CLOUD_ID}
    output.elasticsearch:
      api_key: ${ES_API_KEY}
  6. 最后,测试配置是否有效。如果不起作用,请验证您是否使用了正确的凭据,并在必要时再次添加它们。

    ./filebeat test output

步骤 5:配置 AWS 模块编辑

现在输出已经正常工作,您可以设置 Filebeat AWS 模块,该模块将自动创建 AWS 输入。此模块检查 SQS 中是否有关于 S3 存储桶中创建的新对象的新的消息,并使用这些消息中的信息从 S3 存储桶中检索日志。通过这种设置,不需要定期轮询每个 S3 存储桶。

有许多不同的文件集可用:cloudtrailvpcflowec2cloudwatchelbs3access。在本教程中,我们将向您展示一些使用 ec2s3access 文件集的示例。

ec2 文件集用于发送和处理存储在 CloudWatch 中的日志,并将它们导出到 S3 存储桶。s3access 文件集用于需要收集 S3 访问日志时。它为对存储桶发出的请求提供详细记录。服务器访问日志对许多应用程序都很有用。例如,访问日志信息在安全和访问审核中很有用。它还可以帮助您了解您的客户群并了解您的 Amazon S3 账单。

让我们在 Filebeat 中启用 AWS 模块。

./filebeat modules enable aws

使用以下配置编辑 modules.d/aws.yml 文件。

- module: aws
  cloudtrail:
    enabled: false
  cloudwatch:
    enabled: false
  ec2:
    enabled: true 
    var.credential_profile_name: fb-aws 
    var.queue_url: https://sqs.eu-central-1.amazonaws.com/836370109380/howtoguide-tutorial 
  elb:
    enabled: false
  s3access:
    enabled: false
  vpcflow:
    enabled: false

启用 ec2 文件集。

这是按照 AWS 标准 定义的 AWS 配置文件。

添加包含有关包含 EC2 日志的存储桶的通知的队列的 URL

确保用于从 S3 收集日志的 AWS 用户至少具有以下权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
              "s3:GetObject",
              "sqs:ReceiveMessage",
              "sqs:ChangeMessageVisibility",
              "sqs:DeleteMessage"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

您现在可以将您的日志上传到 S3 存储桶。如果您正在使用 CloudWatch,请确保按照 AWS 用户指南的步骤 3 中所示编辑您的存储桶的策略。这将帮助您避免权限问题。

启动 Filebeat 以收集日志。

./filebeat -e

以下是我们迄今为止取得的成就

Current Architecture

现在,让我们配置 s3access 文件集。这里的目标是能够监控人们如何访问我们创建的存储桶。为此,我们将创建另一个存储桶和另一个队列。新的架构将如下所示

Architecture with Access Logging Enabled

创建一个新的 S3 存储桶和 SQS 队列。确保已启用新存储桶上的事件通知,并且它正在向新队列发送通知。

现在返回到第一个存储桶,然后转到 属性 > 服务器访问日志记录。指定您希望将访问日志发送到您最近创建的存储桶。

Enabling Server Access Logging

复制您创建的队列的 URL。使用以下配置编辑 `modules.d/aws.yml` 文件。

- module: aws
  cloudtrail:
    enabled: false
  cloudwatch:
    enabled: false
  ec2:
    enabled: true 
    var.credential_profile_name: fb-aws 
    var.queue_url: https://sqs.eu-central-1.amazonaws.com/836370109380/howtoguide-tutorial 
  elb:
    enabled: false
  s3access:
    enabled: true 
    var.credential_profile_name: fb-aws 
    var.queue_url: https://sqs.eu-central-1.amazonaws.com/836370109380/access-log 
  vpcflow:
    enabled: false

启用 ec2 文件集。

这是按照 AWS 标准 定义的 AWS 配置文件。

添加包含有关包含 EC2 日志的存储桶的通知的队列的 URL

将 URL 添加到包含有关包含 S3 访问日志的存储桶的通知的队列

编辑配置文件后,您需要重新启动 Filebeat。要停止 Filebeat,您可以在终端中按 CTRL + C。现在,通过运行以下命令重新启动 Filebeat

./filebeat -e

步骤 6:可视化日志编辑

现在日志已发送到 Elasticsearch,我们可以在 Kibana 中对其进行可视化。要查看原始日志,请打开 Kibana 中的主菜单,然后单击 日志

EC2 logs in the Logs UI

我们在前面步骤中使用的文件集还附带了预先构建的仪表板,您可以使用它们来可视化数据。在 Kibana 中,打开主菜单并单击 仪表板。搜索 S3 并选择名为:[Filebeat AWS] S3 服务器访问日志概览 的仪表板

S3 Server Access Log Overview

这为您提供了 S3 存储桶访问方式的概览。

步骤 7:收集基础设施指标编辑

要监控您的 AWS 基础设施,您需要首先确保您的基础设施数据已发送到 CloudWatch。为了将数据发送到 Elasticsearch,我们将使用 Metricbeat 中的 AWS 模块。此模块使用 AWS 服务的 GetMetricData API 定期从 AWS CloudWatch 获取监控指标。

此模块将产生 CloudWatch API 请求的额外 AWS 费用。有关更多详细信息,请参阅 AWS API 请求

步骤 8:安装和配置 Metricbeat编辑

在新终端窗口中,运行以下命令。

安装 Metricbeat编辑

下载并安装 Metricbeat。

curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-8.14.2-amd64.deb
sudo dpkg -i metricbeat-8.14.2-amd64.deb
设置资产编辑

Metricbeat 附带预定义的资产,用于解析、索引和可视化您的数据。运行以下命令以加载这些资产。这可能需要几分钟时间。

./metricbeat setup -e -E 'cloud.id=YOUR_DEPLOYMENT_CLOUD_ID' -E 'cloud.auth=elastic:YOUR_SUPER_SECRET_PASS' 

在此命令中替换您的 Cloud ID 和管理员的 用户名:密码。要查找您的 Cloud ID,请点击您的 部署

设置 Metricbeat 是一项管理员级别的任务,需要额外的权限。作为最佳实践,使用管理员角色进行设置,并使用更严格的角色进行事件发布(您将在下一步中执行此操作)。

配置 Metricbeat 输出编辑

接下来,您将配置 Metricbeat 输出到 Elasticsearch Service。

  1. 使用 Metricbeat 密钥库来存储 安全设置。将云 ID 存储在密钥库中。

    ./metricbeat keystore create
    echo -n "<Your Deployment Cloud ID>" | ./metricbeat keystore add CLOUD_ID --stdin
  2. 要以最小权限将指标存储在 Elasticsearch 中,请创建一个 API 密钥以将数据从 Metricbeat 发送到 Elasticsearch Service。登录 Kibana(您可以从云控制台执行此操作,而无需键入任何权限)并选择 管理开发工具。发送以下请求

    POST /_security/api_key
    {
      "name": "metricbeat-monitor",
      "role_descriptors": {
        "metricbeat_writer": {
          "cluster": ["monitor", "read_ilm"],
          "index": [
            {
              "names": ["metricbeat-*"],
              "privileges": ["view_index_metadata", "create_doc"]
            }
          ]
        }
      }
    }
  3. 响应包含一个 api_key 和一个 id 字段,可以以下列格式存储在 Metricbeat 密钥库中:id:api_key

    echo -n "IhrJJHMB4JmIUAPLuM35:1GbfxhkMT8COBB4JWY3pvQ" | ./metricbeat keystore add ES_API_KEY --stdin

    确保指定了 -n 参数;否则,由于在 API 密钥末尾添加了换行符,您将遇到痛苦的调试过程。

  4. 要查看是否已存储这两个设置,请运行以下命令

    ./metricbeat keystore list
  5. 要将 Metricbeat 配置为输出到 Elasticsearch Service,请编辑 metricbeat.yml 配置文件。将以下行添加到文件末尾。

    cloud.id: ${CLOUD_ID}
    output.elasticsearch:
      api_key: ${ES_API_KEY}
  6. 最后,测试配置是否有效。如果它不起作用,请验证您是否使用了正确的凭据并再次添加它们。

    ./metricbeat test output

现在输出已经正常工作,您将设置 AWS 模块。

步骤 9:配置 AWS 模块编辑

要从您的 AWS 基础设施收集指标,我们将使用 Metricbeat AWS 模块。此模块包含许多指标集:billingcloudwatchdynamodbebsec2elblambda 等等。创建每个指标集都是为了帮助您流式传输和处理数据。在本教程中,我们将向您展示一些使用 ec2billing 指标集的示例。

  1. 让我们在 Metricbeat 中启用 AWS 模块。

    ./metricbeat modules enable aws
  2. 使用以下配置编辑 modules.d/aws.yml 文件。

    - module: aws 
      period: 24h 
      metricsets:
        - billing 
      credential_profile_name: mb-aws 
      cost_explorer_config:
        group_by_dimension_keys:
          - "AZ"
          - "INSTANCE_TYPE"
          - "SERVICE"
        group_by_tag_keys:
          - "aws:createdBy"
    - module: aws 
      period: 300s 
      metricsets:
        - ec2 
      credential_profile_name: mb-aws 

    定义要使用的模块。

    定义收集指标的周期

    定义要使用的指标集。

    这是按照 AWS 标准 定义的 AWS 配置文件。

确保用于从 CloudWatch 收集指标的 AWS 用户至少附加了以下权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeRegions",
                "cloudwatch:GetMetricData",
                "cloudwatch:ListMetrics",
                "sts:GetCallerIdentity",
                "iam:ListAccountAliases",
                "tag:getResources",
                "ce:GetCostAndUsage"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

您现在可以启动 Metricbeat 了

./metricbeat -e

步骤 10:可视化指标编辑

现在指标正在流式传输到 Elasticsearch,我们可以在 Kibana 中对其进行可视化。在 Kibana 中,打开主菜单并单击 基础设施。确保显示 AWS 源和 EC2 实例

Your EC2 Infrastructure

我们在前面步骤中使用的指标集还附带了预先构建的仪表板,您可以使用它们来可视化数据。在 Kibana 中,打开主菜单并单击 仪表板。搜索 EC2 并选择名为:[Metricbeat AWS] EC2 概览 的仪表板

EC2 Overview

如果您想跟踪您在 AWS 上的账单,您还可以查看 [Metricbeat AWS] 账单概览 仪表板

Billing Overview