ログストリーミング: Kafka
- English
- 日本語
Fastly のリアルタイムログストリーミング機能により、Apache Kafka にログを送信することができます。Kafka は、リアルタイムデータフィードを処理するための、高スループットで低レイテンシのオープンソースプラットフォームです。
Fastly ではサードパーティのサービスに関する設定等のサポートは行っておりません。詳細は Fastly's Terms of Service をご参照ください。
設定前の注意点
Fastly サービスのログエンドポイントとして Apache Kafka を追加する前に、Kafka がリモートサーバー上で作動していることを確認してください。1つ以上のサーバー (Broker) のホスト名や IP アドレス、およびメッセージが保存されるカテゴリーやフィード名 (Topic) が必要になります。Kafka の設定に関する詳細情報は、Apache Kafka クイックスタートガイドを確認してください。
出力された各々の Fastly ログは 個別の Kafka レコードで構成されており、Fastly では、バッチで複数の Kafka パーティションに複数のレコードを作成する標準の Kafka クライアントプロトコルに従っています。適切なログメッセージのスループットを確実にするには、ログ処理インフラストラクチャの機能に合わせて、Maximum bytes と Compression codec の設定を調整します。
Kafka はデフォルトで共有のリソースであり、環境内の Kafka の他のユーザーが、Fastly ログのスループットに影響を与える場合があります。独自の Kafka インフラストラクチャを使用している場合、Fastly では、ログを送信する Kafka トピックのパーティションとして、専用のディスクストレージボリュームを指定することを推奨しています。容量の拡張が必要になる場合に備えて IOPS を監視し、ストレージの最大値に対して帯域を消費する必要もあります。
Kafka をログエンドポイントとして追加する
次の手順に従って、Kafka をログエンドポイントとして追加します。
- Deliver サービス
- Compute サービス
リモートログストリーミングの設定に関するガイドの情報をご確認ください。
- Apache Kafka エリアで、Create endpoint をクリックします。
- Create an Apache Kafka endpoint フィールドに次のように入力します。
Name フィールドに、エンドポイントの分かりやすい名前を入力します。
Placement エリアで、生成された VCL のどこにログコールを配置するかを選択します。有効な値は、形式のバージョンのデフォルトとなしです。詳細については、ログの配置の変更に関するガイドをご覧ください。
Log format フィールドに、オプションでログフォーマットに使用するための Apache 形式の文字列や VCL 変数を入力します。詳細はフォーマットの例のセクションを参照してください。
- Brokers フィールドには、1つ以上のサーバー (Kafka ブローカー) のホスト名または IP アドレスを入力します。デフォルトでは、ポート9092を使用します。デフォルトのポートと異なる場合、ホスト名に形式
:[port](例::9093) を使用してポートを追加してください。複数のサーバーをコンマ区切りの文字列を使用して指定することができます。 - Topic フィールドには、ログを送信するトピック名を入力します。
- (オプション) Maximum bytes フィールドには、Kafka の生成リクエストメッセージの最大サイズをバイト単位で入力します。
- (オプション) Parse key-values コントロールから、Kafka レコードヘッダへログ形式内のキーと値のペアを解析するかどうかを選択します。キーと値のペアは、フォーマットされたログ行を
key=valとして導き、コンマ区切りでなければなりません。キーと値のいずれも二重引用符から始めることはできません。キーの先頭には任意の数のスペースを置くことができますが、キーの中にスペースを含めることはできません。キーは1文字以上でなければいけません。値は、key=内で空にすることができます。ログ行にキーと値のペア__record_keyを含めて、パーティションするレコードキーを指定します。ログは、Kafka の統一したスティッキーパーティション戦略に従ってパーティション化されます。指定されたレコードキーがない場合、Fastly の Kafka クライアントは、トピックの利用可能なパーティションにログメッセージを均一に配信します。 - (オプション) Write acknowledgement エリアでは、リーダーの Kafka ブローカーが生成リクエストを正常に受信する必要がある適切な書き込み確認を選択します。Fastly の Kafka クライアントは、指数バックオフとジッタで失敗した生成リクエストの限定的再配信を試み、thundering herd シナリオを低減します。
- (オプション) Compression codec エリアには、ログの圧縮に使用する適切なコーデックを選択します。
- (オプション) Use SASL コントロールから、SASL 認証を有効にするかどうかを選択します。SASL 認証は、TLS の暗号化と同時に有効にすることができます。Yes を選択すると、追加の SASL 認証フィールドが表示されます。
- SASL authentication mechanism メニューから、SASL クライアント認証のユーザー名とパスワードの認証に使用する適切なチャレンジレスポンスを選択します。
- User フィールドに、SASL クライアント認証ユーザー名を入力します。
- Password フィールドに、SASL クライアント認証パスワードを入力します。
- (オプション) Use TLS コントロールから、Kafka エンドポイントで TLS 暗号化を有効にするかどうかを選択します。TLS 暗号化は、SASL 認証と同時に有効にすることができます。Yes を選択すると、追加の TLS フィールドが表示されます。
TLS hostname フィールドに、任意でログ記録先サーバーの証明書を検証するためのホスト名を入力します。これは証明書の Subject Alternative Name (SAN) フィールドの1つである必要があります。一般名 (CN) はサポートされていません。
ホスト名が指定されない場合、Brokers フィールドにある最初のブローカーのホスト名が使用されます。このフィールドは、Use TLS メニューから Yes を選択した場合にのみ表示されます。- (オプション) TLS CA certificate フィールドには、Kafka ブローカーの証明書が有効であることの確認に使用する認証局 (CA) の証明書をコピー & ペーストしてください。アップロードする証明書は PEM 形式である必要があります。周知の認証局によって署名されてない場合には、証明書をアップロードすることを検討してください。TLS 証明書が周知の認証局によって署名されていれば、必要ありません。このフィールドは、Use TLS メニューから Yes を選択した場合にのみ表示されます。
- (オプション) TLS client certificate フィールドには、Kafka ブローカーへの認証に使用する TLS クライアント証明書をコピー & ペーストしてください。アップロードする TLS クライアント証明書は PEM 形式で、なおかつクライアントキーを添付する必要があります。TLS クライアント証明書により、Fastly が接続を実行していることを Kafka サーバーが認証できるようになります。このフィールドは、Use TLS メニューから Yes を選択した場合にのみ表示されます。
- (オプション) TLS client key フィールドには、Kafka ブローカーへの認証に使用する TLS クライアントキーをコピー & ペーストしてください。アップロードする TLS クライアントキーは、PEM 形式で、TLS クライアント証明書を添付する必要があります。TLS クライアントキーにより、Fastly が接続を実行していることを Kafka ブローカーが認証できるようになります。このフィールドは、Use TLS メニューから Yes を選択した場合にのみ表示されます。
Create をクリックして、新しいログ記録エンドポイントを作成します。
Activate メニューから、Activate on Production を選択して、設定の変更をデプロイします。
フォーマットの例
以下に示すのは、Apache Kafka にデータを送信する書式指定文字列の例です。書式指定文字列の詳細については、こちらをご覧ください。
{ "timestamp": "%{strftime(\{"%Y-%m-%dT%H:%M:%S%z"\}, time.start)}V", "client_ip": "%{req.http.Fastly-Client-IP}V", "geo_country": "%{client.geo.country_name}V", "geo_city": "%{client.geo.city}V", "host": "%{if(req.http.Fastly-Orig-Host, req.http.Fastly-Orig-Host, req.http.Host)}V", "url": "%{json.escape(req.url)}V", "request_method": "%{json.escape(req.method)}V", "request_protocol": "%{json.escape(req.proto)}V", "request_referer": "%{json.escape(req.http.referer)}V", "request_user_agent": "%{json.escape(req.http.User-Agent)}V", "response_state": "%{json.escape(fastly_info.state)}V", "response_status": %{resp.status}V, "response_reason": %{if(resp.response, "%22"+json.escape(resp.response)+"%22", "null")}V, "response_body_size": %{resp.body_bytes_written}V, "fastly_server": "%{json.escape(server.identity)}V", "fastly_is_edge": %{if(fastly.ff.visits_this_service == 0, "true", "false")}V}