Dilip が、
Amazon CloudFront のログを
Amazon Elasticsearch Service で処理する方法を示します

dilip_cloudfront_logs_elasticsearch

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) インスタンスを設定します。

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

Amazon ES を使用して CloudFront のログを処理するには、まず以下のリソースを同じ AWS リージョンにセットアップする必要があります。

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

  1. Amazon 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 object) および Amazon ES (PUT document) へのアクセス権限を持つ AWS Identity and Access Management (IAM) ロールを使用しなければなりません。詳細情報は、IAM ロールの作成を参照してください。

2.    SSH を使用してインスタンスに接続します

3.    Java 8 をインスタンスにインストールします。これは Logstash の実行に必要です。詳細については、Elastic ウェブサイトの 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 ログを保存した 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%{WORD:x_edge_location}\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 等のテキストエディタを使用して設定ファイルの以下の値を編集します。
bucket には、CloudFront のログを保存する S3 バケットの名前を入力します。
prefix には、CloudFront ディストリビューションでログを有効化した際のログプレフィックスとして指定したプレフィックスを入力します。
region には、S3 バケットと Amazon ES ドメインの AWS リージョンを入力します。
hosts には、Amazon ES ドメインのエンドポイントを入力します。
template には、作成したテンプレートファイルのパスを入力します。

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

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

これらの手順を完了すると、Logstash は指定した Amazon ES ドメインにドキュメントを発行します。ドキュメントが正常に発行されたことをチェックするには、Amazon ES コンソールから Amazon ES ドメインを開いて [Indices] 画面をチェックします。

Kibana を使用してログのカスタムレポートの作成および可視化が可能になりました。詳細については、Kibana と Logstash を参照してください。

注意: Kibana が Amazon ES ドメインに保存されたログにアクセスできるようにするために、アクセスポリシーの設定を行うことが必要な場合があります。


このページは役に立ちましたか? はい | いいえ

AWS サポート ナレッジ センターに戻る

サポートが必要ですか? AWS サポートセンターをご覧ください

公開日: 2018 年 01 月 09 日

更新: 2019 年 02 月 12 日