GCSのキャッシュ周りで少しハマって、なかなか情報が見つからなかったのでメモしておきます。
背景
- ユーザーの画像アイコンをGCSへ保存している
- 保存した画像はGCS上で公開リンクにし、画像参照してWebページ表示している
- 公開リンクにした場合、デフォルトはキャッシュが3,600秒有効になる
この状態の時にユーザーの画像アイコン変更したのですが、当然なかなか画像が切り替わりませんでした。
キャッシュが効いてるため、無効にしてやる必要があります。
Google Cloud Storageドキュメント - オブジェクトのメタデータ
解決策
以下は公開リンクにする処理ですが、その部分にキャッシュ無効の処理("no-cache")を追記しました。
これで公開リンクにしたと同時にキャッシュ対象外となり、即時の画像アイコン変更ができるようになりました。
using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
private async Task PublicReadFileToGcs(string bucketName, string path, string fileName)
{
// Google Storage
var storage = await StorageClient.CreateAsync();
var storageObject = storage.GetObject(bucketName, $"{path}/{fileName}");
// キャッシュを無効にするように追加
storageObject.CacheControl = "no-cache";
storageObject.Acl = storageObject.Acl ?? new List<ObjectAccessControl>();
storage.UpdateObject(storageObject, new UpdateObjectOptions
{
PredefinedAcl = PredefinedObjectAcl.PublicRead
});
}