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

# はじめに
みなさま，こんにちは．
[株式会社オプティマインド](http://www.optimind.tech)にて，GISエンジニアをしている@tkmbnです．

この記事は，株式会社オプティマインドの[2022アドベントカレンダー](https://qiita.com/advent-calendar/2022/optimind-locationtech)へのエントリー記事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`を指定

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

``` diff_shell
- 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を変更し，タイムアウト値をパラメータ化．

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

...

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

```

そして，ローカル実行コマンドを以下に変更
``` diff_shell
- 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する

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

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


# 最後に宣伝

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

【エンジニア領域の募集職種】
●[ソフトウェアエンジニア](https://hrmos.co/pages/optimind/jobs/0002012)
●[QAエンジニア](https://hrmos.co/pages/optimind/jobs/0002011)
●[Androidアプリエンジニア](https://hrmos.co/pages/optimind/jobs/0002008)
●[組合せ最適化アルゴリズムエンジニア](https://hrmos.co/pages/optimind/jobs/0002013)
●[経路探索アルゴリズムエンジニア](https://hrmos.co/pages/optimind/jobs/0002014)
●[バックエンドエンジニア](https://hrmos.co/pages/optimind/jobs/0002015)
●[インフラエンジニア](https://hrmos.co/pages/optimind/jobs/0002016)
●[UXUIデザイナー](https://hrmos.co/pages/optimind/jobs/0002010)

【ビジネス領域の募集職種】
●[セールスコンサルタント](https://hrmos.co/pages/optimind/jobs/0002001)




『オプティマインドってどんな会社？』については、[こちら](https://www.optimind.tech/recruit/)から
Wantedlyでも[こちらで募集中](https://www.wantedly.com/companies/optimind/projects)

# 参考文献

- [Qiitaで簡単に記事を書くためのフォーマット(@kenseitogari1 )](https://qiita.com/kenseitogari1/items/1dcf4328d54e9f2c087c)