Amazon Connectの[AWS Lambda 関数の呼び出し]ブロックがエラーになったり正常と判定される原因と解決方法

2024.06.03

困っていた内容

Amazon Connectフローの[AWS Lambda 関数の呼び出し]ブロックで、エラーになったり正常と判定されたりすることがあります。この問題をどのように解決すればよいでしょうか。

状況は以下の通りです。

  • 問題のあったフローはこちらです。

    • [AWS Lambda 関数の呼び出し] ブロックのタイムアウトは3秒に設定しています。
  • VPC内のLambda関数として起動しています。
  • Lambda関数の処理内容は、SSM Change Calendarを使用して休業日判定を行っています。
  • Lambda関数のタイムアウトは3秒に設定しています。
  • Lambda関数のログ(CloudWatch Logs)を確認したところ、エラーにならず正常に実行されていました。
  • 一方、Connectフローログ(CloudWatch Logs)ではエラーが出力されていました。

エラーと判定された時のLambda関数のログは以下の通りです。

START RequestId: 8b9836de-3acb-46ae-82da-080b95e77880 Version: $LATEST


END RequestId: 8b9836de-3acb-46ae-82da-080b95e77880


REPORT 
RequestId: 8b9836de-3acb-46ae-82da-080b95e77880 
Duration: 2693.88 ms    
Billed Duration: 2694 ms    
Memory Size: 128 MB 
Max Memory Used: 81 MB  
Init Duration: 303.42 ms

エラーと判定された時のConnectフローログは以下の通りです。

{
    "Results": "The Lambda Function Returned An Error.",
    "ContactId": "c627399f-13ca-47fa-b6d9-5396c24e5a9e",
    "ContactFlowId": "arn:aws:connect:ap-northeast-1:xxxxxxxxxxxx:instance/3ff2093d-af96-43fd-b038-3c07cdd7609c/contact-flow/9a687645-4cb5-4869-bf7c-3a7db68d511a",
    "ContactFlowName": "xxx",
    "ContactFlowModuleType": "InvokeExternalResource",
    "Identifier": "ba33a894-ffa5-422a-bbfc-5607ba133724",
    "Timestamp": "2024-05-27T08:29:46.392Z",
    "Parameters": {
        "FunctionArn": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:xxxxx",
        "Parameters": {},
        "ResponseValidation": "ResponseType=STRING_MAP",
        "TimeLimit": "3000"
    }
}

The Lambda Function Returned An Error.というメッセージがありますが、このメッセージだけではどのようなエラーなのか判断できません。

原因

ドキュメントには[AWS Lambda 関数の呼び出し]ブロックがエラーと判定されるパターンがいくつか記載されています。

  1. Lambda関数にアクセスできない場合
  2. 関数が例外を出力した場合
  3. Lambda関数のレスポンスが32KBを超えた場合
  4. レスポンスが正しくない場合
  5. Lambda関数が制限時間を超えた場合

今回は、Lambda関数のログを確認したところ正常に実行されていたので、1点目と2点目の可能性は低いと考えられます。また、エラーになったり正常と判定されたりするため、3点目と4点目の可能性も低いでしょう。

5点目のLambda関数の制限時間が超えたことによる原因の可能性について考えてみましょう。

再掲ですが、エラー判定時のLambda関数のログは以下の通りです

START RequestId: 8b9836de-3acb-46ae-82da-080b95e77880 Version: $LATEST


END RequestId: 8b9836de-3acb-46ae-82da-080b95e77880


REPORT 
RequestId: 8b9836de-3acb-46ae-82da-080b95e77880 
Duration: 2693.88 ms    
Billed Duration: 2694 ms    
Memory Size: 128 MB 
Max Memory Used: 81 MB  
Init Duration: 303.42 ms

こちらの場合、初期所要時間(Init Duration)を含めたLambda関数の所要時間は、2997.30ms(2693.88 ms+ 303.42 ms)です。

  • 初期所要時間(Init Duration)
    • 最初に処理されたリクエストについて、ハンドラーメソッド外で関数をロードしてコードを実行するためにランタイムにかかった時間
  • 所要時間(Duration)
    • 関数のハンドラーメソッドがイベントの処理に要した時間

また、 [AWS Lambda 関数の呼び出し] ブロックのタイムアウト判定は、以下の3点の合計時間だと考えられます。 ドキュメントには記載がないため、あくまでも推測です

  1. [AWS Lambda 関数の呼び出し] ブロックが Lambda 関数を呼び出す時間
    • どのくらいの秒数を費やすかは不明
  2. Lambda関数の全体の処理でかかった時間
    • 2997.30ms
  3. Lambda関数から [AWS Lambda 関数の呼び出し] ブロックへレスポンスが返却される時間
    • どのくらいの秒数を費やすかは不明

上記の合計時間が3秒を超えたため、[AWS Lambda 関数の呼び出し]ブロックがエラーになることがあったと推測されます。

また、Lambda関数の所要時間によっては3秒を超えない場合もあるため、[AWS Lambda 関数の呼び出し]ブロックが正常と判定されることもあったのだと考えられます。

解決方法

実際に、[AWS Lambda 関数の呼び出し]ブロックのタイムアウト時間を伸ばしたところ、エラーになることはなくなりました。

Connectフローログにはエラーの詳細な内容が記載されていないため、必ずタイムアウトが原因というわけではありません。あくまでも今回のケースに限定した推測であることにご留意ください。

参考