Cloud Storageにアプリをデプロイする際に最新のコードがすぐに反映されるようにする

こんにちは!kossyです!



さて、今回はGCPのCloud Storageにgsutilを使ってアプリケーションをデプロイする際に、
最新のコードがすぐに反映されるようにする方法を
ブログに残してみたいと思います。


これやらないとデプロイしても最新のコードが反映されないことがあるので、
要チェックですよ、、、



解答

先にデプロイコマンドを晒します。

$ gsutil -h "Cache-Control:private, max-age=0, no-transform" cp -r dist/* gs://application-url

gsutilはGoogle Cloud Storage をターミナルから操作するためのツールのことです。
apps-gcp.com

Cache-Control:privateは、下記サイトによると、
developers.google.com

レスポンスが「public」とマークされている場合は、レスポンスに HTTP 認証が関連付けられているとしても、さらにレスポンスのステータス コードが通常キャッシュ可能になっていない場合でも、レスポンスをキャッシュに保存できます。 通常は、明示的なキャッシュ情報(「max-age」など)によってレスポンスがキャッシュ可能であることが指定されているため「public」は必要ありません。

一方、「private」レスポンスは、ブラウザのキャッシュには格納できますが、 通常、対象ユーザーは 1 人のため、中間キャッシュに格納することは認められません。 たとえば、個人的なユーザー情報を含む HTML ページはそのユーザーのブラウザでのみキャッシュに格納でき、CDN では格納できません。

とのこと。
キャッシュの扱い方について決めていると理解すれば良さそうです。


max-age=0は、これまた下記サイトによると、
developers.google.com

取得したレスポンスを再使用できる最大時間を、リクエストの時刻を起点とする秒数で指定します。
たとえば、"max-age=60" は、レスポンスを 60 秒間キャッシュに格納して再使用できることを示します。

とのこと。
今回は0と指定しているので、レスポンスを再使用しないようにしているという理解で良さそうです。


no-transformは、またまた下記サイトによると、
developers.google.com

リソースに対して変換を行うべきではないことを表します。Content-Encoding、Content-Range、Content-Type ヘッダーをプロキシによって変更してはいけません。例えば、不透明なプロキシや GoogleのWeb Light などのブラウザの機能は、キャッシュ空間を節約したり、低速なリンク上でのトラフィック量を減らしたりするために、画像フォーマットを変換することがあります。no-transform ディレクティブはこれを禁止します。

とのこと。
余計なフォーマットの変換などをさせない設定だと思えば良さそうです。

cp 以下のコマンドは指定したURLに向けてリソースを配置しに行っているだけです。



これでデプロイ直後にForce Reloadを行わなくてもよくなりました、、、


最新のコードがmax-ageが原因ではない場合もありますので、その場合は
qiita.com
上記のサイトを参考に、エッジサーバーのキャッシュの設定を確認してみてください。



参考にさせていただいたサイト
AWS S3更新時にLambdaでCloudFrontのInvalidationを自動実行 - Qiita