如何使用 Amazon ES 处理 CloudFront 日志?

上次更新时间:2019 年 5 月 22 日

我想使用 Amazon CloudFront 分配中的访问日志构建自定义报告。如何使用 Amazon Elasticsearch Service (Amazon ES) 处理 CloudFront 日志,以便创建自定义报告?

简短描述

按照以下步骤使用 Amazon ES 处理 CloudFront 日志:

1.    在同一个 AWS 区域中创建 Amazon ES 域和 Amazon Simple Storage Service (Amazon S3) 存储桶。

2.    配置您的 CloudFront 分配,以将访问日志存储在 Amazon S3 存储桶中。

3.    配置 Amazon Elastic Compute Cloud (Amazon EC2) 实例以使用 Logstash 处理 CloudFront 日志并将其推送到 Amazon ES 域。

解决方法

在相同的 AWS 区域中创建 Amazon ES 域和 Amazon S3 存储桶

要使用 Amazon ES 处理 CloudFront 日志,请先在相同的 AWS 区域中设置以下资源:

配置您的 CloudFront 分配,以将访问日志存储在 Amazon S3 存储桶中

1.    打开 CloudFront 控制台

2.    选择您的 CloudFront 分配,然后选择分配设置

3.    在一般选项卡上,选择编辑,然后执行以下操作:
对于日志记录,请选择开启
对于日志存储桶,选择与您的 Amazon ES 域位于相同 AWS 区域中的 S3 存储桶。
对于日志前缀,输入日志名称的前缀。

4.    选择是,编辑

注意:将日志请求发送到 S3 存储桶可能需要长达 24 小时的时间。

配置 Amazon EC2 实例以使用 Logstash 处理 CloudFront 日志,然后将其推送到 Amazon ES 域

1.    启动 Amazon EC2 实例
注意:此实例必须使用 AWS Identity and Access Management (IAM) 角色,该角色有权访问 Amazon S3(GET 对象)和 Amazon ES(PUT 文档)。

2.    使用 SSH 连接到实例

3.    在实例上安装 Java 8,这是运行 Logstash 所必需的一项技术

4.    运行此命令以下载实例的 Logstash 客户端:

wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.0.tar.gz

5.    运行此命令以提取 Logstash 客户端:

tar xvf logstash-5.5.0.tar.gz

6.    运行此命令以安装 Amazon ES Logstash 插件:

cd logstash-5.5.0
bin/logstash-plugin install logstash-output-amazon_es

7.    创建 JSON 格式的文件以用作 Logstash 输出的模板。模板文件可以类似于:
注意:确保根据您的报告要求修改模板。

cloudfront.template.json

#cloudfront.template.json
{
  "template": "cloudfront-logs-*",
  "mappings": {
    "logs": {
      "_source": {
        "enabled": false
      },
      "_all": {
        "enabled": false
      },
      "dynamic_templates": [
        {
          "string_fields": {
            "mapping": {
              "index": "not_analyzed",
              "type": "string"
            },
            "match_mapping_type": "string",
            "match": "*"
          }
        }
      ],
      "properties": {
        "geoip": {
          "dynamic": true,
          "properties": {
            "ip": {
              "type": "ip"
            },
            "location": {
              "type": "geo_point"
            },
            "latitude": {
              "type": "float"
            },
            "longitude": {
              "type": "float"
            }
          }
        }
      }
    }
  }
}

8.    创建 Logstash 配置文件,将带 CloudFront 日志的 S3 存储桶定义为输入,并将 Amazon ES 域定义为输出。配置文件可以类似于:

cloudfront.conf

#cloudfront.conf
input {
  s3 {
    bucket => "{CLOUDFRONT_LOG_BUCKET}"
    prefix => "{CLOUDFRONT_LOG_KEY_PREFIX}"
    region => "{BUCKET_REGION_NAME}"
  }
}


filter {
  grok {
    match => { "message" => "%{DATE_EU:date}\t%{TIME:time}\t(?<x_edge_location>\b[\w\-]+\b)\t(?:%{NUMBER:sc_bytes:int}|-)\t%{IPORHOST:c_ip}\t%{WORD:cs_method}\t%{HOSTNAME:cs_host}\t%{NOTSPACE:cs_uri_stem}\t%{NUMBER:sc_status:int}\t%{GREEDYDATA:referrer}\t%{GREEDYDATA:User_Agent}\t%{GREEDYDATA:cs_uri_stem}\t%{GREEDYDATA:cookies}\t%{WORD:x_edge_result_type}\t%{NOTSPACE:x_edge_request_id}\t%{HOSTNAME:x_host_header}\t%{URIPROTO:cs_protocol}\t%{INT:cs_bytes:int}\t%{GREEDYDATA:time_taken}\t%{GREEDYDATA:x_forwarded_for}\t%{GREEDYDATA:ssl_protocol}\t%{GREEDYDATA:ssl_cipher}\t%{GREEDYDATA:x_edge_response_result_type}" }
  }

  mutate {
    add_field => [ "listener_timestamp", "%{date} %{time}" ]
  }

  date {
    match => [ "listener_timestamp", "yy-MM-dd HH:mm:ss" ]
    target => "@timestamp"
  }

  geoip {
    source => "c_ip"
  }

  useragent {
    source => "User_Agent"
    target => "useragent"
  }

  mutate {
    remove_field => ["date", "time", "listener_timestamp", "cloudfront_version", "message", "cloudfront_fields", "User_Agent"]
  }
}

output {
  amazon_es {
    hosts => ["{AMAZON_ES_DOMAIN_ENDPOINT}"]
    region => "{AMAZON_ES_DOMAIN_REGION_NAME}"
    index => "cloudfront-logs-%{+YYYY.MM.dd}"
    template => "/path-to-file/cloudfront.template.json"
  }
}

9.    使用诸如 vi 之类的文本编辑器编辑配置文件中的以下值:
对于存储桶,输入存储 CloudFront 日志的 S3 存储桶的名称。
对于前缀,请输入您在启用 CloudFront 分配上的日志记录时指定为“日志前缀”的前缀。
对于区域,输入 S3 存储桶和 Amazon ES 域的 AWS 区域。
对于主机,输入 Amazon ES 域的终端节点。
对于模板,输入您创建的模板文件的路径。

10.    保存对配置文件所做的更改。

11.    使用 -f 选项运行 Logstash,并指定您创建的配置文件。有关更多信息,请参阅 Elastic 网站上的 Command-Line Flags

完成这些步骤后,Logstash 会将文档发布到您指定的 Amazon ES 域。要检查文档是否已成功发布,请从 Amazon ES 控制台打开您的 Amazon ES 域,然后检查索引视图。

现在,您可以使用 Kibana 为日志创建自定义报告和可视化效果。有关更多信息,请参阅 Kibana 和 Logstash

注意:请确保您有访问策略,该策略允许 Kibana 访问存储在 Amazon ES 域中的日志。


这篇文章对您有帮助吗?

您觉得我们哪些地方需要改进?


需要更多帮助?