🐈

Cloudflare LogPushでログをR2やNew Relicに飛ばしてみた

2023/05/12に公開2

CloudflareはInstant Logという機能があり、無償プランでもログを確認することができます。またマネージメントコンソールでも可観測性を高めるためのダッシュボードが用意されています。

その一方で、ハイブリッド環境はマルチクラウド環境などで皆さんが慣れ親しんだツールにログを集約させたいケースもあります。それを実現させるのがCloudflare LogPushです。この機能はEnterpriseプランでご利用いただけます。

Instant Log と マネージメントコンソール
まずLogPushの機能を見る前に、標準機能のログを見てみます。

マネージメントコンソール左ペインのAnalytics & Logsをクリックします。

機能がいくつかの画面に分かれていますが、Cloudflareの管理画面は大きく2つに分かれていることをまずはご説明します。1.アカウント全体設定 2.ドメイン単位設定。
Cloudflareはドメイン単位で様々な機能が有効化されますが、中にはアカウント単位で有効化される機能もあります。このため管理者画面が大きく2つに分かれています。

見分け方は単純です。
画面左上にアカウント名が表示されていればアカウント全体設定画面です。

一方ドメインが設定されていればドメイン単位設定画面です。

まずはアカウント設定全体画面でAccount Analyticsを見てみます

Account Analytics

国単位のアクセス、消費帯域等が確認できます。この画面ではあくまでアカウント単位で出力されており、ドメイン単位ではないことに注意してください。

次にTLS通信の状況や、キャッシュヒット率、HTTPステータスコードなどの確認が可能です。

Web Analytics
Cloudflare PagesでホスティングしているWebサイト用Analyticsの画面です。
別のブログ記事にまとめてありますので併せてご覧ください。

Logs
この記事本題箇所です。後ほどまとめてご紹介します。

次にドメイン単位設定画面を見ていきます。

先ほどより項目が増えていることがわかります。
ひとつずつ見ていきましょう。
traffic





security


この環境ではDDoS対策をオンにしていませんので残念ながらデータが出ませんが、
いずれ機会があれば別記事でDDoS対策についてもまとめたいと思っています。


Rate LimitingとはWAFと連携する機能ですが、ある一定のルールに合致するリクエストがあらかじめ定めている閾値を超えた場合、追加のリクエストをブロックする機能です。例えば特定IPアドレスからの短期間で連続するリクエスト、や、特定国からのリクエストなどがそれにあたります。こちらについても、いずれ機会があれば別記事でまとめたいと思っています。

Performance

この画面ではArgo Smart RoutingによりCloudflareのエッジからオリジンへの通信最適化状態の統計が出力されます。Argo Smart Routingについて簡単に説明をします。
AWSでCloudFrontとEC2を使っている場合、CloudFrontのエッジからEC2への通信はAWS内部ネットワークを通過しEC2への通信が最適かされる、ということをご存じの方も多いかと思いますが、Cloudflareの場合オリジンへの通信はインターネットを経由します。これは意外に思われるかもしれませんが2つ理由があります。

  1. Cloudflareはインターネットをより安全にすることができないか?という命題に取り組んでいる
  2. オリジンはCloudflare Pages以外にも任意のロケーションを保護可能とする
    一方インターネットには定期的な輻輳遅延が発生し、自社ではコントロールしきれない遅延の原因となります。この問題を回避するために、専用NWを使うのではなく、自動で輻輳遅延を検知&回避し最適なルーティングを動的に組み上げるのがArgo Smart Routingです。こちらについても、いずれ機会があれば別記事でまとめたいと思っています。

DNS






Instant Logs

Start streamingボタンを押すと自動でログ収集を開始しますが、この画面が開いている間のみであることに注意してください。定常的にLogを保存するためにはLogPushを使う必要があります。

{
    "CacheCacheStatus": "hit",
    "CacheResponseBytes": 1351,
    "CacheTieredFill": false,
    "ClientASN": 8220,
    "ClientCountry": "jp",
    "ClientDeviceType": "desktop",
    "ClientIP": "27.110.13.170",
    "ClientMTLSAuthStatus": "unknown",
    "ClientRequestBytes": 3037,
    "ClientRequestHost": "imageresize.harunobukameda.labrat.online",
    "ClientRequestMethod": "GET",
    "ClientRequestPath": "/icons/apache_pb2.gif",
    "ClientRequestProtocol": "HTTP/2",
    "ClientRequestReferer": "",
    "ClientRequestScheme": "https",
    "ClientRequestSource": "eyeball",
    "ClientRequestURI": "/icons/apache_pb2.gif",
    "ClientRequestUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
    "ClientSSLCipher": "AEAD-AES128-GCM-SHA256",
    "ClientSSLProtocol": "TLSv1.3",
    "ClientSrcPort": 49444,
    "ClientTCPRTTMs": 29,
    "ClientXRequestedWith": "",
    "Cookies": {},
    "EdgeCFConnectingO2O": false,
    "EdgeColoCode": "NRT",
    "EdgeEndTimestamp": "2023-05-12T05:16:12Z",
    "EdgeResponseBodyBytes": 0,
    "EdgeResponseBytes": 433,
    "EdgeResponseContentType": "",
    "EdgeResponseStatus": 304,
    "EdgeServerIP": "",
    "EdgeStartTimestamp": "2023-05-12T05:16:12Z",
    "EdgeTimeToFirstByteMs": 7,
    "FirewallMatchesActions": [],
    "FirewallMatchesRuleIDs": [],
    "FirewallMatchesSources": [],
    "OriginDNSResponseTimeMs": 0,
    "OriginIP": "",
    "OriginRequestHeaderSendDurationMs": 0,
    "OriginResponseDurationMs": 0,
    "OriginResponseHTTPExpires": "",
    "OriginResponseHTTPLastModified": "",
    "OriginResponseHeaderReceiveDurationMs": 0,
    "OriginResponseStatus": 0,
    "OriginSSLProtocol": "unknown",
    "OriginTCPHandshakeDurationMs": 0,
    "OriginTLSHandshakeDurationMs": 0,
    "ParentRayID": "00",
    "RayID": "7c6030317cebf695",
    "RequestHeaders": {},
    "ResponseHeaders": {},
    "SecurityLevel": "med",
    "SmartRouteColoID": 0,
    "UpperTierColoID": 0,
    "WorkerStatus": "unknown",
    "WorkerSubrequest": false,
    "WorkerSubrequestCount": 0,
    "sampleInterval": 1
}

Logs
本記事のメインの箇所です。
現在ログがCloudflare R2 と New Relicに出力されています。

設定はAdd Logpush jobを押します。
出力したいログを選びNextを押します。

ログの項目を選びます。

出力されるTimeStampフォーマットやログの量を減らすためにサンプリングを行うかどうかを選択します。

ログのフィルタリングルールを設定しNextを押します。

ログの出力先を選びます。

API KeyをセットしたURLEndpointを記載しますが、New Relicの場合一般的に以下となります。

https://log-api.newrelic.com/log/v1?Api-Key={NR_LICENSE_KEY}&format=cloudflare

R2の場合、Access Key IDAccess Keyを貼り付けます。

設定が完了すると、ログは100,000レコード単位、もしくは1分単位どちらか短い方でログがPushされます。以下は、New Relicのダッシュボードサンプルです。

Discussion