コンタクトフローが Amazon Connect で関数を呼び出そうとしたときに AWS Lambda 関数が呼び出されない理由を知りたいです。
解決策
問い合わせフローログのエラーメッセージを確認する
次の手順を実行します。
- 問い合わせフローログを設定していない場合は、Amazon Connect インスタンスで問い合わせフローログ記録を有効化します。
- 問い合わせフローログでエラーメッセージを検索します。たとえば、特定の時間枠のエラーメッセージを検索するには、次のようなクエリを実行します。
fields @timestamp, @message
| filter @message like 'Results'
| parse @message '"Results":"*","ContactId":"*","ContactFlowId":"*","ContactFlowName":"*","ContactFlowModuleType":"*"' as Results, ContactId, ContactFlowId, ContactFlowName, BlockType
| filter Results like 'rror' or Results like 'ailed' or Results like 'imeout' or Results like 'xception' or Results like 'No prompt provided' or Results like 'Instance has reached concurrent Lambda thread access limit' or Results like 'nsupported' or Results like 'nvalid' or Results like 'not found' or Results like 'execution limit reached'
| filter BlockType = 'InvokeExternalResource'
| sort @timestamp asc
| display Timestamp, Results, ContactId, ContactFlowId, ContactFlowName, BlockType
エラーメッセージに基づいて、次のタスクを実行します。
Status Code: 403; Error Code: AccessDeniedException; RequestId: XXXXXXXX
関数のリソースベースのポリシーが Amazon Connect に関数を呼び出すアクセス許可を付与していない場合、上記のエラーが表示されることがあります。関数のリソースベースのポリシーを確認し、ポリシーに必要なアクセス許可が含まれているかどうかを確認します。
必要なアクセス許可をポリシーに追加するには、次のいずれかの方法を使用します。
-
Amazon Connect コンソールを使用して Lambda 関数をインスタンスに追加します。この関数は、インスタンスに追加されると自動的にリソースアクセス許可を取得します。
-
AWS コマンドラインインターフェイス (AWS CLI) コマンド add-permission を手動で使用します。プリンシパル connect.amazonaws.com および、Amazon Connect インスタンスの Amazon リソースネーム (ARN) を含める必要があります。
例:
aws lambda add-permission --function-name function-name --action lambda:InvokeFunction --statement-id connect-to-lambda --principal connect.amazonaws.com --source-arn connect-instance-arn
-
Lambda コンソールを使用してリソースベースのポリシーを作成します。詳細については、「Lambda でアクセス許可を管理する」を参照してください。
リソースベースのポリシーの例:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "100",
"Effect": "Allow",
"Principal": {
"Service": "connect.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "<Qualified AWS Lambda ARN>",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "<Amazon Connect ARN>"
}
}
}
]
}
"Lambda 関数がエラーを返しました"
上記のエラーの原因を調べるには、Lambda に関する Amazon CloudWatch メトリクスを確認します。関連するタイムスタンプのデータのメトリクスを確認します。
エラーメトリクスに関連タイムスタンプのデータが含まれていない場合は、関数の応答を確認します。
注: Lambda 関数から返された出力をテストするのがベストプラクティスです。Lambda 関数が Amazon Connect と互換性のある形式で出力を返すことを確認します。
出力について、次の構成を確認します。
- Lambda ペイロードは NULL 以外の値である必要があります。
- 応答の検証タイプが STRING_MAP の場合、出力はキーと値のペアのフラットオブジェクトである必要があります (ネスト不可)。タイプが JSON の場合、オブジェクトは有効な JSON 値である必要があります。なお、ネストされた JSON を含めることができます。
- キーと値のペアには、英数字、ダッシュ文字、またはアンダースコア文字のみを使用できます。
- 返されるデータのサイズは、UTF-8 データであり、32 KB 未満である必要があります。
- Lambda 関数のタイムアウト設定が十分に高い値に設定されていることを確認します。この値には、関数を呼び出してデータを処理し、応答を返すのに十分な大きさが必要です。
問い合わせフローで invoke Lambda 関数を使用する場合、制限は Lambda の最大 Timeout 制限に設定されている制限よりも小さくなります。Timeout 設定のデフォルト値は 3 秒であり、最大値は 8 秒です。
たとえば、Lambda 関数が 15 秒のタイムアウト値に設定されていて、Lambda が 10 秒間実行されている場合、タイムアウトエラーは発生しませんが、最大許容 Timeout 値は 8 秒であるため、コンタクトフローは実行をエラーブランチにルーティングします。
関数の呼び出しにかかる時間を調べるには、Amazon CloudWatch で関数の Duration メトリクスを確認します。次に、必要に応じて invoke Lambda 関数と Lambda 関数のタイムアウト値を更新します。
注: 呼び出しに 8 秒よりも長くかかる Lambda 関数をコンタクトフローに含めるには、Amazon Connect で非同期 Lambda 関数を使用してください。複数の Lambda 関数を呼び出す場合、関数シーケンスの所要時間は 20 秒以内である必要があります。
Lambda Error メトリクスに関連するタイムスタンプのデータが含まれている場合は、「Lambda 関数のエラーをトラブルシューティングする方法を教えてください」の手順を実行してください。
関連情報
Amazon Connect から AWS Lambda 関数のエイリアスを呼び出す