Cloud BuildでFastlyのキャッシュをパージする

Cloud Runをバックエンドにし、前段にFastlyなどのCDNをかますといった構成をすることは多いと思います。しかし、CDNはデプロイ時にキャッシュをパージしないと古い内容が残ってしまうという問題があります。Next.jsなどは特にパージしてあげなければならず、不整合がおきると500エラーとなってしまいページが見れなくなってしまうことが多々あります。

この記事では GCPのCloud Build から Faslty のキャッシュをパージする方法について解説します。

Fastlyのパージ方法

FastlyのキャッシュパージはAPI経由でパージすることができます。ありがたいことに、ドキュメントではcurlなど様々な実行例があるためこれを使用してCloud Build内でAPIを叩きキャッシュをパージします。

developer.fastly.com

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を動かしている場合は整合性が合わなくなる可能性があるのでおすすめしません