Classic Load Balancer (CLB) のアクセスログ機能は、レイヤー 7 負荷分散向けに設計されています。この機能は Simple Log Service (SLS) と統合されており、ビジネス開発、テスト、ユーザー行動分析におけるログ分析とトラブルシューティングの効率を向上させます。
概要
CLB アクセスログ
CLB のアクセスログ機能は、CLB インスタンスに送信されたすべてのリクエストに関する詳細情報 (リクエスト時間、クライアント IP アドレス、レイテンシー、リクエストパス、サーバーレスポンスなど) をキャプチャします。公開エントリーポイントとして、CLB は大量のリクエストを処理します。アクセスログを使用して、ユーザー行動の分析、トラフィックの分散状況の把握、問題のトラブルシューティングを行うことができます。
アクセスログ機能を有効にすると、SLS の Logstore にアクセスログを保存、収集、分析できます。アクセスログの設定はいつでも無効にできます。
CLB のアクセスログ機能は無料ですが、SLS は料金が発生します。詳細については、「Simple Log Service の課金の概要」をご参照ください。
制限事項
-
アクセスログ機能は、CLB のレイヤー 7 負荷分散 (HTTP および HTTPS リスナー) でのみ利用できます。
-
レイヤー 4 リスナー (TCP/UDP) はアクセスログ機能をサポートしていません。Nginx のアクセスログやアプリケーションレベルのロギングフレームワークなどを使用して、バックエンドサーバーで直接ログを記録してください。
-
HTTP ヘッダーの値に
||が含まれていないことを確認してください。含まれている場合、解析中にログフィールドがずれる可能性があります。
前提条件
-
CLB インスタンスを作成していること。
-
vServer グループを作成し、その vServer グループにバックエンドサーバーを追加して、バックエンドサーバーにアプリケーションをデプロイしていること。
-
CLB インスタンスに対して HTTP リスナーまたは HTTPS リスナーを設定していること。
-
SLS をアクティベートしていること。
アクセスログの設定
- CLBコンソールにログインします。
-
ナビゲーションペインで、 を選択します。
-
上部メニューで、CLB インスタンスがデプロイされているリージョンを選択します。
-
この機能を初めて使用する場合は、権限付与 をクリックします。クラウドリソースへのアクセスを許可 ページで、同意 をクリックします。
説明この承認操作は一度だけ実行すれば十分です。
RAM ユーザーの場合、プライマリ Alibaba Cloud アカウントがまず必要な権限を付与する必要があります。詳細については、「CLB のアクセスログ機能を使用するための RAM ユーザーの承認」をご参照ください。
-
アクセスログ (レイヤー 7) ページで、対象の CLB インスタンスを見つけ、操作 列の ロギングの設定 をクリックします。
-
ロギングの設定 パネルで、プロジェクト と Logstore を設定し、OK をクリックします。
-
プロジェクト: Project は、リソースを分離・制御するための SLS のリソース管理単位です。アプリケーションごとに異なる Project を使用することを推奨します。
-
Logstore: Logstore は、SLS でログデータを収集、保存、クエリするための単位です。同じアプリケーション内の異なるタイプのログには、個別のLogstoreを作成することを推奨します。
-
既存の Logstore の選択: これを選択すると、選択した Logstore に対してデフォルトで事前設定された分析ダッシュボードが有効になります。Logstore にインデックスがすでに設定されている場合、既存のインデックス設定は上書きされます。
-
説明-
Project が CLB インスタンスと同じリージョンにあり、その名前がグローバルに一意であることを確認してください。
-
設定後、SLS の Project と Logstore が SLS コンソールに表示されるまで数分かかる場合があります。この間、ログデータが失われることはありません。まだ表示されない場合は、後でページを更新してください。
ロードバランサーのアクセスログを設定した後、SLS で以下のフィールドを使用してログ情報をクエリおよび取得できます。
パラメーター
説明
body_bytes_sent
クライアントに送信された HTTP 本文のサイズ。単位:バイト。
client_ip
クライアント IP アドレス。
client_port
リクエストを送信したクライアントのポート。
host
ホストは、リクエストパラメーター、Host ヘッダー、リクエストを処理するバックエンドサーバーの IP アドレスの順で、最初に使用可能なソースから取得されます。
http_host
リクエスト内の Host ヘッダーの内容。
http_referer
HTTP リクエストの Referer ヘッダー。
http_user_agent
HTTP リクエストの User-Agent ヘッダー。
http_x_forwarded_for
HTTP リクエストの X-Forwarded-For ヘッダー。
http_x_real_ip
HTTP リクエストの X-Real-IP ヘッダー。
read_request_time
ロードバランサーがリクエストを読み取るのにかかる時間。単位:ミリ秒。
request_length
開始行、HTTP ヘッダー、HTTP 本文を含むリクエストの長さ。
request_method
リクエストメソッド。
request_time
ロードバランサーがリクエストの最初のバイトを受信してからレスポンスの最後のバイトを送信するまでの時間。単位:秒。
request_uri
ロードバランサーが受信したリクエストの URI。
scheme
リクエストスキーム。有効な値:http および https。
server_protocol
ロードバランサーが受信したリクエストの HTTP バージョン (HTTP/1.0 や HTTP/1.1 など)。
slb_vport
ロードバランサーのリスナーポート。
slbid
ロードバランサーインスタンスの ID。
ssl_cipher
SSL 接続の確立に使用される暗号スイート (ECDHE-RSA-AES128-GCM-SHA256 など)。
ssl_protocol
SSL 接続の確立に使用されるプロトコル (TLSv1.2 など)。
status
ロードバランサーからのレスポンスに含まれるステータスコード。
tcpinfo_rtt
クライアントの TCP 接続のラウンドトリップタイム (RTT)。単位:マイクロ秒。
time
ログエントリが記録された時刻。
upstream_addr
バックエンドサーバーの IP アドレスとポート。
upstream_response_time
バックエンドサーバーへの接続が確立されてから、レスポンスを受信した後に接続が閉じるまでの時間。単位:秒。
upstream_status
ロードバランサーがバックエンドサーバーから受信するレスポンスのステータスコード。
vip_addr
仮想 IP アドレス (VIP)。
write_response_time
ロードバランサーがレスポンスを書き込むのにかかる時間。単位:ミリ秒。
-
注意事項
client_ip と http_x_forwarded_for
SLS アクセスログでリクエストソースを分析する際、これら 2 つのフィールドは異なる意味を持ちます。
-
client_ip:ネットワークレイヤーで CLB が観測した、CLB への接続を確立したソース IP アドレスです。クライアントの前にプロキシがない場合、これは実際のクライアント IP アドレスです。クライアントがプロキシの背後にある場合、これは最も近いプロキシの出口 IP アドレスです。 -
http_x_forwarded_for:CLB が受信したインバウンドリクエスト内のX-Forwarded-Forヘッダーの元の値です。これはクライアントまたは上流のプロキシによって書き込まれるもので、偽装される可能性があり、参考情報としてのみ使用されます。
アクセスログでリクエストソースを分析するには、client_ip を使用します。
(アクセスログでの分析ではなく) バックエンドサーバーで実際のクライアント IP アドレスを取得する必要がある場合は、CLB のレイヤー 7 リスナーがデフォルトで X-Forwarded-For ヘッダーで実際のクライアント IP アドレスを渡す点にご注意ください。詳細については、「CLB レイヤー 7 リスナーでクライアント IP アドレスを取得する」をご参照ください。
リクエストを処理した転送ルールの特定
アクセスログには、サーバーグループ ID やトラフィック転送ルールの名前は記録されません。特定のリクエストをどの転送ルールが処理したかを判断するには、ログ内の request_uri と http_host の値を、CLB コンソールで設定された転送ルールと関連付ける必要があります。これにより、転送ルールが期待どおりに機能しているかをさらに確認できます。
-
アクティブでない転送ルールの特定:
slbid、request_uri、および時間範囲を組み合わせて、特定の時間範囲内で転送ルールが一致した回数をクエリします。結果が0の場合、その期間中にルールはどのリクエストにも一致しませんでした。ビジネスニーズに基づいて、クリーンアップするかどうかを評価してください。slbid: <instance-ID> and request_uri: <forwarding-rule-path> | select count(*) as hit_count -
転送が期待どおりであることを確認: ログ内の
upstream_addrの値 (リクエストが実際に転送されたバックエンドサーバーの IP アドレスとポート) を、CLB コンソール内の対応するリスナーのサーバーグループメンバーと比較し、リクエストが意図したバックエンドサーバーに転送されていることを確認できます。
TLS ポリシーによる傍受
TLS セキュリティポリシーによってブロックされた接続は、TLS ハンドシェイクを完了しないため、アクセスログエントリは生成されません。アクセスログには、CLB との接続が正常に確立されたリクエストのみが記録されます。
アクセスログのクエリ
アクセスログ機能を設定した後、SLS コンソールでログをクエリできます。
- CLBコンソールにログインします。
-
ナビゲーションペインで、 を選択します。
-
上部メニューで、CLB インスタンスがデプロイされているリージョンを選択します。
-
アクセスログ (レイヤー 7) ページで、対象のインスタンスを見つけ、操作 列の ログの表示 をクリックします。SLS コンソールにリダイレクトされます。
-
SLS が設定されると、CLB インスタンスにアクセスした任意のクライアントのログエントリを表示できます。
-
SQL 文を入力して、特定のアクセスログをクエリします。
たとえば、次の SQL 文を実行して上位 20 のクライアントを検索します。結果は、トラフィックソースを分析し、ビジネス上の意思決定に役立ちます。
* | select http_user_agent, count(*) as pv group by http_user_agent order by pv desc limit 20たとえば、次の SQL 文を実行して、ソース IP アドレスとレスポンスステータスコードでログをフィルタリングすることにより、特定の IP アドレス範囲からのアクセスリクエストをクエリします。
* | select * where client_ip like '172.17.%' and status=200複数の CLB インスタンスが Logstore を共有する場合のログのフィルタリング
複数の CLB インスタンスが同じ SLS Logstore を共有している場合、ドメインまたはポートのみでフィルタリングするクエリは、不完全または誤解を招く結果を返す可能性があります。特定の CLB インスタンスとリスナーにログを絞り込むには、クエリで
slbid(インスタンス ID) とslb_vport(リスナーポート) フィールドを組み合わせてください。たとえば、特定のインスタンスとリスナーポートの 5xx エラーをクエリするには、次の SQL 文を実行します。
slbid: <instance-ID> and slb_vport: <port> and status: 5*クエリが結果を返さない場合は、以下を確認してください。
-
slbidの値は、(インスタンス名ではなく) CLB コンソールに表示されるインスタンス ID と完全に一致する必要があります。 -
slb_vportの値は、リスナーのポート番号 (たとえば、80や443) と一致する必要があります。 -
ログエントリはわずかな遅延で書き込まれることがあるため、クエリの時間範囲を広げてください。
説明ログの更新動作と同一タイムスタンプのエントリについて、次の点に注意してください。
-
ログの更新動作: SLS のフィールドインデックス統計は、ログエントリが書き込まれるとリアルタイムで更新されます。固定の更新間隔はありません。コンソールでクエリの時間範囲を切り替えた場合は、クエリボタンをクリックして結果を再読み込みしてください。
-
同じタイムスタンプを持つ複数のエントリ: 同じ
time値を共有する複数のログエントリが表示される場合、これは期待される動作であり、クライアントが同じ秒内に複数のリクエストを送信したことを示します。これは高頻度クライアントの正常なパターンであり、システムエラーを示すものではありません。繰り返されるリクエストが異常であると判断した場合は、アクセス制御ポリシーを設定してソース IP アドレスを制限してください。
-
SLS SDKまたはAPIを使用したプログラムからのログクエリ
CLB のアクセスログデータは SLS の Logstore に保存されます。コンソールに加えて、コンソールにログインせずに SLS SDK または API を使用してプログラムからログデータをクエリできます。詳細な手順とコード例については、「クイックスタート:SLS SDK を使用したログのアップロードと分析」をご参照ください。
DescribeAccessLogsDownloadAttribute などの CLB 側の API は、ログのダウンロード設定の管理にのみ使用され、ログデータのクエリには使用できません。
アクセスログの分析
SLS のダッシュボードを使用してアクセスログを分析できます。ダッシュボードは、豊富なデータの視覚化とインサイトを提供します。
-
SLS ページで、ナビゲーションペインの
アイコンをクリックし、[ダッシュボード] をクリックします。 -
CLB インスタンスのアクセスログに対応するダッシュボードの名前 (たとえば slb_layer7_access_center_en など) をクリックして、分析レポートを表示します。
ビジネストラフィックの分析
ダッシュボードに加えて、以下の一般的なビジネスシナリオに対して SQL 文を作成できます。
リスナーポートごとのリクエスト数
特定の CLB インスタンスとリスナーポートが処理したリクエストの総数をカウントするには、次のようにします。
slbid: <instance-ID> and slb_vport: <port> | select count(*) as total_requests
ドメインのトラフィックシェアの表示
http_host および request_length フィールドに基づいて各ドメインのトラフィックシェアを計算するには、次のようにします。
* | select http_host, sum(request_length) as total_bytes, round(sum(request_length) * 100.0 / sum(sum(request_length)) over(), 2) as traffic_pct group by http_host order by total_bytes desc
バックエンドサーバーのトラフィック分散の表示
upstream_addr および request_length を使用して、どのバックエンドサーバーが最も多くのリクエストを受信しているかを特定し、そのトラフィックの分散状況を推定するには、次のようにします。
* | select upstream_addr, count(*) as request_count, sum(request_length) as total_bytes group by upstream_addr order by request_count desc limit 20
異常なリクエストの特定
CLB アクセスログには、ロードバランサーインスタンスを通過するすべての外部リクエストが記録されます。ログに未知のソースからのリクエストが見つかった場合、以下の主要なフィールドを使用して、それらが異常な外部リクエストであるかどうかを判断し、適切な保護措置を講じることができます。
主要なフィールド
以下のログフィールドを組み合わせて、リクエストが異常なクライアントからのものかどうかを判断します。
-
client_ip:リクエストを送信したクライアントの IP アドレス。IP アドレスがビジネスシステムや Alibaba Cloud 内部 IP アドレス範囲に属していない場合、リクエストは外部クライアントからのものです。IP 検索ツールを使用してソースをさらに確認できます。 -
request_uri:リクエストの URI パス。ビジネスに関連しないパス (プローブパスやスキャンパス、他のクラウドサービスの API パスなど) が表示される場合、リクエストは通常、異常な外部リクエストです。 -
request_method:リクエストの HTTP メソッド。ビジネスが GET リクエストのみを使用しているにもかかわらず、ログに多数の PUT または DELETE リクエストが表示される場合は、異常な動作を確認してください。 -
http_user_agent:リクエストの User-Agent 識別子。自動化ツールやクローラーは、通常のブラウザリクエストとは異なる特定の User-Agent ヘッダー (curlやpython-requestsなど) を使用することがよくあります。
たとえば、SLS で次の SQL 文を使用して、予期しない IP アドレスからの異常なリクエストをクエリできます。
* | select client_ip, request_method, request_uri, count(*) as cnt group by client_ip, request_method, request_uri order by cnt desc limit 50
異常なソース IP の制限
異常なリクエストのソース IP アドレスを確認した後、CLB のアクセス制御機能を使用してブラックリストを設定し、これらの IP アドレスからの後続のリクエストをブロックできます。次の手順を実行してください。
-
CLB コンソールのナビゲーションペインで、[アクセス制御] を選択します。
-
アクセス制御ポリシーグループを作成し、特定された異常なソース IP アドレスを追加します。
-
ポリシーグループをブラックリストとしてリスナーにバインドします。これにより、CLB はブラックリストに登録された IP アドレスからのすべてのリクエストを拒否し、バックエンドサーバーに転送しなくなります。
アクセスログの無効化
アクセスログ機能を無効にして、CLB アクセスログの収集を停止できます。
CLB インスタンスのアクセスログを無効にしても、関連付けられた Project や Logstore は削除されません。インスタンスの過去のログはすぐには削除されず、引き続き SLS で管理できます。
- CLBコンソールにログインします。
-
ナビゲーションペインで、 を選択します。
-
上部メニューで、CLB インスタンスがデプロイされているリージョンを選択します。
-
アクセスログ (レイヤー 7) ページで、対象のインスタンスを見つけ、操作 列の ログの無効化 をクリックします。
-
表示されたダイアログボックスで OK をクリックして、インスタンスのアクセスログを無効にします。
関連ドキュメント
-
SLS の詳細については、「Simple Log Service とは」をご参照ください。
-
レイヤー 7 負荷分散を使用しているときにバックエンドサーバーが異常であると疑われる場合は、「CLB アクセスログを使用した異常なバックエンドサーバーの迅速な特定」をご参照ください。
よくある質問
アクセスログを使用して、リクエストのレイテンシー、タイムアウト、または接続の問題をトラブルシューティングするにはどうすればよいですか?
レイテンシーの原因の特定
request_time と upstream_response_time フィールドを比較します。
-
request_time:CLB がリクエストの最初のバイトを受信してからレスポンスの最後のバイトを送信するまでの合計経過時間。単位:秒。 -
upstream_response_time:CLB がバックエンドサーバーへの接続を確立してから、完全なレスポンスを受信して接続を閉じるまでの時間。単位:秒。
2 つの差 (request_time から upstream_response_time を引いた値) には、CLB の処理、クライアントと CLB 間のネットワークラウンドトリップ、およびクライアントがレスポンスを読み取るのにかかる時間が含まれます。それぞれの割合を比較して、ボトルネックを特定できます。
-
upstream_response_timeがrequest_timeの大部分を占める場合:レイテンシーは主にバックエンドサーバーのレスポンスが遅いことが原因です。バックエンドアプリケーションやデータベースなどのパフォーマンスを確認してください。 -
upstream_response_timeが占める割合が小さい場合 (つまり、差が大きい場合):バックエンドの応答は速いため、ボトルネックはクライアントと CLB 間のネットワーク、またはクライアントが大きなレスポンス本文をゆっくり読み取っている可能性が高いです。レイテンシーを CLB の処理のせいにするのではなく、client_ipやbody_bytes_sentなどのフィールドを使用してさらに調査してください。
タイムアウトのトラブルシューティング
タイムアウトしたリクエストは、TCP ハンドシェイクまたはプロトコル確立フェーズで失敗し、対応するアクセスログエントリは生成されません。そのため、これらのリクエストをアクセスログで直接見つけることはできません。間接的に調査するには、SLS コンソールで関連する時間範囲のアクセスログをクエリし、リクエスト量の大幅な減少やログのギャップを確認して、タイムアウトが発生した時期を推定できます。さらに診断するには、CLB の上流にある WAF ログやバックエンド ECS インスタンスのアプリケーションおよびファイアウォールログなど、上流と下流のログを使用してエンドツーエンドのトラブルシューティングを実行してください。