はじめに
Cognitoでは、ユーザー作成時にLambdaをトリガーとして呼び出すことができます。
「このタイミングでDynamoDBにもユーザー情報を保存したい」と考えました。
いざやろうと思うと、Lambdaが失敗した時の挙動やエラーハンドリングについて気になる点があったのでまとめました。
TL;DR(要点)
- Cognitoの「サインアップ前」トリガーでLambdaが失敗すると、ユーザーの作成自体が失敗する
- Lambdaの呼び出し失敗した場合、3回までリトライされるが、すべて失敗した場合はユーザー作成は行われない
トリガーの種類と実行タイミング
まず前提として、Cognitoでは以下のようなトリガーがあります。
私が設定していたのは「サインアップ前」でしたが、これは「ユーザー作成前」に呼び出されるものでした。
つまり、Lambdaでエラーが起きるとユーザーはそもそも作成されません。
Lambdaがエラーを吐いたら?
たとえば以下のようなケースでワザとLambdaが失敗するようにしてみました。
export const handler = async (event) => {
throw new Error("意図的エラー");
};
その上で、マネコン経でユーザー作成を試みると、マネコン上でやってみると下図のように「ユーザー作成中にエラーが発生しました」と表示されて、Cognitoのユーザーの作成が行われませんでした。
ちなみにLambda内のエラーは普通にCloudWatchに出ます。
Lambdaの呼び出しに失敗したら?
そもそも何かしらが原因でLambdaの呼び出しに失敗した場合でも、挙動は同じようです。
Lambdaは同期的に呼び出されて3回までリトライされるそうです。
呼び出し自体が失敗してもDLQとかには貯まらない。
全てリトライが失敗した場合は、マネコン、CLI、SDKのどれであれ同期実行なのでユーザー作成失敗の趣旨のエラーが返ってくる。
Lambdaでエラーハンドリングをすべきか?
Lambdaが失敗すれば、Cognitoのユーザー作成自体がされない、と言う事が起こります。
それで良いのか?
Lambdaの処理の重要度によって良いか悪いか分かれそう。
なぜ調べたのか(再喝)
やりたかったことは次のようなこと。
Cognitoでユーザー登録
そのユーザー情報をDynamoDBにも保存したい
でも、Lambdaでの保存に失敗したら「Cognitoには登録されてるのにDynamoDBにはいない」という不整合が起こる可能性があるなと。
大丈夫だろうか?そもそも挙動ってどうなってるんだっけ?と気になった経緯でした。
終わりに
現場からは以上ですー。