LoginSignup
11
5

More than 3 years have passed since last update.

SQSの可視性タイムアウトよりもLambdaのタイムアウトを長く設定したい

Posted at

概要

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のタイムアウト時間のみ更新できる。

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5