AWS Lambda をSAMでローカル実行する

概要

Kotlinで書いたAWS Lambda をローカルで実行したい

環境構築

公式チュートリアルに沿って環境構築を行います
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html

  1. SAM CLI インストール

テンプレート作成

sam init -r java8 -d gradle
  1. build.gradle の修正
  • kotlin-sdk の追加
  • 未確認: 恐らく kotlin-sdk をjarに同梱しなければならない
  1. Kotlinへの変換

ローカルで実行

gradle build が行われて, コンテナイメージとしてデプロイされるようです.

sam build
sam local start-api

Lambda Layer

Lambda Layerに依存しているLambdaをローカル(sam)で動かす場合はLambda Layerがデプロイされていないと動かないようです, Lambda Layer, Lambda両方ローカルで動作させる方法を調査中.

環境変数を渡す方法

ローカルでは

{
  "BatchFunction": {
    "Secret": "secret"
  }
}

env.json に値を書き,

Params:
  Secret:
    Type: String
Resources:
  BatchFunction:
      Environment: 
        Variables:
          SECRET: !Ref Secret

template.yaml に設定し,

sam local start-api --env-vars env.json

を実行することで環境変数を渡せます.
この方法は sam deploy には使えないようなので

# after exporting env-vars
sam deploy --parameter-overrides Secret=$SECRET ...

とする必要があるらしいです.

動作確認

$ $curl localhost:3000/batch
{ "message": "batch", "env": "Secret" }

テスト

cd BatchFunction
./gradlew test

定期実行

[AWS]SAMを使ってLambdaを定期実行するHelloWorld - Qiita

Resources:
    HelloWorldFunction:
        Type: AWS::Serverless::Function
        Properties:
            CodeUri: hello_world/build
            Handler: app.lambda_handler
            Runtime: python3.7
            Events:
                HelloWorld:
                    Type: Schedule
                    Properties:
                        Schedule: cron(<cron-expr>)

パッケージ化

調査中

sam package --template-file template.yaml \
  --output-template-file packaged.yaml \
  --s3-bucket <bucket_name>

デプロイ

sam deploy --template-file packaged.yaml \
  --stack-name code-batch \
  --capabilities CAPABILITY_IAM

DBにアクセスする

Lambdaの制約

  • 実行時間は最大15分
  • Lambda Layer(ライブラリ) + Lambda本体(上限50MB) 合わせて250MB
    • Springフレームワークは巨大なので分けなければならない
  • Springは起動かなり遅い(数秒)

SAM CLIでLambda Layerを利用する時の挙動

Spring Batch

Spring Batchのユースケース | Pulog

  • Job はいくつかの Step からなる
  • 各工程を実装する Chunk モデルと 自由にかけるTasklet モデルがある

参考文献