Fastlyで 503 に備えたログの取得


この記事の内容について

サービスを運用していると 503 エラーなど想定外のエラーが発生してくることがあります。503 の発生件数は Fastly のコントロールパネルの Stats (トラフィックレポート)などから確認することが出来るのですが Stats からだけでは 503 エラーの発生原因まで知ることは出来ません。

この記事では 503 が発生した際に、発生した原因についても確認が出来るようなログ情報を取得するための設定について説明します。

エラーの原因は様々ですが、代表的なのは Fastly サーバーとオリジンサーバー間のネットワーク間に問題が発生したことによるコネクションタイムアウトや、高負荷によるオリジンの処理遅延によるエラーなどです。

実際に503が発生した場合の原因の分析と対処についてはFastly で 503 が出た場合の原因と対処をご参照下さい。

特に記載がない限り本記事の記載内容はデフォルト設定での挙動となります。
ログ配信機能全体については以下のページをご参照下さい。
Fastly Official: https://docs.fastly.com/guides/streaming-logs/setting-up-remote-log-streaming
日本語: http://qiita.com/Satoshi-Ishii/items/a5c87c9d2250a52fe4a0

ログの配信について

Fastly にはリアルタイムログストリーミング機能と呼ばれるログをほぼリアルタイムで送信する機能があります。
ログには通常の Web サーバーで取得可能な情報の他に、キャッシュやリクエスト処理に関する Fastly 独自の情報を追加することが出来ます。

503 エラーのトラブルシュート目的でログを取得する場合は、特に以下のような情報が有用です。

  • fastly_info.state
    リクエストがキャッシュにヒットしたかどうかなどの詳細

  • client.geo.country_code
    クライアントの IP アドレスから割り出したアクセス元の国情報

  • server.datacenter
    配信を行った Fastly の配信拠点情報

  • resp.response
    The HTTP status message を返却します。例えばConnection timed outなど503エラーの原因となった理由を確認することが出来ます。

  • time.to_first_byte
    リクエストがFastlyで処理され始めてから First Byte をクライアントに返信するまでの時間

  • time.elapsed
    リクエストがFastlyで処理完了(vcl_log サブルーチンに処理が到達)するまでの時間

上記のような情報をデフォルトの Common ログ形式のログに追加したい場合、Fastly のコントロールパネルの Log Formatに指定する文字列は以下のようになります。

%h %l %u %t "%r" %>s %b %{req.http.host}V %{client.geo.country_code}V %{server.datacenter}V %{fastly_info.state}V %{resp.response}V %{time.to_first_byte}V %{time.elapsed}V

Combined 形式(Common ログ形式に User-Agent と Referer を追加)のログに上記の情報を追加したい場合、コントロールパネルの Log Format は以下のように指定します。

User-Agent や Referer 情報は Bot などからのアクセスを防いだりする場合にも使えますので、ログ保存先の容量が問題ないのであればこちらのフォーマットを利用したほうが良いかも知れません。

%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i" %{req.http.host}V %{client.geo.country_code}V %{server.datacenter}V %{fastly_info.state}V %{resp.response}V %{time.to_first_byte}V %{time.elapsed}V

この文字列を以下のログ設定画面の Log Format に指定して下さい。

ここであげたもの以外にも Fastly では様々な情報をログに含めることが出来ます。必要に応じて取得したい情報を LogFormat に追加して下さい。その他の取得可能な情報については以下のページなどで確認してみて下さい。
https://docs.fastly.com/search#stq=variables&stp=1

ログ配信条件の設定

Fastly ではログを配信する条件を指定することも可能です。条件を追加したい場合は以下の手順で追加して下さい。


作成したログ配信設定横の Attach a Condition をクリックします。

条件に名前を記入し、取得したい条件を Apply if に追加して下さい。

例えばエンドユーザーに返却されたレスポンスコードが503の場合のみログを取得したいのであれば Apply if に記載する内容としては以下のような内容となります。

resp.status == 503

503 以外にも、200 や 304 以外のすべてのレスポンスコードのログを取得したいのであれば、以下のような条件がよいでしょう。

resp.status != 200 && resp.status != 304

条件の記載についての詳細は以下のページを参照してみて下さい。
http://qiita.com/Satoshi-Ishii/items/2e4d06a953aab20d5708

サービスのActivate

設定が完了したらサービスを Activate します。ログが正しく配信されているか確認しましょう。ログが正しく設定されていれば、以下のような内容が記録されれいるはずです。

113.34.10.91 "-" "-" [14/Apr/2017:09:10:15 +0000] "GET /img/aaa.jpg HTTP/1.1" 200 10434 www.example.com JP NRT HIT-CLUSTER OK 0.000
113.34.10.91 "-" "-" [14/Apr/2017:09:10:16 +0000] "GET /img/bbb.jpg HTTP/1.1" 200 12357 www.example.com JP NRT HIT-CLUSTER OK 0.000
113.34.10.91 "-" "-" [14/Apr/2017:09:10:16 +0000] "GET /assets/ccc.js HTTP/1.1" 200 6271 www.example.com JP NRT HIT-CLUSTER OK 0.000
113.34.10.91 "-" "-" [14/Apr/2017:09:10:17 +0000] "GET /assets/ddd.js HTTP/1.1" 304 "-" www.example.com JP NRT HIT-CLUSTER Not Modified 0.000
113.34.10.91 "-" "-" [14/Apr/2017:09:10:16 +0000] "GET /assets/eee.js HTTP/1.1" 304 "-" www.example.com JP NRT HIT-CLUSTER Not Modified 0.000
113.34.10.91 "-" "-" [14/Apr/2017:09:10:17 +0000] "GET /favicon.ico HTTP/1.1" 200 1260 www.example.com JP NRT HIT-CLUSTER OK 0.000
113.34.10.91 "-" "-" [14/Apr/2017:09:10:16 +0000] "GET /assets/fff.css HTTP/1.1" 304 "-" www.example.com JP NRT HIT-CLUSTER Not Modified 0.000
* 上記の例では省略していますが、ログ配信の設定や選択した配信先によって行の最初に Prefix と呼ばれる情報が記載されます。

上記のようなログが確認できればログは正しく取得されています。

Fastly Status

Fastly ではサービスの稼働状況をリアルタイムでステータスページで公開しています。503エラーなどが大量に発生していることが確認された場合、このステータスページで Fastly サービスそのものの状況も確認して見てください。

なお、ステータスページの右上にある赤色の Subscribe からメールアドレスなどを登録することで、ステータスに変更があった際にプッシュ通知を受け取ることが可能です。

是非メールアドレスを通知して、Fastly サービスに何かアップデートがあった場合に通知を受け取れるようにしておきましょう。(プッシュ通知ではエラー以外にもメンテナンスや配信拠点の追加などの情報についても通知されます。)

ステータスページの詳細については Fastly's network status を参照下さい。