0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

車検証(車両&顧客)管理システム バイブコーディング【Vol.02-α】S3フルオート(考察)編

0
Last updated at Posted at 2025-12-08

はじめに

前回のVol.01に続いてもっと単純にもっと"Automatically"に進化させるべく、グレードアップさせた仕様を検討するにあたり、システムフロー、機能要件、仕様をそれぞれ定義しておきました。
これらを読み込ませて実行させれば、S3に保存したと同時に車検証情報を抽出しDBに格納、管理画面にて顧客管理ができる仕組みがフルオートで出来るわけです。
情報の追加としては、電話番号や通知用のメールアドレスの登録のみが手作業として必要になる位です。

<フローは以下の通り>
S3-API_GW-Lambda-RDS-EventBridge-SES

全てAWSで完結させるとOCRはLambdaとTextractのコンビネーションで抽出→DB格納を行う形になります。
管理画面にてメールアドレスを入力後にEventBridge経由で発報(SES)に移る仕様です。

S3トリガーで実現する車両&顧客管理フルオート化の設計メモ

ゴールと前提

  • 電子車検証PDFをS3へ置くだけで、OCR→DB登録→メール通知まで無人で回す
  • フェーズ1で「PDF保存・OCR・DB登録・購入日当日メール」まで完成させ、フェーズ2でフォローアップ/車検満了通知、フェーズ3で分析系を拡張
  • 環境は dev/stg/prod を分離し、S3バケット名 vehicle-inspection-certificates-{env}、RDS は PostgreSQL、メールは SES を使用

全体アーキテクチャ

  1. 車検証閲覧アプリから抽出した PDF を S3 へ保存(キー: /{年}/{月}/{日}/{車台番号}_{YYYYMMDD_HHmmss}.pdf
  2. S3 PutObject イベント → API Gateway → Lambda(ocr-processor)
  3. Lambda が Textract で OCR → JSON 構造化 → バリデーション
  4. Lambda(db-writer) が RDS(PostgreSQL) へ登録し、メールスケジュールを email_logs に積む
  5. EventBridge が 09:00/10:00/20:00 にメール送信用 Lambda を起動し、SES で送信
  6. エラー時は SNS 通知+手動入力キューへ退避(信頼度80%未満など)
  7. 連絡先(email/phone)が取れないPDFは RDS manual_contact_queue に保留し、入力完了までメールスケジュールを作らない

S3設計のポイント(フルオート化の起点)

  • バージョニング有効化、SSE-S3 で暗号化、7年後に Glacier 移行ライフサイクル
  • メタデータ付与: upload-timestamp / file-size / uploader-info
  • 10MB 超過はアップロード拒否、失敗時は最大3回リトライ
  • VPCエンドポイント経由アクセス&最小権限 IAM で閉域運用

処理フロー詳細

1) PDF保存 (F-001)

  • サイズ検証 → S3 へアップロード → イベント通知発火
  • 5-10秒で完了。重複時は上書き確認

2) OCR・データ抽出 (F-002)

  • ocr-processor (Lambda, 1024MB, 5分) が Textract AnalyzeDocument(TABLES, FORMS) を実行
  • 抽出 → 正規表現で項目マッピング → 信頼度95%以上なら続行 / 80-95%は警告ログ / 80%未満は手動キュー
  • 必須: 車台番号・登録番号・車名・型式・初度登録年月・車検満了日・顧客メール

3) DB登録 (F-003)

  • db-writer (Lambda) が Secrets Manager 経由で RDS に接続し、トランザクション登録
  • スキーマ
    • vehicles: 車台番号 unique、購入日・車検満了日・PDF S3キーを保持
    • customers: email/phone index、owner/user を customer_type で保持、contact_status (pending/completed)
    • vehicle_customers: 車両-顧客の owner/user 関連を UNIQUE で縛る
    • email_logs: メール種別・スケジュール・ステータス(pending/sent/failed)、contact_ready
  • manual_contact_queue: 連絡先が取れなかった車両/顧客の保留テーブル
  • 連絡先が取れない場合は contact_status='pending' のまま email_logs を作らず、manual_contact_queue に積む
  • 重複は UPSERT、全処理が終わらなければロールバック

4) メールスケジュール登録 & 送信

  • 登録時に3種を email_logs へ pending で投入:
    • 購入お礼: 購入日 20:00 (F-004)
    • 3週間後フォローアップ: 購入日+21日 10:00 (F-005)
    • 車検満了通知: 満了日-30/14/7日 09:00 (F-006, 残り日数でテンプレ切替)
  • EventBridge が対象を SELECT→SES 送信。失敗は1時間後→3時間後→翌日でリトライ、永続失敗は failed へ
  • SELECT条件に contact_status='completed' & email有りを追加。manual_contact_queue(RDS) にある案件は管理画面/CRMで入力後に email_logs を生成する

非機能・運用

  • 性能: OCR 30秒/件、DB 3秒/レコード、メール 5秒/通、並列最大10件
  • 可用性: RDS Multi-AZ、Lambda オートスケール、S3耐久 11ナイン
  • 監視: CloudWatch Logs & Metrics、アラート (Lambdaエラー率>5%、RDS CPU>80%、SESバウンス>10% など)
  • バックアップ: RDS 自動7日、S3 バージョニング、月次手動スナップショット
  • セキュリティ: TLS1.2+, SSE-S3/RDS暗号化、IAM最小権限、個人情報アクセスの監査ログ90日

エラーハンドリング

  • OCR低精度: DynamoDB manual_review_queue に pending、SNSで管理者通知、管理画面から手動入力→再バリデーション→登録
  • メール失敗: 一時エラーは再送、レート超過は遅延処理、永続エラーは failed で停止+顧客情報要確認

コスト目安 (月額・USD, 2024相場のざっくり見積もり)

  • S3: $5 (月500件×1MB想定、7年ライフサイクル+バージョニング込み)
  • Lambda: $3 (月1,500回、平均500ms/1GB相当)
  • RDS: $15 (PostgreSQL db.t3.micro、ストレージ20GB前後を想定)
  • Textract: $7.5 (月500ページ)
  • SES: $0.2 (月2,000通)
  • CloudWatch/その他: $10 (ログ/メトリクス/データ転送など)
  • 合計: おおよそ $40〜50 / 月(約6,000〜7,500円)

これからの拡張アイデア

  • 管理画面(Cognito+CloudFront+S3)で手動入力・エラーログ・送信履歴を可視化
  • 分析/レポート (日次/週次/月次) を Lambda で生成し S3 配信
  • 車検予約導線や FAQ リンクをメールに追加してコンバージョン計測

まとめ

  • S3 を入口にイベント駆動で Textract→RDS→SES を連携させ、紙の車検証入力をゼロタッチ化
  • バージョニング+ライフサイクルで7年保管を自動化、メールはスケジュール+再送制御で確実に届ける
  • まずフェーズ1のフローをデプロイし、監視・エラー運用を固めてからフェーズ2/3の拡張に進むのが安全

※上記の他、何か良いアイデアがあれば教えてくださいませ。

最後までお付き合いいただき、ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?