Cloud CDN + Cloud Load Balancing +Cloud Storageで404エラーがキャッシュされて困った話
こんにちは、ふみぽんです。ナビタイムジャパンでインフラ環境の管理・構築・運用を担当しています。
今回は、Google Cloud Platform(以降 GCP)のサービスであるCloud CDN + Cloud Load Balancing + Cloud Storageで構築している静的webサイトホスティングで「404 Not Found」をキャッシュさせてしまった時の確認ポイントを共有します。
何が起こったか
リリース時の確認でCloud Storageに必要なjsファイルが配置されていない状態でアクセスしてしまい、ステータスコードが404で返ってくる事象が発生しました。 すぐに該当のjsファイルをアップロードしましたが404レスポンスがキャッシュから返っており、 ブラウザのキャッシュクリアなど試しましたが改善しませんでした。その後、特に対処はできていませんでしたが、約1時間後に自動でキャッシュが消えjsファイルが返却されるようになりました。
Cloud CDNで404のステータスコードをキャッシュ設定している自覚がなかったので、各リソースのキャッシュ設定を確認することにしました。
システム構成
今回の構成をシステム構成図でご紹介します。
Cloud CDN
まずは、Cloud CDNのキャッシュ設定を確認しました。クライアント有効期間/デフォルトの有効期間/最大有効期間の設定を確認しましたが、こちらはすべて1分でした。
なお、キャッシュモードはCACHE_ALL_STATICになっていました。
また、ネガティブキャッシュは無効になっていました。
Cloud Storage
Cloud StorageではオブジェクトにCache-Controlのメタデータが設定されていない場合、デフォルトの1時間(public, max-age=3600)が適応されます。
どうやらこの設定が効いているようです。
さらに確認をすすめると、Cloud Storageにエラーページを設定していました。このindex.htmlにCache-Controlが設定されていなかったために、1時間意図したオブジェクトが返ってこなかったのです。
設定したことを忘れてました(・ω<)テヘペロ
Cloud CDNのネガティブキャッシュは無効にしてました。しかしCache-Control または Expires ヘッダーのないレスポンスに適用されるため、今回はCloud Storageによって勝手に付与されたCache-Controlがあったので適用外となっていました。
解決策
この場合に404を解消させるには、下記2つの方法があります。
1つ目はエラーページに設定してるオブジェクトにCache-Controlメタデータをno-storeで設定することです。
2つ目はCloud CDNのキャッシュに保存されたコンテンツの無効化を実行することです。
Cloud CDNでCloud Storageを利用すると、キャッシュの無効化でキャッシュされたオブジェクトをクリアすることができます。
GCPではCloud StorageのオブジェクトにCache-Controlメタデータがデフォルト1時間で設定され、それがCloud CDNのキャッシュ時間になるという仕様がありました。
AWSは、CloudFrontで全てのキャッシュを管理できるため、GCPでも同様にできると便利だと思います。
本記事が皆様に少しでもお役に立てれば幸いです。