Cloudflareで画像配信のコストを大幅カットした話
株式会社ventus / taro137
メンバー / フルスタックエンジニア
利用プラン | 利用機能 | ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
---|---|---|---|---|
Workers Paid | 画像配信のプロキシ | 10名以下 | 2023年11月 | B to C |
利用プラン | Workers Paid |
---|---|
利用機能 | 画像配信のプロキシ |
ツールの利用規模 | 10名以下 |
ツールの利用開始時期 | 2023年11月 |
事業形態 | B to C |
アーキテクチャ
アーキテクチャの意図・工夫
第一段階
移行コストや可用性を考慮し、従来用いてきたCloudFrontを完全には廃止せずその前段にCloudflareを繋ぎこみ、Cloudflareで障害が発生した場合は従来通りの方式に自動でフェイルオーバーするようにした。
第二段階
Workerでレスポンスをキャッシュしつつ、R2に存在せずS3にのみある画像をリクエストされた際はR2に画像をコピーすることで段階的に移行を進めた。これにより極力Cloudflareで完結させつつもデータ入れの作業を従来通りS3で行えるようにした。
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
弊社が提供する電子トレカサービスはかっこいい・かわいいカードを集めて楽しむものであるため、画像や動画が価値に直結する。また、カード自体だけでなくガチャ演出などでも画像や動画による演出があり、それらの転送量が非常に大きくなるサービスとなっている。弊社ではこれまで配信される画像・動画をS3に置き、CloudFrontで配信していた。ユーザー数とともにCloudFrontのデータ転送量も増加していることを踏まえ、今後事業を拡大しさらにトラフィックが増加してもAWSの料金を抑えられるような対策が必要だった。
どのような状態を目指していたか
- 画像や動画の配信を今まで通り行うことができる
- 利用料金を削減して今後サービスが拡大しても継続的にサービスを提供していける
- S3 + CloudFrontという構成からの移行コストが小さい
- 移行時のダウンタイムが短い
選定理由
従量課金制のCloudFrontと異なり、CloudflareのCDNは定額制となっており今後サービスが拡大してもCloudFrontの二の舞にならない。S3互換ストレージであるR2はエグレス料金が無料であり、画像配信をCloudflareだけで完結させることができる。
導入の成果
- 第一段階でCloudFrontのデータ転送量は90%以上減り、AWSの利用料金も今後のサービス拡大に耐えられる水準になった
- 第二段階のS3からR2への移行により、画像配信をCloudflareで完結させることが(ほとんど)できた
- CloudFrontの転送量は第一段階から第二段階でさらに約1/20,000になった
導入時の苦労・悩み
弊社ではもともとS3のバケットのサブディレクトリを配信しており、例えばexample.com/foo/bar.pngはあるバケットの/subdir/foo/bar.pngにマッピングされるようになっていた。この状況を改善するため、移行と同時に画像URLのパスとバケット内のパスが一致するようにする方法を模索したが、残念ながらそのような柔軟な移行には対応していなかった。そこでSuper Slurperでまとめて引っ越したのちR2側で画像のパスを書き換えることにより対応した。 移行後しばらくはデータ入れを引き続きS3で行っていたが、同様の理由でSippyが使えなかったためWorkerで自前実装を行った。
導入に向けた社内への説明
上長・チームへの説明
導入がほぼ確実となった段階から自分が参画したため特になし。
活用方法
よく使う機能
- Super Slurperでおおかたのデータを移行
- WorkerのCache APIでレスポンスをキャッシュする
- WorkerのR2 APIでR2への読み書きを行う
- Workerから必要に応じてCloudFrontにリクエストを送る
ツールの良い点
移行が簡単
第一段階の移行はダウンタイムがDNSレコード更新の浸透にかかる数分間のみで済んだ。
R2移行に関してもCloudflare公式がSuper SlurperやSippyといった移行ツールを提供しており、特別な事情がなければ数時間程度で簡単にS3から移行ができる。これはサービスを稼働させながら行えるためダウンタイムが発生しない。安い
第一段階のようにCloudFrontの前段に繋ぎ込む場合、Businessプランであれば$200/月(2024/10/04現在)で利用できる。
第二段階のWorkers Paidプランは$5.00/月。従量課金の分を含めてもCloudFrontに比べると圧倒的な安さを誇る。Workerの使い勝手がいい
TypeScript/JavaScriptでできることは基本的になんでもできる。有料プランでもWorkerあたり10MBという制限があるが、R2などのBindings APIが充実しているため今のところ困っていない。
ツールの課題点
- Worker周りはベータ版の機能も多く、仕様変更がまだ頻繁にある
- エグレス料金無料というのはデータ転送量に対して課金されないという意味であり、リクエスト数に対する課金はある(参考: 公式docs)
- Workerの無料プランでは圧縮後のサイズが1MBまでという制限があり、ライブラリを使った複雑なWorkerを使うには実質有料プラン必須となる
ツールを検討されている方へ
使いやすく金銭的にも導入がしやすいためまずは小さく始めて試してみるのがいいと思います。 ただ、アップデートはこまめにチェックしていく必要があります。
株式会社ventus / taro137
メンバー / フルスタックエンジニア
よく見られているレビュー
株式会社ventus / taro137
メンバー / フルスタックエンジニア
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法