0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Zoho WidgetとLambdaの連携 第5回:CRM上の進行管理と結果確認Poller

0
Posted at

DynamoDBを追加せず、CRMの項目だけで結果確認のPollerを回しました。受付後の進行情報をAWS側の別ストアに増やさず、履歴レコード上のJSONに載せます。確認用Lambdaに公開HTTPは付けません。

シリーズ「Zoho WidgetとLambdaの連携」の第5回です。シリーズの締めです。

前回: Zoho WidgetとLambdaの連携 第4回:外部送信の受付判定と自動retry抑止

この記事の内容

  1. ポーリングの定義と、ブラウザ終了後も継続する理由
  2. 最終結果の正本の場所
  3. DynamoDBを追加しなかった理由と、既知の制限一覧

構成要素

要素 役割
Widget 要求受付までを表示。最終完了とは表示しない
履歴レコード 最終成功/失敗/人手確認の正本。進行JSONも保持
確認用Lambda(Poller) 受付済みを定期照会し、履歴を更新する
EventBridge Scheduler 公開URLなしでPollerを定期起動する
外部送信API 結果照会先

ポーリング

ポーリングは、完了通知を待つ代わりに、クライアントまたはジョブ側から繰り返し状態照会する方式です。利用者のブラウザタブが閉じても、バックエンドの定期ジョブは継続します。

起動は公開HTTPSではなく、EventBridge SchedulerからIAMでInvokeします。間隔はおおよそ2分です。重要なのは秒数より、公開HTTPではなくScheduler起動という境界です。間隔とバッチサイズは、外部APIのレート制限を超過しない前提で環境ごとに決めます。

最終結果の見方

場所 見える内容
Widget 要求できたことまで。最終完了とは表示しない
CRMの履歴状態 最終成功/失敗/人手確認の正本
通知やWidget再表示 案件依存。本稿では固定しない

運用は履歴を見る前提です。送信ボタン成功は受付成功であり、最終結果ではありません。

照会の終端は、最終成功、最終失敗、または期限切れ等による人手確認です。これが確認用Lambdaの役割です。状態遷移の詳細は第4回です。

確認用Lambdaを分けた理由

入口や副作用の公開HTTPに同居させると、定期ジョブまで公開攻撃面になります。同期の画面操作と非同期の継続処理も混ざります。そのため別Lambdaとし、Function URLは持たせず、SchedulerからのIAM Invokeのみにしました。

DynamoDBを追加する場合との比較

DynamoDBはAWSのマネージドNoSQLです。キーアクセス向けの別テーブルとして進行管理を置く設計もあります。

本稿の構成ではCRM側を選びました。進行用の正本を増やさないためです。

CRMの項目に載せる DynamoDB等を追加する
正本の数 増やさない AWS側に追加される
障害時の調査 履歴レコードを見る 追加ストアも調査対象
スキーマ変更 CRM項目変更が必要 テーブル設計が追加
競合制御 CRMの楽観的ロックと同じ土台 同期・整合の論点が追加

確認用Lambda自体はほぼstatelessです。起動のたびにCRMを参照し、対象を取得し、外部を照会し、履歴を更新します。進行情報は履歴レコード上のJSONフィールドに載せます(実フィールド名は記載しません)。

JSONで見る主な項目は、次回照会時刻、試行回数、期限、最後のエラーです。無期限照会を避け、打ち切り後は人手確認へ遷移するためです。

自動確認の対象は、自動照会が必要な状態のみです。最終成功・失敗・人手確認は主対象から外し、自動では再進捗しません。競合(HTTP 412)では上書きせずskipします。

一覧は状態で絞ってバッチ取得します。未到期行が枠を占有すると取りこぼしがありえます。厳密なキューではありません。取りこぼしは、次回起動や期限打ち切りで運用から見える前提で回します。

全体の流れ

  1. Widgetで入力を保存する(入口、HMAC)
  2. プレビューGET後、確認したbytesを直送で履歴へ保存する(第3回
  3. 履歴IDで外部送信を要求する。成功は受付まで。受付不明は人手確認へ遷移し、自動再送しない(第4回
  4. ブラウザ終了後も、確認用Lambdaが進行JSONを更新しながら結果を追う(本稿)
  5. 最終成功、最終失敗、または人手確認で終了する

HMAC検証失敗時は着弾raw bodyを先に疑ってください(第2回)。入口・副作用・確認用の分割は維持した方がよいです(第1回)。

既知の制限とトレードオフ

シリーズ全体で意図的に受容している点、または運用依存の制限です。防衛方針はURL秘匿ではなく、検証できない要求を通さないことです。

制限 扱い
Function URLが NONE で公開HTTPになる URL秘匿を防衛に数えない。HMAC/token/IAMで実効認可
HMACの300秒以内replay台帳なし 受容。更新系はidempotency・競合・状態ガード
プレビュー短命URLの漏洩 有効期限内のPDF読取リスク。業務POSTは閉じる
直送tokenの横断one-time不完全 warmコンテナ上のbest-effort。期限切れは再発行
画面改ざん+hash一致 確認bytes=保存bytesまで。画面自体の改ざんは別レイヤ
Poller一覧のバッチ取りこぼし 厳密なキューではない前提で運用
鍵ローテーション手順 運用依存。片方遅れで全HMACが失敗する
0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?