ログストリーミング:Coralogix

Fastly の リアルタイムログストリーミング 機能によって Coralogix にログファイルを送信することができます。Coralogix は 動的アラート比率ベースのアラートフローの異常検出、そして 脅威発見機能などで異常な行動を検知できる分析プラットフォームを提供しています。

前提条件

まだ Coralogix のアカウントをお持ちでない場合、Coralogix の Web サイトの登録手順に従ってアカウントを登録する必要があります。登録が完了したら、Coralogix のダッシュボードの Settings セクションにある Send Your Logs エリアに移動し、固有の秘密鍵をメモします。この秘密鍵は、お客様が送信したデータをお客様のアカウントと関連付けるために、Coralogix によって使用されます。Fastly でエンドポイントを設定する際に必要となります。

コントロールパネルの代わりにコマンドラインで Coralogix エンドポイントを追加する場合は、Fastly APIトークン、Fastly サービス ID、Coralogix ログを有効にする Fastly サービスのバージョン番号も必要になります。

Coralogix をログエンドポイントとして追加

以下の手順で、Coralogix をログエンドポイントとして追加します。

  1. リモートログストリーミングの設定に関するガイドの情報をご参照ください。
  2. HTTPS Create endpoint ボタンをクリックしてください。Create an HTTPS endpoint ページが表示されます。
  3. Create an HTTPS endpoint フィールドに次のように入力します。
    • Name フィールドに分かりやすいエンドポイントの名前を入力します。
    • Placement セクションでは、生成される VCL にログコールが配置される場所を選択します。有効な値は Format Version Defaultwaf_debug (waf_debug_log)None です。詳細については、ログ配置の変更に関するガイドをご参照ください。
    • Log format フィールドで、プレースホルダーとして入力されているログフォーマットを、以下の 推奨されるログ形式とフィールド設定 に記述されているように適切に変更してください。
    • URL フィールドには、https://api.coralogix.com/logs/rest/singles を入力します。
    • Maximum logs フィールドは、0 (デフォルト) のままにしておきます。
    • Maximum bytes フィールドに、2000000 を入力します。
  4. Create an HTTPS endpoint ページの Advanced options リンクをクリックします。Advanced options が表示されます。
  5. Create an HTTPS endpoint ページの Advanced options に次のように入力します。
    • Content type フィールドに application/json を入力します。
    • Custom header name フィールドに private_key を入力します。
    • Custom header value フィールドに、Coralogix の秘密鍵を入力します。
    • Method コントロールから、POST を選択します。
    • Custom header value コントロールから、Array of JSON を選択します。
    • Select a log line format コントロールはデフォルトのままにします。
    • TLS hostname フィールドに、サーバーの証明書を検証するためのホスト名を任意で入力します。これは、証明書のサブジェクト代替名(SAN)フィールドの1つと同じである必要があります。コモンネーム(CN)はサポートされていません。
    • TLS CA certificate フィールドには、オリジンサーバーの証明書が有効であることを確認するために使用する認証局 (CA) の証明書をオプションでコピーアンドペーストしてください。アップロードする証明書は PEM フォーマットである必要があります。周知の認証局によって署名されてない場合には、証明書のアップロードを熟慮してください。TLS 証明書が周知の認証局によって署名されていれば、必要ありません。
    • TLS client certificate フィールドには、オリジンサーバーへの認証に使用する TLS クライアント証明書をオプションでコピーアンドペーストしてください。アップロードする TLS クライアント証明書は、PEM 形式で、クライアント証明書を添付する必要があります。TLS クライアント証明書により、Fastly が接続を実行していることをサーバーが認証できるようになります。
    • TLS client key フィールドには、バックエンドサーバーへの認証に使用する TLS クライアントキーをオプションでコピーアンドペーストしてください。アップロードする TLS クライアントキーは、PEM 形式で、TLS クライアント証明書を添付する必要があります。TLS クライアントキーにより、Fastly が接続を実行していることをサーバーが認証できるようになります。
  6. Create ボタンをクリックすると、新しいログエンドポイントが作成されます。
  7. Activate ボタンをクリックして設定変更をデプロイします。

推奨されるログ形式とフィールド設定

以下のログ形式を使用します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
{
  "timestamp":%{time.start.msec}V,
  "applicationName":"fastly",
  "subsystemName":"%{req.service_id}V",
  "severity": 3,
  "json": {
    "time": {
        "start":"%{begin:%Y-%m-%dT%H:%M:%S%Z}t",
        "end":"%{end:%Y-%m-%dT%H:%M:%S%Z}t",
        "elapsed":%D
    },
    "cdn_server": {
        "ip_ipaddr":"%A",
        "code":"%{server.datacenter}V",
        "hostname":"%{server.hostname}V",
        "region_code":"%{server.region}V",
        "is_cacheable":%{if(fastly_info.state ~"^(HIT|MISS)$", "true", "false")}V,
        "cache_status":"%{regsub(fastly_info.state, "^(HIT-(SYNTH)|(HITPASS|HIT|MISS|PASS|ERROR|PIPE)).*", "\\2\\3")}V",
        "is_h2":%{if(fastly_info.is_h2, "true", "false")}V,
        "is_h2_push":%{if(fastly_info.h2.is_push, "true", "false")}V,
        "h2_stream_id":"%{fastly_info.h2.stream_id}V"
    },
    "client": {
        "city_name":"%{client.geo.city.utf8}V",
        "country_code":"%{client.geo.country_code}V",
        "country_name":"%{client.geo.country_name}V",
        "continent_code":"%{client.geo.continent_code}V",
        "region":"%{client.geo.region}V",
        "ip_ipaddr":"%h",
        "name":"%{client.as.name}V",
        "number":"%{client.as.number}V",
        "connection_speed":"%{client.geo.conn_speed}V",
        "location_geopoint": {
            "lat":%{client.geo.latitude}V,
            "lon":%{client.geo.longitude}V
        }
    },
    "response": {
        "status":%>s,
        "content_type":"%{Content-Type}o",
        "age":"%{Age}o",
        "cache_control":"%{Cache-Control}o",
        "expires":"%{Expires}o",
        "last_modified":"%{Last-Modified}o",
        "tsv":"%{TSV}o",
        "header_size":%{resp.header_bytes_written}V,
        "body_size":%B
    },
    "request": {
        "host":"%{req.http.host}V",
        "is_ipv6":%{if(req.is_ipv6, "true", "false")}V,
        "backend":"%{req.backend}V",
        "service_id":"%{req.service_id}V",
        "url":"%{cstr_escape(req.url)}V",
        "url_ext":"%{req.url.ext}V",
        "header_size":%{req.header_bytes_read}V,
        "body_size":%{req.body_bytes_read}V,
        "method":"%m",
        "protocol":"%H",
        "referer":"%{Referer}i",
        "user_agent":"%{User-Agent}i",
        "accept_content":"%{Accept}i",
        "accept_language":"%{Accept-Language}i",
        "accept_encoding":"%{Accept-Encoding}i",
        "accept_charset":"%{Accept-Charset}i",
        "connection":"%{Connection}i",
        "dnt":"%{DNT}i",
        "forwarded":"%{Forwarded}i",
        "via":"%{Via}i",
        "cache_control":"%{Cache-Control}i",
        "x_requested_with":"%{X-Requested-With}i",
        "x_att_device_id":"%{X-ATT-Device-Id}i",
        "x_forwarded_for":"%{X-Forwarded-For}i"
    },
    "socket": {
        "cwnd":%{client.socket.cwnd}V,
        "pace":%{client.socket.pace}V,
        "nexthop":"%{client.socket.nexthop}V",
        "tcpi_rcv_mss":%{client.socket.tcpi_rcv_mss}V,
        "tcpi_snd_mss":%{client.socket.tcpi_snd_mss}V,
        "tcpi_rtt":%{client.socket.tcpi_rtt}V,
        "tcpi_rttvar":%{client.socket.tcpi_rttvar}V,
        "tcpi_rcv_rtt":%{client.socket.tcpi_rcv_rtt}V,
        "tcpi_rcv_space":%{client.socket.tcpi_rcv_space}V,
        "tcpi_last_data_sent":%{client.socket.tcpi_last_data_sent}V,
        "tcpi_total_retrans":%{client.socket.tcpi_total_retrans}V,
        "tcpi_delta_retrans":%{client.socket.tcpi_delta_retrans}V,
        "ploss":%{client.socket.ploss}V
    }
  }
}

以下の推奨形式の最初の5つのフィールドは必須です。

  • Timestamp - このフィールドのフォーマットは変更しないでください。
  • applicationName - このフィールドにはアプリケーションの名前を入力してください。
  • subsystemName - このフィールドにサブシステムの名前を入力してください。これは、コンポーネントを分離するために使用されます。例では req.service_id を使用していますが、これは人間可読ではありません。サブシステムを識別するのに分かりやすい、意味のあるサブシステム名を使用してください。
  • Severity - 重大度を指定し、以下の選択肢を使用してすべてのログに適用することができます: 1 (デバッグ)、2 (冗長化)、3 (情報)、4 (警告)、5 (エラー)、6 (危機的)。これは後から、後述の抽出ルールを使って変更することができます。
  • JSON (object) - 必要に応じてフィールドを追加または削除してください。静的フィールドを追加することができます。Fastly VCL リファレンス に記載されているフィールドを含む、ネスト化された JSON 形式がサポートされています。

response.status フィールドはリクエストステータスを送信します。これは推奨フィールドです。Coralogix 解析ルール を使用して、リクエストのステータスコード値を Coralogix の深刻度に抽出する JSON Extract ルールを設定することで、ログの種類に応じて重要度を自動的に判断する深刻度を定義することができます。具体的には、HTTP ステータスコードを適切に深刻度タグに自動的にマッピングすることができます。例えば、2xx ステータスコードは Coralogix の深刻度を "INFO" とし、4xx ステータスコードは Coralogix の深刻度を "ERROR" とします。

Coralogix Web インターフェースでは、以下のように表示されます。

新しい Coralogix ルールの作成

Coralogix ダッシュボードとアラートの設定

Coralogixは、ダッシュボードやアラートを介して Fastly と自社サービスを統合するためのチュートリアルを提供しています。サービスの概要、ビジターの内訳、サービスの質など、Fastly のデータを使って作成されたデータダッシュボードの例が掲載されています。

チュートリアルでは、Fastly からのログの受信問題、オリジンでの障害、エラー率やキャッシュミスの増加、様々な異常や疑わしいリクエスト、Web サイトの改ざんなどの状況に応じてユーザー定義アラート設定する方法も説明されています。

Back to Top