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.    アクセスログを Amazon S3 バケットに保存するように、CloudFront ディストリビューションを設定します。

3.    Logstashを使用して CloudFront ログを処理し、それらを Amazon ES ドメインにプッシュするように Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを設定します。

解決方法

同じ AWS リージョンに Amazon ES ドメインと Amazon S3 バケットを作成する

Amazon ES を使用して CloudFront ログを処理するには、まず同じ AWS リージョンにこれらのリソースを設定します。

Amazon S3 バケットにアクセスログを保存するように、CloudFront ディストリビューションを設定する

1.    CloudFront コンソールを開きます。

2.    CloudFront ディストリビューションを選択してから、[Distribution Settings★] を選択します。

3.    [General★] タブで [Edit★] を選択してから、次の操作を行います。
[Logging★] で [On★] を選択します。
[Bucket for Logs★] で Amazon ES ドメインと同じ AWS リージョンにある S3 バケットを選択します。
[Log Prefix★] でログ名のプレフィックスを入力します。

4.    [Yes, Edit★] を選択します。

注: ログ要求が S3 バケットに配信されるまでに、最大 24 時間かかることがあります。

Logstash を使用して CloudFront ログを処理し、それらを Amazon ES ドメインにプッシュするように、Amazon EC2 インスタンスを設定する

1.    Amazon EC2 インスタンスを起動します
注: このインスタンスでは、Amazon S3 (GET オブジェクト) および Amazon ES (PUT ドキュメント) へのアクセス権を持つ AWS Identity and Access Management (IAM) ロールを使用する必要があります。

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.    Logstash 出力のテンプレートとして機能する JSON 形式のファイルを作成します。テンプレートファイルは次のようになります。
注: レポート要件に従って、必ずテンプレートを修正してください。

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 ログを、出力として Amazon ES ドメインを含む S3 バケットを定義します。設定ファイルは次のようになります。

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 ディストリビューションでログ記録を有効にしたときに、Log Prefix として指定したプレフィックスを入力します。
リージョンには、S3 バケットの AWS リージョンと Amazon ES ドメインを入力します。
ホストの場合は、Amazon ES ドメインのエンドポイントを入力します。
テンプレートには、作成したテンプレートファイルへのパスを入力します。

10.    設定ファイルに加えた変更を保存します。

11.    Logstash を -f オプションを指定して実行し、作成した設定ファイルを指定します。詳細については、 Elastic ウェブサイトの Command-Line Flags をご参照ください。

これらの手順を完了すると、Logstash は指定した Amazon ES ドメインにドキュメントを公開します。ドキュメントが正常に公開されたことを確認するには、Amazon ES コンソールから Amazon ES ドメインを開き、インデックスビューを確認します。

これで Kibanaを使用して、ログのカスタムレポートと視覚化を作成できます。詳細については、Kibana と Logstash をご参照ください。

注: Kibana が Amazon ES ドメインに保存されているログにアクセスできるようにするアクセスポリシーがあることを確認してください。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合