はじめに
みなさま,こんにちは.
株式会社オプティマインドにて,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
{
"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でもこちらで募集中