トラブルシューティング
概要
CloudFront を使用して問題をトラブルシューティングする方法を理解することで、オペレーターや SRE は、ウェブアプリケーションのさまざまな部分 (CloudFront、エッジ機能、オリジン) で発生する可能性のあるエラーを迅速に修正できます。これらのエラーには、圧倒されたオリジンが 5xx エラーを返す、CloudFront がオリジンに接続できない、コードで未処理の例外が発生して Lambda @Edge の実行に失敗したことがある、などがあります。
ユーザーからオリジンへのリクエストのトレース
CloudFront は、処理するリクエストごとに固有のリクエスト ID を生成します。リクエストがアプリケーションスタックを流れるときに、その ID を使用してリクエストをトレースすることをお勧めします。
- CloudFront は、HTTP リクエストへのレスポンスを返すときに、リクエスト ID を含む x-amz-cf-id ヘッダーを追加します。
- CloudFront は、アクセスログのリクエストに対して生成されたログレコードの x-edge-request-id フィールドにリクエスト ID を含めます。AWS WAF WebACL が CloudFront ディストリビューションにアタッチされている場合、WAF は WAF ログ内のリクエストに対して生成されたログレコードの requestID フィールドにリクエスト ID を含めます。例えば、OLXは、Slackのカスタマーサポートエンジニアがチャットボットを構築しました。これを使えば、 WAFログからリクエストIDを使って特定のリクエストを照会し、ブロックされた理由を理解し、顧客のチケットに日常的に迅速に対応できるようになりました。
- CloudFront ディストリビューションでエッジ関数が設定されている場合、リクエスト ID はイベントオブジェクトの requestID フィールドにある関数で (CloudFront 関数と Lambda @Edge) の両方で使用できます。
- キャッシュミスが発生すると、CloudFront はリクエストをオリジンに転送するときに、リクエスト ID の値を含む x-amz-cf-id ヘッダーをリクエストに追加します。このヘッダーはオリジンサーバーに記録することをおすすめします。
CloudFront を使用したエラーのトラブルシューティング
モニタリングシステム (CloudWatch アラームなど) が 4xx または 5xx エラーによる応答の増加を検出した場合、エラーの種類と発生箇所を詳しく調べて修正する必要があります。
そのためには、CloudFront のアクセスログをレコードでフィルタリングしてエラーコードを生成し、x-edge-result-type、 x-edge-response-result-type 、 x-edge-detailed-result-type のログフィールドを確認して、問題をよりよく理解してください。 アクセスログの分析は、ログをどこに保存するかによって異なります。非常に簡単な方法は、標準の SQL クエリで Athena を使用して S3 に保存されているログをクエリすることです。例として、次の SQL クエリは、最初の 100 レコードに制限された特定の日付範囲の 5xx エラーのログをフィルタリングします。
クラウドフロントログから* ASカウントを選択
ここで、日付「2022-06-09」と日付「2022-06-10」の間の「ステータス >= 500」と「日付」
LIMIT 100;
場合によっては、WAF または CloudFront のログを参照して追加のトラブルシューティング情報を入手してください。たとえば、AWS WAF ログは、特定のリクエストがブロックされた理由を説明できます。もう 1 つの例は、CloudWatch Logs のエッジ関数ログをチェックして、5xx になった実行エラーを理解することです。最後に、CloudFront がエラーをキャッシュする方法を理解して、CloudFront キャッシュからエラーレスポンスが返されるかどうかを知ることをお勧めします。
CloudFront を使用したレイテンシーのトラブルシューティング
モニタリングシステム (オリジンレイテンシーの CloudWatch アラームやキャッシュヒット率メトリックスなど ) が応答レイテンシーの増加を検出した場合、それを修正するためにレイテンシーのボトルネックがどこにあるのかを把握する必要があります。そのためには、CloudFront のアクセスログのレイテンシーフィールドを分析することを検討してください。次の表について考えます:
- 1 バイト目までの時間:CloudFront とビューワー間の最初のバイトのレイテンシー。標準ログとリアルタイムログで確認できます
- 所要時間:CloudFront とビューワー間のラストバイトレイテンシー (標準ログとリアルタイムログで確認可能)
- origin-fbl: CloudFront とオリジン間のファーストバイトのレイテンシー。リアルタイムログで確認できます
- origin-lbl: CloudFront とオリジン間のラストバイトレイテンシー。リアルタイムログで確認可能
これらのフィールドは、URL や国などの関連するディメンションの 1 つで SQL クエリをグループ化することで分析できます。これにより、レイテンシーの問題を絞り込むことができます。さらに、レスポンスヘッダーポリシーで設定すると、CloudFront のサーバータイミングヘッダーを使用してクライアント側でも同じ情報を確認できます。以下のサーバータイミングヘッダーは、私のリクエストがマルセイユのMRS52-P1 popのキャッシュヒットで、ダウンストリームの最初のバイトレイテンシーが64ミリ秒だったことを説明しています。CloudFront によって生成された Age ヘッダーに注目してください。このヘッダーには、このコンテンツが 61 秒後にオリジンからフェッチまたは更新されたことが説明されています。
CloudWatch RUM を使用したウェブパフォーマンスのトラブルシューティング
CloudWatch RUM では、ウェブページに javascript タグを組み込むことで、クライアント側でアプリケーションをモニタリングできます。javascriptは、接続ステップ(DNSルックアップ、TCP接続など)の内訳やGoogleのコアウェブバイタル(LCP、FIDなど)の内訳を含むページの読み込み時間などのデータをブラウザAPIから収集し、ダッシュボード用にCloudWatch RUMに送信します。ブラウザの種類、ユーザーの国、特定のページ ID などの特定のディメンションでフィルタリングすることで、アプリケーションのパフォーマンスを分析できます。
AWS サポートへの支援の依頼
エラーやレイテンシーの問題をさらにトラブルシューティングするために AWS サポートの支援が必要なシナリオでは、遅いリクエストやエラーの原因となるリクエストに対応する CloudFront リクエスト ID のリストを含むサポートへのチケットを開いてください。提供されたリクエスト ID により、サポートエンジニアは内部ログを詳しく調べて問題をより深く理解し、修正方法に関する推奨事項を提示できます。
リソース
- ドキュメンテーション:コンテンツを配信するために Amazon CloudFront を設定する際に発生する可能性のある一般的な問題のトラブルシューティング
- ブログ:AWS でコンテンツ配信をデバッグするための 4 つのステップ このブログは時代遅れですが、方法論はまだ有効であることに注意してください。
- CloudFront からの高まっているレイテンシーをトラブルシューティングして低くするにはどうすればよいですか?
- 方法:AWS サポートによる CloudFront のトラブルシューティング記事
- 方法:AWS サポートによる AWS WAF のトラブルシューティング記事
- AWS re: Invent 2021 — Amazon CloudWatch RUM によるエンドユーザーインサイトによるアプリケーションの最適化
- ブログ:Amazon CloudWatch ログ内の AWS WAF ログの分析
- ドキュメンテーション:Lambda @Edge 関数のテストとデバッグ
- ブログ:OpenTelemetry を使用して Amazon CloudFront でエンドツーエンドのトレースをセットアップする