1
0

More than 1 year has passed since last update.

SAM Local実行時にタイムアウトしてしまう問題への対策

Last updated at Posted at 2022-12-07

はじめに

みなさま,こんにちは.
株式会社オプティマインドにて,GISエンジニアをしている@tkmbnです.

この記事は,株式会社オプティマインドの2022アドベントカレンダーへのエントリー記事8日目として書いております.

概要

SAMを用いたLambdaアプリケーション構築時に,template.yamlからタイムアウト値設定をしていますが,
その秒数ではローカルテスト時(pytest)ではタイムアウトになってしまう問題がありました.
クラウド上での実行時のタイムアウト値とローカル実行時でのタイムアウト値を変化させたいと思い,
対処法をいろいろと探っていたところ,良さそうな対処法を見つけたので,ご紹介いたします.

本題

現状の環境

  • SAM テンプレートの内容

    • API Gateway
    • Lambda (複数)
      • 複数Lambda内で共通で利用するものを集めたLayer
      • Global セクションにて,Timeoutや環境変数を設定している.
        • 環境変数は,ローカルからの実行時,overrideしている.
  • デプロイパイプライン

    • CodePipelineにて設定済み
    • CodeBuild → CloudFormation(Create Changeset → Execute Changeset)

解決までの道のり

試行錯誤1 : sam local lambda-start時に --container-env-varsを指定

ローカルでの起動時に以下の内容を追加してみる.

- sam local start-lambda -n <env params file path>
+ sam local start-lambda -n <env params file path> --container-env-vars container_env.json
container_env.json
{
    "AWS_LAMBDA_FUNCTION_TIMEOUT": 300
}

このコマンドを実行しても,何も変わらず,template.yaml内に記述されたタイムアウト値で実行されてしまいました.

2022-12-02 12:02:39,602 | Starting a timer for 30 seconds for function 'lambdaFunction'
START RequestId: xxxxxxxxxxxxxxxxxxxxxxxx Version: $LATEST
2022-12-02 12:03:09,634 | Function 'lambdaFunction' timed out after 30 seconds
END RequestId: xxxxxxxxxxxxxxxxxxxxxxxx

言わずもがな,pytestも失敗してしまいました.

試行錯誤2 : タイムアウト値をCFnのパラメータ化し,ローカル実行時にoverride

template.yamlを変更し,タイムアウト値をパラメータ化.

Globals:
  Function:
-    Timeout: 30
+    Timeout: !Ref TimeoutSec

...

Parameters:
+  TimeoutSec:
+    Type: Number
+    Default: 30

そして,ローカル実行コマンドを以下に変更

- sam local start-lambda -n <env params file path>
+ sam local start-lambda -n <env params file path> --parameter-overrides TimeoutSec=300

上記で実行後,pytestや普通にCLIのトリガーを行うと以下のようにログが出力されました!

2022-12-01 16:24:31,534 | Lambda function 'lambdaFunction' is already running
2022-12-01 16:24:31,534 | Starting a timer for 300 seconds for function 'lambdaFunction'
START RequestId: xxxxxxxxxxxxxxxxxxxxxxxx Version: $LATEST

しっかりと300secに変更されています!

まとめ

クラウド実行時のタイムアウト値とローカルでのタイムアウト値を変化させるために,以下で対応できることがわかりました.

  • template.yaml内で記述しているTimeoutの設定値をパラメータ化
  • ローカル起動時にそのパラメータをorverrideする

しばらくはこのままでやってみたいと思います.

困っている方の手助けになれば,幸いです.
最後まで読んでいただきありがとうございした.
なにか疑問点,間違っている点,等ございましたら,コメントお願いいたします.

最後に宣伝

株式会社オプティマインドでは、一緒に働く仲間を大募集中です。
カジュアル面談も大歓迎ですので、気軽にお声がけください。

【エンジニア領域の募集職種】
ソフトウェアエンジニア
QAエンジニア
Androidアプリエンジニア
組合せ最適化アルゴリズムエンジニア
経路探索アルゴリズムエンジニア
バックエンドエンジニア
インフラエンジニア
UXUIデザイナー

【ビジネス領域の募集職種】
セールスコンサルタント

『オプティマインドってどんな会社?』については、こちらから
Wantedlyでもこちらで募集中

参考文献

1
0
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
1
0