Cloud Runをバックエンドにし、前段にFastlyなどのCDNをかますといった構成をすることは多いと思います。しかし、CDNはデプロイ時にキャッシュをパージしないと古い内容が残ってしまうという問題があります。Next.jsなどは特にパージしてあげなければならず、不整合がおきると500エラーとなってしまいページが見れなくなってしまうことが多々あります。
この記事では GCPのCloud Build から Faslty のキャッシュをパージする方法について解説します。
Fastlyのパージ方法
FastlyのキャッシュパージはAPI経由でパージすることができます。ありがたいことに、ドキュメントではcurlなど様々な実行例があるためこれを使用してCloud Build内でAPIを叩きキャッシュをパージします。
Cloud Build定義
それを踏まえて、yamlを作ってみます。Cloud Build には gcr.io/cloud-builders/curl
というものがあるようなのですが、メンテされていないようなので*1ubuntu2004
を使用します。
_FASTLY_SERVICE_ID
は Fastly のサービスIDで、_FASTLY_API_KEY
は Fastly のAPIキーを設定します。
- name: 'marketplace.gcr.io/google/ubuntu2004' id: 'purge-all-cache' entrypoint: 'curl' args: [ '-i', '-X', 'POST', 'https://api.fastly.com/service/${_FASTLY_SERVICE_ID}/purge_all', '-H', 'Fastly-Key: ${_FASTLY_API_KEY}', '-H', 'Accept: application/json', ]
これで、Cloud Build を実行するとパージが実行されます。実際に運用する場合はCloud Runにコンテナをデプロイしたあとにパージすると良さそうです。
おまけ
Fastlyのパージにはソフトパージという機能があり、これは Next.js の ISR のような挙動をします。これを使用するとデプロイ時にキャッシュが切れることによるバックエンドの負荷を軽減できる可能性があります*2。
ソフトパージを有効化する場合には以下ようにヘッダーを付与すると良さそうです:
args: [ '-i', '-X', 'POST', 'https://api.fastly.com/service/${_FASTLY_SERVICE_ID}/purge_all', '-H', 'Fastly-Key: ${_FASTLY_API_KEY}', '-H', 'Accept: application/json', '-H', 'Fastly-Soft-Purge: 1', ]
*1:cloud-builders/curl/README.md at master · GoogleCloudPlatform/cloud-builders
*2:Next.jsを動かしている場合は整合性が合わなくなる可能性があるのでおすすめしません