概要
CDKにてSQSキューをトリガーに実行するLambdaを初回deployする際、
キュー側の可視性タイムアウト時間よりもLambda実行のタイムアウト時間の方が長いと、
Invalid request provided: Queue visibility timeout: X seconds is less than Function timeout: X seconds
のエラーがでて、deployに失敗する。
エラー文言に従い可視性タイムアウト時間を長くすれば良いのだが、
Lambda側でキューを取得後にすぐに削除して別で処理のステータス管理をするケースなど、可視性タイムアウトを長くする必要がない場合がある。
また、ドキュメントでも
https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html
通常、可視性タイムアウトは、アプリケーションがキューのメッセージを処理して削除するまでの最大所要時間に設定します。
となっており、Lambdaの実行タイムアウト時間に必ずしも合わせる想定ではなさそう。
環境
aws-cdk@1.61.1
対処方法
ワークアラウンド的な対応だが、一度
可視性タイムアウト時間 >= Lambda実行のタイムアウト時間
でdeployした上で、
可視性タイムアウト時間 < Lambda実行のタイムアウト時間
に設定変更してdeployするとうまくいく。
可視性タイムアウト時間のデフォルト値は30秒のため、
https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html
すべての Amazon SQS キューの可視性タイムアウトはデフォルトで 30 秒に設定されています。
Lambda側のtimeoutを30秒に設定すればひとまずはdeploy可能となる。
CDKコードとしては
import * as lambda from '@aws-cdk/aws-lambda';
import * as path from 'path';
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.GO_1_X,
handler: 'main',
timeout: 30, // Lambdaの実行タイムアウト(秒)を設定
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda')),
});
のような形。
一度deployした後に、例えば15分にしたければ
import * as lambda from '@aws-cdk/aws-lambda';
import * as path from 'path';
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.GO_1_X,
handler: 'main',
timeout: 15 * 60, // Lambdaの実行タイムアウト(秒)を設定
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda')),
});
のようにして再度 cdk deploy
することで、Lambdaのタイムアウト時間のみ更新できる。