目的
Lamba のエラー通知を受信したので X-Ray で確認すると、Lambda の状態が「保留中」となったまま実行時間を過ぎてタイムアウトしまいエラーになっていることがありました。その原因がわかったため、ここに記録しておきます。
原因
このエラーは、VPC 内のプライベートサブネットに接続する必要がある Lambda に起こるようです。
Lambda が VPC 内のリソースに接続するとき、サブネットごとにネットワークインターフェイス(ENI)が作成されます。これによって Lambda は各 VPC 内のリソースに通信できるようになります。
この Lambda が長期間アクティブでない場合、Lambda はネットワークインターフェイスを回収し、アイドル状態になります。アイドル状態の Lambda を再度アクティブにするには、その Lambda を呼び出します。すると、この呼び出しは失敗し、ネットワークインターフェイスが使用可能になるまで、Lambda は保留(Pending)状態になります。
このとき、ネットワークインターフェースが使用可能になるまでにかかる時間が Lambda の実行時間を超えてしまうと、Lambda は終了し、エラーになるようです。
VPC 接続しない Lambda では、この様なエラーは確認されていません。
保留中のままタイムアウトした Lambda の X-Ray
下記は、タイムアウトを 5 秒に設定している Lambda が保留中のまま終了となり、エラーとなった際の X-Ray の表示内容です。
Lambda の状態に関する情報を取得するコマンド
下記のコマンドで、Lambda API を使用して、関数の状態に関する情報を取得できます。表示される各項目の解説は、FunctionConfiguration を参照してください。
$ aws lambda get-function-configuration --function-name my-function
{
"FunctionName": "my-function",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXX:function:my-function",
"Runtime": "go1.x",
"Role": "arn:aws:iam::XXXXXXXX:role/XXXXXXXX",
"Handler": "XXXXXXXX",
"CodeSize": 123456789,
"Description": "",
"Timeout": 5,
"MemorySize": 128,
"LastModified": "2021-10-13T07:46:51.452+0000",
"CodeSha256": "XXXXXXXX",
"Version": "$LATEST",
"VpcConfig": {
"SubnetIds": [
"subnet-XXXXXXXX",
"subnet-XXXXXXXX"
],
"SecurityGroupIds": [
"sg-XXXXXXXX"
],
"VpcId": "vpc-XXXXXXXX"
},
"Environment": {
"Variables": {
"XXXXXXXX": "XXXXXXXX",
}
},
"TracingConfig": {
"Mode": "Active"
},
"RevisionId": "XXXXXXXX",
"State": "Active",
"LastUpdateStatus": "Successful",
"PackageType": "Zip"
}
以上です。