A block of raw data being correlated to a few distinct endpoints.

APM can take a large amount of raw telemetry data and correlate it into metrics, patterns, and anomalies, so that engineering teams can quickly find and fix issues.

本ブログでは、主要CDNの1つであるAmazon CloudFront(以下、CloudFront)で発生するログを直接New Relicに送信するための設定をご報告させて頂きます。

また、CloudFrontのログをNew Relic Oneに連携する方法はいくつか存在しますが、時事刻々と発生するログを運用に活かすには、リアルタイム性が重要です。そのため、Amazion Kinesis(以下、Kinesis)を用いたリアルタイムログ連携を本ブログではお伝えします。

CloudFront logging flow pattern

ブログの大きな流れは以下の通りです。

  • 実作業紹介

  1. 事前準備: New Relic API Keyの取得
  2. Kinesis上でのDelivery Streamの作成
  3. CloudFrontのReal time loggingの有効化
  4. New Relic Logging上でのParing設定
  • New Relic Dashboardの作成例紹介

上記の実作業の所要時間は、おおよそ30分程度の見込みです。また、既にAWSを活用しており、New Relic Oneのアカウントをお持ちの方を想定しています。もし、New Relic Oneアカウントをお持ちではない場合、こちらより、Freeアカウントを取得して下さい。

  1. 事前準備: New Relic API Keyの取得

  • こちらのブログの手順に従って、ライセンスキー(Ingest - License)を取得してください。ここで取得したライセンスキーは、Kinesis firehoseのDestinationを設定する際に用います。
  1. Amazon Kinesis上でのDelivery Streamの作成

    • AWSのWebコンソールにログインし、Kinesisにアクセスします。
    • Data Firehoseを新たに作成し、
      • Source: Amazon Kinesis Data Streams
      • Destination: New Relic

を選択します。画面下部に設定すべきフィールドが表示されます。

  • 以下の要領に従い、設定を行います。
    その他の項目は、利用形態に併せて設定を行ってください。
    • Source settings - Kinesis data stream: 既存のdata streamを選択するか、新たにData streamを作成します。
      新規で作成する場合、新しいコンソールの画面が開きますので、data streamを作成後、Delivery streamのコンソールに戻り、既存のData stream一覧から選択してください。
    • Delivery stream name: 管理を行いやすい名前を設定します。
    • Destination settings:
      • HTTP endpoint URL: New Relicのデータセンターに合わせてプルダウンメニューから選びます。USを用いている場合、LogsのNew Relic logs - USを選択し、EUを用いている場合、LogsのNew Relic logs - EUを選択します。
      • API key: 項目1で取得したキーを設定します。
      • Add parameterにて、key:valueを設定します。(例: key: logtype, value: cloudfront-realtime-logging) こちらは、New RelicのLogs上でフィルタリングを容易に行える様にするために設定します。
Kinesis Source and Destination
Kinesis Destination for NROne
  1. CloudFrontのReal time loggingの有効化

    • CloudFrontの設定ダッシュボードに移動し、左ペインのTelemetry - Logsにアクセスします。
    • Real-time configurationsのタブを選択し、設定を作成します。
      • Settings:
        • Name: 管理しやすい名前を設定します。
        • Sampling rate: 保存するログラインの割合を1-100で指定します。
        • Fields: ログに含めたい属性名を選択します。全てを選択することをお薦めします。
        • Endpoint: 先ほど作成したDelivery streamを選択します。
        • IIAM role: 既存ロールを用いるか、新しくロールを作成します。
      • Distributions:
        • 紐づけるCloudFrontの設定を選択します。
    • 作成後、Telemetry - Logsに戻り、表示される一覧の中から対象のCloudFrontを見つけ、Real-time logsがEnabledになっているかを確認して下さい。
CloudFront Fields to log
CloudFront RealTime logging Enabled
  1. New Relic Logging上でのParsing設定

    • AWSコンソールにて、Kinesisにアクセスし、対象Delivery streamのMonitoringからログデータが送信されているかを確認してください。確認できたら、以下のステップに進みます。
    • New Relic Oneにアクセスし、登録しているユーザでログインします。
    • Logs UIにアクセスし、CloudFrontのログがLogs UIに表示されているかを確認します。
      補足: この時点では、CloudFrontから送信されるログラインの内容は、messageという属性に1つの文字列として設定されています。CloudFrontのログのフィールドを、それぞれの属性としてLogs UIで扱うためにParsingの設定を行います。
    • Logs UIの左ペインからParsingを選択し、右側からスライドして表示されるUI上のCreate parsing ruleボタンをクリックします。設定画面が表示されますので、以下の様に設定します。
      • Rule name: 管理しやすい名前を設定します。
      • Attribute/Value: Delivery streamを作成する際に作成したparameterをここで指定します。
      • Parsing logic: 以下の内容を記載します。
        以下の内容は、CloudFrontのReal time loggingを設定する際に、全てのフィールドを選択しているという想定のものになります。もし、全てを選択していない場合、適宜編集を行い、記載して下さい。
      • Parsingルール: 後続のコードサンプルをご確認下さい。
      • Enable rule: トグルを動かし、緑色にします。
      • Save parsing ruleボタンをクリックします。
    • Parsingの設定後に受け取るCloudFrontのログの内容が、それぞれの属性名で表示される様になっていることを確認します。
^%{NOTSPACE:timestamp}%{SPACE}%{NOTSPACE:client-ip}%{SPACE}%{NOTSPACE:time-to-first-byte}%{SPACE}%{NOTSPACE:sc-status}%{SPACE}%{NOTSPACE:sc-bytes}%{SPACE}%{NOTSPACE:cs-method}%{SPACE}%{NOTSPACE:cs-protocol}%{SPACE}%{NOTSPACE:cs-host}%{SPACE}%{NOTSPACE:cs-uri-stem}%{SPACE}%{NOTSPACE:cs-bytes}%{SPACE}%{NOTSPACE:x-edge-location}%{SPACE}%{NOTSPACE:x-edge-request-id}%{SPACE}%{NOTSPACE:x-host-header}%{SPACE}%{NOTSPACE:time-taken}%{SPACE}%{NOTSPACE:cs-protocol-version}%{SPACE}%{NOTSPACE:c-ip-version}%{SPACE}%{NOTSPACE:cs-user-agent}%{SPACE}%{NOTSPACE:cs-referer}%{SPACE}%{NOTSPACE:cs-cookie}(?<s1>(\t))(?<csuriquery>([^\t]*))(?<s2>(\t))%{NOTSPACE:x-edge-response-result-type}%{SPACE}%{NOTSPACE:x-forwarded-for}%{SPACE}%{NOTSPACE:ssl-protocol}%{SPACE}%{NOTSPACE:ssl-cipher}%{SPACE}%{NOTSPACE:x-edge-result-type}%{SPACE}%{NOTSPACE:fle-encrypted-fields}%{SPACE}%{NOTSPACE:fle-status}%{SPACE}%{NOTSPACE:sc-content-type}%{SPACE}%{NOTSPACE:sc-content-len}%{SPACE}%{NOTSPACE:sc-range-start}%{SPACE}%{NOTSPACE:sc_content_len}%{SPACE}%{NOTSPACE:c-port}%{SPACE}%{NOTSPACE:x-edge-detailed-result-type}%{SPACE}%{NOTSPACE:c-country}%{SPACE}%{NOTSPACE:cs-accept-encoding}%{SPACE}%{NOTSPACE:cs-accept}%{SPACE}%{NOTSPACE:cache-behavior-path-pattern}%{SPACE}%{NOTSPACE:cs-headers}%{SPACE}%{NOTSPACE:cs-header-names}%{SPACE}%{NOTSPACE:cs-headers-count}
New Relic Logs UI incoming logs
New Relic Logs non-parsed log line
New Relic Logs Parsing rule setting
New Relic Logs parsed log line

New Relic Dashboardの作成例紹介:

CloudFrontのログをNew Relicに連携することで以下のダッシュボードを作成することができるようになります。

Sample dashboard for CloudFront with log lines

補足情報:

4番で実施したParsingの設定により、Parsingされ全ての属性値は文字列となっています。dashboard上でParsingされた属性を利用される場合、あるいは、Query builderなどでNRQLを実行する場合、numeric関数をご利用の上で数値として取り扱うことができます。