Serverless画像最適化 コスト最小化パターン:eCPU秒/GB転送/ストレージ最適化
Serverlessでのオンザフライ画像最適化は CPU課金 + 転送 + ストレージ の三位一体。単体最適ではなく 費用関数 を分解し全体最小化します。
ゴール
- eCPU秒/GBを可視化
- 遅延ヒット (lazy variant) 削減
- 再圧縮効率閾値でCPU無駄削減
1. コスト式
# 月次概算コスト指標 (例: Workers+R2風)
TOTAL = CPU_SEC * unit_cpu + EGRESS_GB * unit_egress + R2_GET * unit_get + R2_PUT * unit_put + STORAGE_GB * unit_storage
2. 基本パターン
- フォーマット分岐 (AVIF/WebP/JPEG fallback)
- 幅クラスタリング (w=320,640,960,...)
- 期待コスト差分で遅延変換
- 生成済み低人気variantのガーベジ回収
// 1. Edgeリクエストハンドラ (pseudo)
if (cacheHit(request)) return cached();
const fmt = negotiateFmt(request.headers.accept); // avif|webp|jpeg
const variantKey = key + "_" + fmt + "_w"+targetW;
let originResp = await fetchOriginIfNeeded(key);
let optimized = await maybeTransform(originResp.body, {fmt,targetW});
return cachePutAndRespond(variantKey, optimized);
3. キャッシュ階層
CDN → Edge KV/Cache API → Origin (R2/S3) → 再生成。ミス原因を variantキー 毎に集計し幅クラスタ再設計。
// 2. 変換判定
function maybeTransform(buf,{fmt,targetW}){
const meta = sniff(buf);
if(meta.width <= targetW && meta.format === fmt) return buf; // no-op
return transcodeResize(buf, {format:fmt,width:targetW,quality:qFromPolicy(meta)});
}
4. ポリシー & 変換
# 3. Policy: 期待削減bytes/CPUms 比で実行
benefit = original_size - est_size_after(fmt,q)
if benefit / est_cpu_ms > THRESHOLD:
do_transform()
else:
short_circuit()
5. モニタリング & 人気度減衰
# 4. モニタリング指標 (export)
cache_hit_ratio, avg_cpu_ms, p95_cpu_ms, egress_gb, bytes_saved, transform_success_rate
# 5. 人気度の減衰サンプリング (Redis風)
HINCR popularity <key>
if (rand() < decay_probability(now - last_access)):
HSET popularity <key> popularity[key] * 0.7
6. FAQ
- 人気判定→LRUより減衰指数がスパイクに強い
- AVIF遅い? → 初回だけ、人気閾値超過でプリエンコード
7. まとめ
費用分解で最も弾性の高い項目へ集中投資し CIパイプライン で継続監視する体制が持続的削減を生みます。