aws-lambda-mock-contextで発生するtimeoutの回避

当記事は、半年以上前に投稿されたものです。そのため、古い技術や情報をもとに書かれている可能性があります。参照する際は十分に注意していただければです。

SAM で テストする際に Jest と aws-lambda-mock-context をよく使っているのですが、処理が重くなると簡単に timeout 3秒を超えてエラーになります。

aws-lambda-mock-context では、テスト実行時に mock 用の context を流して擬似的に lambda を実行するため、template.yml のオプションが反映されません。

そして、最初私は template.yml の timeout のオプションがなぜか反映されず困っていました。

ですが、前述のように、そもそも SAM (つまり、template.yml) を通して実行されていないのだから timeout のオプションも反映されません。Jest と aws-lambda-mock-context で完結した実行なのだから、両者でオプションを設定する必要があります。

アホですね emoji-full_moon_with_face

tl; dr

'use strict';
const context = require('aws-lambda-mock-context');
const app = require('../app');
const event = require('./event');

describe('タイムアウトのテスト', () => {

  test('テスト', async () => {

    // ここで context に timeout オプションを設定
    let ctx = context({
      timeout: 10
    });

    const response = await app.lambdaHandler(event, ctx, function(){});
    expect(response.statusCode).toBe(200);
  });

});

その他オプション一覧

以下は、aws-lambda-mock-contextの公式より、

region

  • Type: string
  • Default: us-west-1

account

  • Type: string
  • Default: 123456789012

functionName

  • Type: string
  • Default: aws-lambda-mock-context

functionVersion

  • Type: string
  • Default: $LATEST

memoryLimitInMB

  • Type: string
  • Default: 128

alias

  • Type: string

timeout

  • Type: number
  • Default: 3

おわりに

ドキュメントを読めってことですね emoji-hammer

参考文献


Canji

クラウド周りをちょこまかしたい注意散漫人間。個人開発を楽しんでいたあの頃。