Supabaseのコストと課金を最適化するための実践的なアプローチ
はじめに
Agile Technology Mediaでは、Supabaseを活用したプロジェクトにおいて、$60という課金が発生したという課題に直面しました。この課金の原因を明確にし、コストと課金を最適化するための具体的な手順を経験から学びました。本記事では、その経験をもとに、Supabaseのコスト最適化の実践的なアプローチをご紹介します。
1. Supabase課金の原因の特定
課金の原因を特定するには、Supabase Management APIを用いて詳細な請求情報を確認することが重要です。課金の原因を特定するためには、以下のような手順を実施しました。
# Supabaseのプロジェクト参照情報を確認
supabase projects list --output json
このコマンドでプロジェクトの詳細情報を取得し、課金が発生しているサービスやリソースを特定しました。また、config.tomlや.envファイルの内容を確認し、認証用のシークレットが適切に設定されているかを確認しました。
2. 課金の原因が見つかった
課金の原因は、supabase/functions/fax-webhook/index.tsというファイルで、Stripe APIに対して直接POSTリクエストを送信していたためでした。このリクエストは、公式のStripe SDKを使用するべきであり、生のAPI呼び出しは非推奨です。
// 旧コード(非推奨)
fetch('https://api.stripe.com/v1/subscription_items/<id>/usage_records', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
'Content-Type': 'application/json',
},
body: JSON.stringify({
quantity: 1,
}),
});
3. Stripe SDK経由でのAPI呼び出しに置き換え
Stripe SDKを使用することで、セキュリティと保守性の面で大きな利点があります。Stripe SDKを使用するには、deno.jsonにStripe SDKをpinします。
{
"imports": {
"stripe": "npm:stripe@8.117.0"
}
}
この設定により、Stripe SDKをインポートし、以下のようにAPI呼び出しを置き換えました。
// 新しいコード(Stripe SDKを使用)
import Stripe from 'stripe';
const stripe = new Stripe('sk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
await stripe.usageRecords.create('subscription_item_1234567890', {
quantity: 1,
});
4. コスト最適化のための設計改善
課金の原因が見つかった後、コストを最適化するための設計改善を行いました。具体的には、以下のような改善を実施しました。
- Stripe SDKの導入と活用:生のAPI呼び出しをStripe SDK経由に置き換え、セキュリティと保守性を向上させました。
- 課金監視の強化:Stripe APIを経由しての課金監視を強化し、課金の変化に迅速に対応できるようにしました。
- 課金の自動化と管理:課金の自動化と管理を実現し、手動での管理を減らすことで、コストを最適化しました。
5. まとめ
Supabaseのコストと課金を最適化するには、以下の点に注意することが重要です。
- 課金の原因を明確にし、適切なリソースの使用を確認する。
- Stripe SDKなどの公式SDKを活用し、セキュリティと保守性を向上させる。
- 課金監視を強化し、課金の変化に迅速に対応できるようにする。
- 課金の自動化と管理を実現し、手動での管理を減らすことで、コストを最適化する。
これらの実践的なアプローチを活用することで、Supabaseのコストと課金を最適化し、プロジェクトの運用効率を向上させることができます。