Lambda トリガーを使用したユーザープールワークフローのカスタマイズ
Amazon Cognito は AWS Lambda 関数を使用してユーザープールの認証動作を変更します。初回サインアップ前、認証完了後、およびその間のいくつかの段階で Lambda 関数を自動的に呼び出すようにユーザープールを設定できます。関数は、認証フローのデフォルト動作を変更したり、ユーザープールやその他の AWS リソースを変更するための API リクエストを行ったり、外部システムと通信したりできます。Lambda 関数のコードはユーザー独自のものです。Amazon Cognito はイベントデータを関数に送信し、関数がデータを処理するのを待ちます。ほとんどの場合、セッションへの変更を示すレスポンスイベントが返されます。
リクエストイベントとレスポンスイベントのシステム内では、独自の認証チャレンジの導入、ユーザープールと別の ID ストア間でのユーザーの移行、メッセージのカスタマイズ、JSON ウェブトークン (JWT) の変更を行うことができます。
Lambda トリガーは、ユーザーがユーザープールでアクションを開始した後に Amazon Cognito がユーザーに配信するレスポンスをカスタマイズできます。例えば、他の方法では成功するはずのユーザーによるサインインを禁止できます。また、AWS 環境、外部 API、データベース、または ID ストアに対してランタイムオペレーションを実行することもできます。例えば、ユーザー移行のトリガーでは、外部アクションと Amazon Cognito の変更を組み合わせることができます。つまり、外部ディレクトリでユーザー情報を検索し、その外部情報に基づいて新しいユーザーに属性を設定できます。
Lambda トリガーをユーザープールに割り当てると、Amazon Cognito はデフォルトのフローを中断して関数から情報をリクエストします。Amazon Cognito は JSON イベントを生成し、それを関数に渡します。イベントには、ユーザーアカウントの作成、サインイン、パスワードのリセット、または属性の更新を求めるユーザーのリクエストに関する情報が含まれます。これで、関数がアクションを実行、またはイベントを変更せずに送り返すことができます。
次の表は、Lambda トリガーを使用してユーザープールオペレーションをカスタマイズする方法をまとめたものです。
ユーザープールフロー | オペレーション | 説明 |
---|---|---|
カスタム認証フロー |
認証チャレンジの定義 | カスタム認証フローでの次のチャレンジを決定する |
認証チャレンジの作成 | カスタム認証フローでのチャレンジを作成する | |
認証チャレンジレスポンスの確認 | カスタム認証フローでのレスポンスが正しいかどうかを判断する | |
認証イベント | 認証前の Lambda トリガー | サインインリクエストを承認または拒否するカスタム検証 |
認証後の Lambda トリガー | カスタム分析用のイベントをログに記録する | |
トークン生成前の Lambda トリガー | トークンの主張を強化または制限する | |
サインアップ | サインアップ前の Lambda トリガー | サインアップリクエストを承認または拒否するカスタム検証を実行する |
確認後の Lambda トリガー | カスタム分析用のカスタムウェルカムメッセージまたはイベントログ記録を作成する | |
ユーザー移行の Lambda トリガー | 既存のユーザーディレクトリからユーザープールにユーザーを移行する | |
メッセージ | カスタムメッセージの Lambda トリガー | メッセージの高度なカスタマイズとローカライズを実行する |
トークンの作成 | トークン生成前の Lambda トリガー | ID トークンの属性を追加または削除する |
E メールと SMS のサードパーティープロバイダー | カスタム送信者の Lambda トリガー | サードパーティープロバイダーを使用して SMS メッセージと E メールメッセージを送信する |
トピック
- 重要な考慮事項
- ユーザープールの Lambda トリガーの追加
- ユーザープールの Lambda トリガーイベント
- ユーザープールの Lambda トリガーの一般的なパラメータ
- Lambda トリガーへの API オペレーションの接続
- Lambda トリガーのユーザープールの機能オペレーションへの接続
- サインアップ前の Lambda トリガー
- 確認後の Lambda トリガー
- 認証前の Lambda トリガー
- 認証後の Lambda トリガー
- カスタム認証チャレンジの Lambda トリガー
- トークン生成前の Lambda トリガー
- ユーザー移行の Lambda トリガー
- カスタムメッセージの Lambda トリガー
- カスタム送信者の Lambda トリガー
重要な考慮事項
Lambda 関数用のユーザープールを準備するときは、以下の点を考慮します。
-
Amazon Cognito が Lambda トリガーに送信するイベントは、新しい機能に伴って変わる可能性があります。JSON 階層内のレスポンス要素とリクエスト要素の位置が変更されたり、要素名が追加されたりする場合があります。Lambda 関数では、このガイドで説明している入力要素のキーと値のペアを受け取ることが期待できますが、入力検証がより厳密になると、関数が失敗する可能性があります。
-
Amazon Cognito が一部のトリガーに送信する複数のバージョンのイベントから 1 つを選択できます。バージョンによっては、Amazon Cognito 料金の変更を受け入れることが必要になる場合があります。料金の詳細については、「Amazon Cognito の料金
」を参照してください。トークン生成前の Lambda トリガー のアクセストークンをカスタマイズするには、アドバンストセキュリティ機能を使用してユーザープールを設定し、イベントバージョン 2 を使用するように Lambda トリガー設定を更新する必要があります。 -
カスタム送信者の Lambda トリガーを除き、Amazon Cognito は Lambda 関数を同期的に呼び出します。Amazon Cognito が Lambda 関数を呼び出したら、5 秒以内に応答する必要があります。失敗し、呼び出しを再試行できる場合、Amazon Cognito は呼び出しを再試行します。試行が 3 回失敗すると、関数はタイムアウトします。この 5 秒のタイムアウト値を変更することはできません。詳細については、「AWS Lambda Lambda デベロッパーガイド」の「Lambda プログラミングモデル」を参照してください。
Amazon Cognito は、HTTP ステータスコード 500~599 の呼び出しエラーを返す関数呼び出しを再試行しません。これらのコードは、Lambda が関数を起動できない原因となる設定の問題を示しています。詳細については、「AWS Lambda でのエラー処理と自動再試行」を参照してください。
-
Lambda トリガー設定で関数バージョンを宣言することはできません。Amazon Cognito ユーザープールは、デフォルトで最新バージョンの関数を呼び出します。ただし、CreateUserPool または UpdateUserPool API リクエストにより、関数バージョンをエイリアスに関連付け、トリガーの
LambdaArn
をエイリアス ARN に設定できます。このオプションは、AWS Management Consoleでは使用できません。エイリアスの詳細については、「AWS Lambda デベロッパーガイド」の「Lambda 関数のエイリアス」を参照してください。 -
Lambda トリガーを削除する場合は、ユーザープール内の対応するトリガーを更新する必要があります。例えば、認証後トリガーを削除した場合は、ユーザープール内の対応する認証後トリガーを [なし] に設定する必要があります。
-
Lambda 関数がリクエストとレスポンスのパラメータを Amazon Cognito に返さないか、エラーを返す場合、認証イベントは成功しません。関数にエラーを返して、ユーザーのサインアップ、認証、トークン生成、または Lambda トリガーを呼び出す認証フローのその他の段階を防ぐことができます。
Amazon Cognito がホストする UI は、Lambda トリガーが生成するエラーをサインインプロンプトの上にエラーテキストとして返します。Amazon Cognito ユーザープール API は、トリガーエラーを
形式で返します。ベストプラクティスとして、Lambda 関数では、ユーザーに表示させるエラーのみを生成します。[trigger]
failed with error[error text from response]
print()
のような出力方法を使用して、機密情報やデバッグ情報を CloudWatch ログに記録します。例については、「サインアップ前の例:ユーザー名が 5 文字未満の場合にサインアップを拒否する」を参照してください。 -
ユーザープールのトリガーとして Lambda 関数を別の AWS アカウント の関数に追加できます。AWS CloudFormation または AWS CLI の CreateUserPool および UpdateUserPool API オペレーション、またはそれに相当するオペレーションにクロスアカウントトリガーを追加する必要があります。AWS Management Console にクロスアカウント機能を追加することはできません。
-
Amazon Cognito コンソールに Lambda トリガーを追加すると、Amazon Cognito はユーザープールが関数を呼び出すことを許可するリソースベースのポリシーを、関数に追加します。クロスアカウント関数を含む Lambda トリガーを Amazon Cognito コンソールの外部で作成する場合は、Lambda 関数のリソースベースポリシーにアクセス許可を追加する必要があります。追加したアクセス権限では、Amazon Cognito はユーザープールの代わりに関数を呼び出すことを許可する必要があります。Lambda コンソールから権限を追加、または Lambda AddPermission API オペレーションを使用することができます。
Lambda リソースベースのポリシーの例
次の Lambda リソースベースのポリシーの例では、Lambda 関数を呼び出す Amazon Cognito の限定的な機能が付与されます。Amazon Cognito は、
aws:SourceArn
の条件でのユーザープールとaws:SourceAccount
条件でのアカウントの両方に代わって関数を呼び出す場合にのみ、関数を呼び出すことができます。{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "lambda-allow-cognito", "Effect": "Allow", "Principal": { "Service": "cognito-idp.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "
<your Lambda function ARN>
", "Condition": { "StringEquals": { "AWS:SourceAccount": "<your account number>
" }, "ArnLike": { "AWS:SourceArn": "<your user pool ARN>
" } } } ] }
ユーザープールの Lambda トリガーの追加
コンソールを使用してユーザープールの Lambda トリガーを追加する
-
Lambda コンソール
を使用して Lambda 関数を作成します。Lambda 関数の詳細については、AWS Lambda デベロッパーガイドを参照してください。 -
[Amazon Cognito console]
(Amazon Cognito コンソール) に移動し、[User Pools] (ユーザープール) を選択します。 -
リストから既存のユーザープールを選択するか、ユーザープールを作成します。
-
[] (ユーザープールのプロパティ) タブを選択し、[Lambda triggers] (Lambda トリガー) を検索します。
-
[Add a Lambda trigger] (Lambda トリガーの追加) を選択します。
-
カスタマイズする認証のステージに基づいて、Lambda トリガーカテゴリを選択します。
-
[Assign Lambda function] (Lambda 関数の割り当て) を選択して、AWS リージョン ユーザープールと同じ関数を選択します。
注記
AWS Identity and Access Management (IAM) 認証情報に Lambda 関数を更新する権限がある場合、Amazon Cognito は Lambda リソースベースのポリシーを追加します。このポリシーを使用すると、Amazon Cognito は選択した関数を呼び出すことができます。サインインした認証情報に十分な IAM アクセス権限がない場合は、リソースベースのポリシーを個別に更新する必要があります。詳細については、「重要な考慮事項」を参照してください。
-
[Save changes] (変更の保存) をクリックします。
-
Lambda コンソールで CloudWatch を使用して、Lambda 関数をログすることができます。詳細については、「Accessing CloudWatch Logs for Lambda」を参照してください。
ユーザープールの Lambda トリガーイベント
Amazon Cognito は Lambda 関数にイベント情報を渡します。Lambda 関数はレスポンスで、同じイベントオブジェクトを変更と共に Amazon Cognito に返します。以下のイベントは、Lambda トリガーの一般的なパラメータを示しています。
ユーザープールの Lambda トリガーの一般的なパラメータ
- バージョン
-
Lambda 関数のバージョン番号。
- triggerSource
-
Lambda 関数をトリガーしたイベントの名前。各 triggerSource の説明については、「Lambda トリガーのユーザープールの機能オペレーションへの接続」を参照してください。
- region
-
AWSRegion
インスタンスとしての AWS リージョン。 - userPoolId
-
ユーザープールの ID。
- userName
-
現在のユーザーのユーザー名。
- callerContext
-
リクエストとコード環境に関するメタデータ。これには、[awsSdkVersion] と [clientId] フィールドが含まれています。
- awsSdkVersion
-
リクエストを生成した AWS SDK のバージョン。
- clientId
-
ユーザープールアプリクライアントの ID。
- request
-
ユーザーの API リクエストの詳細。以下のフィールドと、トリガーに固有のリクエストパラメータが含まれます。例えば、Amazon Cognito が事前認証トリガーに送信するイベントには
userNotFound
パラメータも含まれます。ユーザーが未登録のユーザー名でサインインしようとしたときに、このパラメータの値を処理してカスタムアクションを実行できます。- userAttributes
-
ユーザー属性の名前と値の 1 つ以上のキーと値のペア。例:
"email": "john@example.com"
。
- レスポンス
-
このパラメータには、元のリクエストの情報は含まれていません。Lambda 関数はイベント全体を Amazon Cognito に返し、返されるパラメータは
response
に追加する必要があります。関数に含めることができる返されるパラメータを確認するには、使用するトリガーのドキュメントを参照してください。
Lambda トリガーへの API オペレーションの接続
以下のセクションでは、Amazon Cognito がユーザープールのアクティビティから呼び出す Lambda トリガーについて説明します。
アプリが Amazon Cognito ユーザープールの API、ホストされた UI、またはユーザープールエンドポイント を介してユーザーをサインインさせると、Amazon Cognito はセッションコンテキストに基づいて Lambda 関数を呼び出します。Amazon Cognito ユーザープール API およびユーザープールの詳細については、「ユーザープール API と認可サーバーの使用」を参照してください。次のセクションの表では、Amazon Cognito が関数を呼び出す原因となるイベントと、Amazon Cognito がリクエストに含める triggerSource
文字列について説明します。
トピック
Amazon Cognito API の Lambda トリガー
次の表は、アプリがローカルユーザーを作成、サインイン、または更新するときに Amazon Cognito が呼び出すことができる Lambda トリガーのソース文字列を示しています。
API オペレーション | Lambda トリガー | トリガーソース |
---|---|---|
サインアップ前 |
|
|
トークン生成前 |
|
|
カスタムメッセージ |
|
|
カスタム E メール送信者 |
|
|
カスタム SMS 送信者 |
|
|
サインアップ前 |
|
|
カスタムメッセージ |
|
|
カスタム E メール送信者 |
|
|
カスタム SMS 送信者 |
|
|
確認後 |
|
|
認証前 |
|
|
認証チャレンジの定義 |
|
|
認証チャレンジの作成 |
|
|
トークン生成前 |
|
|
ユーザー移行 |
|
|
カスタムメッセージ |
|
|
カスタム E メール送信者 |
|
|
カスタム SMS 送信者 |
|
|
ユーザー移行 |
|
|
カスタムメッセージ |
|
|
カスタム E メール送信者 |
|
|
カスタム SMS 送信者 |
|
|
確認後 |
|
|
カスタムメッセージ |
|
|
カスタム E メール送信者 |
|
|
カスタム SMS 送信者 |
|
|
カスタムメッセージ |
|
|
カスタム E メール送信者 |
|
|
カスタム SMS 送信者 |
|
ホストされた UI の Amazon Cognito ローカルユーザーの Lambda トリガー
次の表は、ローカルユーザーがホストされた UI でユーザープールにサインインするときに Amazon Cognito が呼び出すことができる Lambda トリガーのソース文字列を示しています。
ホストされた UI URI | Lambda トリガー | トリガーソース |
---|---|---|
/signup |
サインアップ前 |
|
カスタムメッセージ |
|
|
カスタム E メール送信者 |
|
|
カスタム SMS 送信者 |
|
|
/confirmuser |
確認後 |
|
/login |
認証前 |
|
認証チャレンジの定義 |
|
|
認証チャレンジの作成 |
|
|
トークン生成前 |
|
|
ユーザー移行 |
|
|
カスタムメッセージ |
|
|
カスタム E メール送信者 |
|
|
カスタム SMS 送信者 |
|
|
/forgotpassword |
ユーザー移行 |
|
カスタムメッセージ |
|
|
カスタム E メール送信者 |
|
|
カスタム SMS 送信者 |
|
|
/confirmforgotpassword |
確認後 |
|
フェデレーティッドユーザーの Lambda トリガー
次の Lambda トリガーを使用して、フェデレーションプロバイダーでサインインするユーザーのユーザープールのワークフローをカスタマイズできます。
注記
フェデレーションユーザーは Amazon Cognito でホストされている UI を使用してサインインでき、また、ID プロバイダーのサインインページにサイレントリダイレクトするリクエストを 認可エンドポイント に 生成することもできます。Amazon Cognito ユーザープール API を使用してフェデレーションユーザーをサインインすることはできません。
サインインイベント | Lambda トリガー | トリガーソース |
---|---|---|
初回サインイン | サインアップ前 |
|
確認後 |
|
|
トークン生成前 |
|
|
その後のサインイン | 認証前 |
|
認証後 |
|
|
トークン生成前 |
|
フェデレーティッドサインインは、ユーザープールの カスタム認証チャレンジの Lambda トリガー、ユーザー移行の Lambda トリガー、カスタムメッセージの Lambda トリガー、または カスタム送信者の Lambda トリガー を呼び出しません。
Lambda トリガーのユーザープールの機能オペレーションへの接続
各 Lambda トリガーは、ユーザープールで機能的な役割を果たします。例えば、トリガーを使用してサインアップフローを変更したり、カスタム認証チャレンジを追加したりできます。Amazon Cognito が Lambda 関数に送信するイベントには、その機能ロールを構成する複数のアクションのうちの 1 つが反映されます。例えば、Amazon Cognito は、ユーザーがサインアップしたとき、およびユーザーを作成したときに、事前サインアップトリガーを呼び出します。同じ機能的役割を持つ、これらのさまざまなケースには、それぞれ独自の triggerSource
値があります。Lambda 関数は、呼び出したオペレーションに基づいて受信イベントを異なる方法で処理できます。
また Amazon Cognito は、イベントがトリガーソースに対応するときに、割り当てられたすべての関数を呼び出します。例えば、ユーザー移行トリガーと事前認証トリガーを割り当てたユーザープールにユーザーがサインインすると、両方がアクティブになります。
トリガー | triggerSource 値 | イベント |
---|---|---|
サインアップ前 | PreSignUp_SignUp |
サインアップ前。 |
サインアップ前 | PreSignUp_AdminCreateUser |
管理者が新しいユーザーを作成するときのサインアップ前 |
サインアップ前 | PreSignUp_ExternalProvider |
外部 ID プロバイダーのサインアップ前。 |
確認後 | PostConfirmation_ConfirmSignUp |
サインアップの確認後。 |
確認後 | PostConfirmation_ConfirmForgotPassword |
パスワードを忘れた場合の確認後。 |
認証前 | PreAuthentication_Authentication |
認証前。 |
認証後 | PostAuthentication_Authentication |
認証後。 |
Trigger | triggerSource 値 | イベント |
---|---|---|
認証チャレンジの定義 | DefineAuthChallenge_Authentication |
認証チャレンジの定義。 |
認証チャレンジの作成 | CreateAuthChallenge_Authentication |
認証チャレンジの作成。 |
認証チャレンジの検証。 | VerifyAuthChallengeResponse_Authentication |
認証チャレンジレスポンスの確認。 |
Trigger | triggerSource 値 | イベント |
---|---|---|
トークン生成前 | TokenGeneration_HostedAuth |
Amazon Cognito は、のホストされた UI のサインインページからユーザーを認証します。 |
トークン生成前 | TokenGeneration_Authentication |
ユーザー認証フローが完了しました。 |
トークン生成前 | TokenGeneration_NewPasswordChallenge |
管理者がユーザーを作成します。ユーザーが一時パスワードを変更する必要があるときに、Amazon Cognito は、これを呼び出します。 |
トークン生成前 | TokenGeneration_AuthenticateDevice |
ユーザーデバイスの認証の終了。 |
トークン生成前 | TokenGeneration_RefreshTokens |
ユーザーは、ID およびアクセストークンを更新しようとします。 |
Trigger | triggerSource 値 | イベント |
---|---|---|
ユーザー移行 | UserMigration_Authentication |
サインイン時のユーザー移行。 |
ユーザー移行 | UserMigration_ForgotPassword |
パスワードを忘れた場合のフロー実行時のユーザー移行 |
Trigger | triggerSource 値 | イベント |
---|---|---|
カスタムメッセージ | CustomMessage_SignUp |
ユーザーがユーザープールにサインアップしたときのカスタムメッセージ。 |
カスタムメッセージ | CustomMessage_AdminCreateUser |
管理者としてユーザーを作成し、Amazon Cognito から一時パスワードが送信されるときのカスタムメッセージ。 |
カスタムメッセージ | CustomMessage_ResendCode |
既存のユーザーが新しい確認コードをリクエストしたときのカスタムメッセージ。 |
カスタムメッセージ | CustomMessage_ForgotPassword |
ユーザーがパスワードのリセットを要求したときのカスタムメッセージ。 |
カスタムメッセージ | CustomMessage_UpdateUserAttribute |
ユーザーが E メールアドレスまたは電話番号を変更し、Amazon Cognito が検証コードを送信したときのカスタムメッセージ。 |
カスタムメッセージ | CustomMessage_VerifyUserAttribute |
ユーザーが E メールアドレスまたは電話番号を追加し、Amazon Cognito が検証コードを送信したときのカスタムメッセージ。 |
カスタムメッセージ | CustomMessage_Authentication |
SMS MFA を設定したユーザーがサインインしたときのカスタムメッセージ。 |