AWS Lambda をSAMでローカル実行する
概要
Kotlinで書いたAWS Lambda をローカルで実行したい
環境構築
公式チュートリアルに沿って環境構築を行います
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html
- SAM CLI インストール
テンプレート作成
sam init -r java8 -d gradlebuild.gradleの修正
kotlin-sdkの追加- 未確認: 恐らく
kotlin-sdkをjarに同梱しなければならない
- Kotlinへの変換
ローカルで実行
gradle build が行われて, コンテナイメージとしてデプロイされるようです.
sam build
sam local start-apiLambda 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 Secrettemplate.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_IAMDBにアクセスする
Lambdaの制約
- 実行時間は最大15分
- Lambda Layer(ライブラリ) + Lambda本体(上限50MB) 合わせて250MB
- Springフレームワークは巨大なので分けなければならない
- Springは起動かなり遅い(数秒)
SAM CLIでLambda Layerを利用する時の挙動
Spring Batch

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