事象
deploy.yml の deploy-web が index.html 以外の全資産(js/*.js, *.html, css/*.css, vendor/**)に Cache-Control: public, max-age=31536000, immutable を付与している。
これらアプリ資産はコンテンツハッシュでフィンガープリントしていない(js/auth.js 等、ファイル名固定)。そのため:
- 内容を更新してもブラウザが旧版を最大 1 年保持し再取得しない。
- CloudFront の
/* invalidation はエッジキャッシュのみを消し、ブラウザキャッシュは消せない。
- 結果、デプロイ直後に新旧 JS の混在が起き実行時エラーになる。
実害(v0.2.0 dev デプロイで確認)
SaaS Admin 画面で、新規 admin.js(Auth.isAppAdmin() を呼ぶ)+ ブラウザキャッシュの旧 auth.js(isAppAdmin 未定義)が混在し:
TypeError: Auth.isAppAdmin is not a function
origin/CloudFront 上のファイルは正しい(curl で確認済)が、invalidation 伝播中にロードしたブラウザが旧 immutable 資産を取得・固定化していた。
対処方針
フィンガープリント無しのアプリ資産(*.html / js / css)は ETag 再検証前提の no-cache で配信する。vendor/(サードパーティ・内容安定)のみ長期 immutable を維持。
恒久策として、ビルド時のアセット・フィンガープリント(内容ハッシュ付きファイル名)+ immutable 復活は別途検討の余地あり。
事象
deploy.ymlのdeploy-webが index.html 以外の全資産(js/*.js,*.html,css/*.css,vendor/**)にCache-Control: public, max-age=31536000, immutableを付与している。これらアプリ資産はコンテンツハッシュでフィンガープリントしていない(
js/auth.js等、ファイル名固定)。そのため:/*invalidation はエッジキャッシュのみを消し、ブラウザキャッシュは消せない。実害(v0.2.0 dev デプロイで確認)
SaaS Admin 画面で、新規
admin.js(Auth.isAppAdmin()を呼ぶ)+ ブラウザキャッシュの旧auth.js(isAppAdmin未定義)が混在し:origin/CloudFront 上のファイルは正しい(curl で確認済)が、invalidation 伝播中にロードしたブラウザが旧 immutable 資産を取得・固定化していた。
対処方針
フィンガープリント無しのアプリ資産(
*.html/js/css)は ETag 再検証前提のno-cacheで配信する。vendor/(サードパーティ・内容安定)のみ長期 immutable を維持。恒久策として、ビルド時のアセット・フィンガープリント(内容ハッシュ付きファイル名)+ immutable 復活は別途検討の余地あり。