🐷

lambrollでサブディレクトリにある関数を指定する

2023/08/23に公開

lambrollでlambda関数を構築する

pythonでlambda関数を構築する。そのデプロイにlambrollを利用したい。対象のディレクトリ構成に応じてどのようにデプロイ設定をすればよいか。

ルートディレクトリにハンドラー関数がある場合

ルートディレクトリに lambda_function.py があり、そこで定義されている関数 lambda_handler を呼び出したい場合。

この場合はlambrollのREADMEにある通り、単に lambroll deploy すればよい。

$ ls
function.json  lambda_function.py

$ cat function.json
{
  "FunctionName": "sample-lambroll",
  "Handler": "lambda_function.lambda_handler",
  "MemorySize": 128,
  "Role": "{{ env `IAM_ROLE_LAMBDA` }}",
  "Runtime": "python3.11",
  "Timeout": 3
}

$ cat lambda_function.py
def lambda_handler(event, context):
    print('hello lambroll')

$ lambroll deploy
2023/08/23 23:07:32 [info] lambroll v0.14.3 with function.json
2023/08/23 23:07:32 [info] starting deploy function sample-lambroll
2023/08/23 23:07:32 [info] creating zip archive from .
2023/08/23 23:07:32 [info] zip archive wrote 604 bytes
2023/08/23 23:07:32 [info] updating function configuration
2023/08/23 23:07:32 [info] State:Active LastUpdateStatus:Successful
2023/08/23 23:07:32 [info] updated function configuration successfully
2023/08/23 23:07:32 [info] updating function code
2023/08/23 23:07:32 [info] State:Active LastUpdateStatus:InProgress
2023/08/23 23:07:32 [info] waiting for LastUpdateStatus Successful
2023/08/23 23:07:33 [info] State:Active LastUpdateStatus:Successful
2023/08/23 23:07:33 [info] updated function code successfully
2023/08/23 23:07:33 [info] deployed version 6
2023/08/23 23:07:33 [info] updating alias set current to version 6
2023/08/23 23:07:34 [info] alias updated
2023/08/23 23:07:34 [info] completed

サブディレクトリにハンドラー関数がある場合

プロダクションコードをsrcディレクトリに、テストをtestディレクトリに配置するようなケース。このような場合にどのようにlambrollでzipを作成してlambda関数を構築するべきか。

$ ls
function.json  src

$ ls src
lambda_function.py

以下の2通りの方法が考えられる。

サブディレクトリをzip化する

lambroll deploy コマンドには --src フラグが指定できる。ここでソースコードが配置されているディレクトリを指定すればよい。こうすればsrcディレクトリ以下のみがzip化されるので不要なファイルなどが含まれることはない。
基本的にはこの方式でよさそう。

$ lambroll deploy --src src
2023/08/23 23:11:49 [info] lambroll v0.14.3 with function.json
2023/08/23 23:11:49 [info] starting deploy function sample-lambroll
2023/08/23 23:11:50 [info] creating zip archive from src
2023/08/23 23:11:50 [info] zip archive wrote 235 bytes
2023/08/23 23:11:50 [info] updating function configuration
2023/08/23 23:11:50 [info] State:Active LastUpdateStatus:Successful
2023/08/23 23:11:50 [info] updated function configuration successfully
2023/08/23 23:11:50 [info] updating function code
2023/08/23 23:11:50 [info] State:Active LastUpdateStatus:InProgress
2023/08/23 23:11:50 [info] waiting for LastUpdateStatus Successful
2023/08/23 23:11:51 [info] State:Active LastUpdateStatus:Successful
2023/08/23 23:11:51 [info] updated function code successfully
2023/08/23 23:11:51 [info] deployed version 7
2023/08/23 23:11:51 [info] updating alias set current to version 7
2023/08/23 23:11:51 [info] alias updated
2023/08/23 23:11:51 [info] completed

handlerでサブディレクトリを指定する

function.json に記載するHandlerでsrc.lambda_function.lambda_handler のようにディレクトリを含めて指定してもよい。この方法だとlambda関数上でもsrcディレクトリ構造は保たれる。testディレクトリが存在する場合はtestディレクトリも含めてzip化されるので、これを防ぎたい場合は .lambdaignoretest/* のように指定すればよい。

$ cat function.json
{
  "FunctionName": "sample-lambroll",
  "Handler": "src.lambda_function.lambda_handler",
  "MemorySize": 128,
  "Role": "{{ env `IAM_ROLE_LAMBDA` }}",
  "Runtime": "python3.11",
  "Timeout": 3
}

$ lambroll deploy
2023/08/23 23:18:02 [info] lambroll v0.14.3 with function.json
2023/08/23 23:18:02 [info] starting deploy function sample-lambroll
2023/08/23 23:18:02 [info] creating zip archive from .
2023/08/23 23:18:02 [info] zip archive wrote 612 bytes
2023/08/23 23:18:02 [info] updating function configuration
2023/08/23 23:18:02 [info] State:Active LastUpdateStatus:Successful
2023/08/23 23:18:02 [info] updated function configuration successfully
2023/08/23 23:18:02 [info] updating function code
2023/08/23 23:18:02 [info] State:Active LastUpdateStatus:InProgress
2023/08/23 23:18:02 [info] waiting for LastUpdateStatus Successful
2023/08/23 23:18:03 [info] State:Active LastUpdateStatus:InProgress
2023/08/23 23:18:03 [info] waiting for LastUpdateStatus Successful
2023/08/23 23:18:05 [info] State:Active LastUpdateStatus:Successful
2023/08/23 23:18:06 [info] updated function code successfully
2023/08/23 23:18:06 [info] deployed version 8
2023/08/23 23:18:06 [info] updating alias set current to version 8
2023/08/23 23:18:06 [info] alias updated
2023/08/23 23:18:06 [info] completed

Discussion