エンジニアが新婦のために結婚式にITで全力で貢献しようとした話【連載第3回】写真をAI顔認識で自動タグ付けする仕組み
AWS Rekognition × Supabase Edge Functions 実装Tips
1. SDKなしでRekognition APIを叩く方法
Supabase Edge Functions(Deno環境)ではAWS SDKが使えません。HTTP直接呼び出し + Signature V4手動署名で対応します。
// Signature V4署名チェーンの実装例
async function callRekognition(action: string, body: object) {
const payload = JSON.stringify(body);
const timestamp = new Date().toISOString().replace(/[-:]/g, "").split(".")[0] + "Z";
const dateStamp = timestamp.substring(0, 8);
// 署名キーを段階的に導出
const kDate = await hmacSHA256("AWS4" + SECRET_KEY, dateStamp);
const kRegion = await hmacSHA256(kDate, REGION);
const kService = await hmacSHA256(kRegion, "rekognition");
const kSigning = await hmacSHA256(kService, "aws4_request");
// 正規リクエストのハッシュ → 署名
const canonicalRequest = [
"POST", "/", "",
`content-type:application/x-amz-json-1.1`,
`host:rekognition.${REGION}.amazonaws.com`,
`x-amz-date:${timestamp}`,
`x-amz-target:RekognitionService.${action}`,
"", // signed headers
"content-type;host;x-amz-date;x-amz-target",
await sha256Hex(payload),
].join("\n");
const signature = await hmacSHA256Hex(kSigning, stringToSign);
return fetch(`https://rekognition.${REGION}.amazonaws.com`, {
method: "POST",
headers: {
"Content-Type": "application/x-amz-json-1.1",
"X-Amz-Date": timestamp,
"X-Amz-Target": `RekognitionService.${action}`,
Authorization: `AWS4-HMAC-SHA256 Credential=...`,
},
body: payload,
});
}
2. Face Collection の閾値設定
-
FaceMatchThreshold: 80(マッチ閾値):80%以上の類似度でマッチと判定 -
MinConfidence: 70(最低信頼度):分析結果の信頼度下限
結婚式の写真は照明やアングルが様々なので、閾値を下げすぎると誤認識が増えます。80%は実テストで「知り合いと間違えないギリギリの線」でした。
3. DetectLabels のブロックリストは運用中に調整
最初は少なめのブロックリストで始め、テスト中に「これもブロックすべき」と気づいたラベルを追加していくのが効率的です。system_config テーブルに保存してEdge Functionが毎回読み込む設計にすれば、デプロイなしで即時反映できます。
4. コスト管理
Rekognition は API 呼び出し単位の課金です。
| API | 単価 | 40人×10枚 | 小計 |
|---|---|---|---|
| IndexFaces | $0.001/回 | 40回 | $0.04 |
| SearchFacesByImage | $0.001/回 | 400回 | $0.40 |
| DetectLabels | $0.001/回 | 400回 | $0.40 |
| DetectModerationLabels | $0.001/回 | 400回 | $0.40 |
合計:約$1.24。Face Collection のストレージは1,000顔まで無料。結婚式のためなら余裕の範囲です。
5. HEIC変換の注意点
-
heic2anyは約800KBのライブラリ。動的インポートawait import("heic2any")でバンドルサイズを最小化 -
quality: 0.9は結婚式写真の品質を保つための設定。Webアプリ一般なら0.7-0.8で十分 - 変換結果が配列で返る場合があるため、
Array.isArray(blob) ? blob[0] : blobのガード必須
この記事の関連情報・背景解説はブログでも公開しています。
エンジニアが新婦のために結婚式にITで全力で貢献しようとした話【連載第3回】写真をAI顔認識で自動タグ付けする仕組み - Secure Auto Lab