はじめに
前回の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 を使用
全体アーキテクチャ
- 車検証閲覧アプリから抽出した PDF を S3 へ保存(キー:
/{年}/{月}/{日}/{車台番号}_{YYYYMMDD_HHmmss}.pdf) - S3 PutObject イベント → API Gateway → Lambda(ocr-processor)
- Lambda が Textract で OCR → JSON 構造化 → バリデーション
- Lambda(db-writer) が RDS(PostgreSQL) へ登録し、メールスケジュールを
email_logsに積む - EventBridge が 09:00/10:00/20:00 にメール送信用 Lambda を起動し、SES で送信
- エラー時は SNS 通知+手動入力キューへ退避(信頼度80%未満など)
- 連絡先(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の拡張に進むのが安全
※上記の他、何か良いアイデアがあれば教えてくださいませ。
最後までお付き合いいただき、ありがとうございました。