Cloudflare Workers でキャッシュ層を作る

公開日:

画像サーバーの前段に Cloudflare Workers でキャッシュ層を作ったら転送量が大幅に減ったので記録です。

やったこと

  1. 以下のコードで Workers を作りカスタムドメインを当てる
  2. ソースコードの URL を Workers に割り当てたドメインに変更する
export default {
  async fetch(request, env, ctx) {
    // 1) リクエストURLを解析
    const url = new URL(request.url)

    // 書き換え元・書き換え先のドメイン
    const domain = 'workers.example.com' // Workers に割り当てるドメイン
    const mirror = 'origin.example.com' // 本来の画像サーバーのドメイン

    // 2) ドメインが一致する場合は書き換え
    if (url.hostname === domain) {
      url.hostname = mirror
    }

    // 3) キャッシュキーとして使うために、新しい Request オブジェクトを作成
    const cacheKey = new Request(url.toString(), {
      method: request.method,
      headers: request.headers,
      body: request.body,
      redirect: request.redirect,
      // POST / PUT などでボディがある場合はストリームを読み込み済みにする必要があるため注意。
      // ここではGETリクエスト想定で簡単に記述しています。
    })

    // 4) デフォルトキャッシュから取得を試みる
    const cache = caches.default
    let response = await cache.match(cacheKey)

    // 5) キャッシュに無ければ fetch
    if (!response) {
      response = await fetch(cacheKey)

      // 6) レスポンスがOKならキャッシュに put する
      if (response.ok) {
        // 非同期タスクとしてキャッシュ処理をバックグラウンド実行
        ctx.waitUntil(cache.put(cacheKey, response.clone()))
      }
    }

    // 7) レスポンスを返却
    return response
  },
}

結果

上がり調子だった転送量を大幅に減らすことができました!

Impressions

cloudflare-workers-cache-layer_010

Bandwidth

cloudflare-workers-cache-layer_020

さいごに

それにしても Cloudflare Workers はすごいですね。月5ドルで1,000万リクエスト捌けるので、他にも色々遊んでみたいです。

P.S. 確認したら160万リクエストだったのでまだまだ遊べそうです。