Cloudflare LogPushでログをR2やNew Relicに飛ばしてみた
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つ理由があります。
- Cloudflareはインターネットをより安全にすることができないか?という命題に取り組んでいる
- オリジンは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 ID
とAccess Key
を貼り付けます。
設定が完了すると、ログは100,000レコード単位、もしくは1分単位どちらか短い方でログがPushされます。以下は、New Relicのダッシュボードサンプルです。
Discussion
現時点では、Instant LogsはBusinessプラン以上で利用できるようです。
そうですね。ちなみにこちらに全サービスごとのプラン一覧があります。