AWS Lambda 関数を Amazon Cognito のトリガーとして設定しているときに発生したエラーを解決したいと考えています。
解像度
Amazon Cognito でLambda トリガーを使用する際にトラブルシューティングが必要な一般的なエラーを以下に示します。
「アクセス拒否例外エラーにより、事前サインアップ呼び出しが失敗しました。」
**メモ:**トリガータイプはエラーメッセージに記載されています。たとえば、PreSignUp トリガーとしてユーザープールにアタッチされている Lambda 関数は、前述のエラーで応答します。
エラーの理由
Amazon Cognito コンソールからユーザープールに Lambda 関数をトリガーとして追加すると、Amazon Cognito は次のアクションを実行します:
- 必要な権限を関数のリソースポリシーに追加します。このリソースポリシーにより、特定のイベントトリガータイプの場合に Amazon Cognito が関数を呼び出すことができます。
- 次のメッセージが表示されます: 「Lambda 関数を呼び出す権限-お客様に代わってこの Lambda 関数を呼び出すアクセス権限を Amazon Cognito に付与しています。Amazon Cognitoは、リソースベースのポリシーステートメントを関数に追加します。」
このエラーは、トリガーとして追加した関数を削除した場合にも発生します。Lambda トリガーを削除する場合、ユーザープール内の対応するトリガーを更新する必要があります。たとえば、事後認証トリガーを削除する場合、対応するユーザープールのPost 認証トリガーを「なし」に設定する必要があります。
エラーの解決
Amazon Cognito コンソールの外部でトリガーを作成する場合、トリガーをユーザープールに割り当てるときに権限を明示的に追加する必要があります。アクセス権限を追加するには、AWS SDK、AWS Command Line Interface (AWS CLI)、または Amazon CloudFormation を使用してください。
アクセス権限を追加すると、Amazon Cognito はユーザープールとアカウントに代わってのみ関数を呼び出します。Lambda コンソールから権限を追加するには、「Lambdaのリソースベースのポリシーを使用する」の手順に従います。AddPermission操作を使用することもできます。
以下は、Amazon Cognito が関数を呼び出すことを許可する Lambda リソースベースのポリシーの例です。ユーザープールは aws: SourceARN 条件で、アカウントはaws: SourceAccount 条件です。
**メモ:**example \ _lambda\ _function\ _arn、example\ _accountト\ _number、example\ _user\ _pool\ _arn を独自の値に置き換えてください。
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "lambda-allow-cognito",
"Effect": "Allow",
"Principal": {
"Service": "cognito-idp.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "example_lambda_function_arn",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "example_account_number"
},
"ArnLike": {
"AWS:SourceArn": "example_user_pool_arn"
}
}
}
]
}
「認証中にエラーが発生しました。アプリの所有者に連絡してください。」
エラーの理由
このエラーは次の 2 つの理由で発生します:
- カスタム送信者の Lambda トリガーを除き、Amazon Cognito は Lambda 関数を同期的に呼び出します。この関数は 5 秒以内に応答する必要があります。関数が応答しない場合、Amazon Cognito は呼び出しを再試行します。3 回失敗すると、関数はタイムアウトします。5 秒のタイムアウト値は変更できません。
- Amazon Cognito が 5 秒以内にトリガーからの応答を受け取らない場合、3 回失敗すると、Amazon Cognito はエラーを返します。
エラーの解決
関数がタイムアウトした場合は、Lambda 関数を使用する際のベストプラクティスを適用して関数を最適化します。ユーザープールに関連付けられた Lambda 関数に 2 つ目の Lambda 関数を非同期で呼び出すことができます。この設定では、関数は必要なすべてのアクションをタイムアウトなしで実行できます。
「モジュールlambda\ _functionの構文エラーにより事前登録が失敗しました。」
エラーの理由
Amazon Cognito は、Lambda 関数に構文エラーがある場合にこのエラーを返します。
エラーの解決
関数コードを再確認し、構文エラーがあれば修正してください。
「事前登録はエラーハンドラー 'lambda\ _handler'で失敗しました。モジュールにlambda\ _functionがありません。」
エラーの理由
関数の実行時設定には、ハンドラーパラメーターが含まれます。HandlerInfo に誤った情報または構文が設定されている場合、関数は実行できず、このエラーが発生します。
エラーの解決
どのハンドラーメソッドを呼び出すかをLambda ランタイムに指示するように、関数の設定でハンドラーパラメーターを設定します。
Pythonで関数を設定する 場合、ハンドラー設定値は、ファイル名とハンドラーモジュール名をドットで区切ったものです。たとえば、Main.Handler は main.py で定義されているハンドラーメソッドを呼び出します。
ハンドラー構文の詳細については、「ランタイム環境の変更」を参照してください。
関連情報
重要な考慮事項
カスタム AWS ラムダランタイム