SAM使用時にtemplate.yamlの構成のlambda_functionをローカル環境でテストすることができます。
但し、DynamoDBに関しては、別途、DynamoDBローカルの導入が必要となります。
ローカル環境の構築
といっても難しいことは何もなく、コマンドツールをインストールすればよい。
SAM ローカル環境用開発ツール
$ npm install -g aws-sam-local
ローカル環境での環境構築
Docker engineが起動していること。
$ sam local start-api --template template.yaml
実行すると、こんな感じでtemplate.yamlに定義したAPI Gatewayのエンドポイントなんかが案内されます。
A newer version of the AWS SAM CLI is available!
Your version: 0.2.11
Latest version: 0.53.0
See https://github.com/awslabs/aws-sam-local for upgrade instructions
2020/06/20 18:47:01 Connected to Docker 1.40
2020/06/20 18:47:01 Fetching lambci/lambda:python3.6 image for python3.6 runtime...
python3.6: Pulling from lambci/lambda
Digest: sha256:64d0a06989329fbbb2be56a11178eb7f14e224972d45a7e996859eb88895cca1
Status: Image is up to date for lambci/lambda:python3.6
2020/06/20 18:47:04 Fetching lambci/lambda:python3.6 image for python3.6 runtime...
python3.6: Pulling from lambci/lambda
Digest: sha256:64d0a06989329fbbb2be56a11178eb7f14e224972d45a7e996859eb88895cca1
Status: Image is up to date for lambci/lambda:python3.6
2020/06/20 18:47:06 Fetching lambci/lambda:python3.6 image for python3.6 runtime...
python3.6: Pulling from lambci/lambda
Digest: sha256:64d0a06989329fbbb2be56a11178eb7f14e224972d45a7e996859eb88895cca1
Status: Image is up to date for lambci/lambda:python3.6
Mounting lambda_function.lambda_handler (python3.6) at http://127.0.0.1:3000/resource/{resourceId} [DELETE]
Mounting lambda_function.lambda_handler (python3.6) at http://127.0.0.1:3000/resource/{resourceId} [GET]
Mounting lambda_function.lambda_handler (python3.6) at http://127.0.0.1:3000/resource/{resourceId} [PUT]
You can now browse to the above endpoints to invoke your functions.
You do not need to restart/reload SAM CLI while working on your functions,
changes will be reflected instantly/automatically. You only need to restart
SAM CLI if you update your AWS SAM template.
lambda_functionから吐かれるログも実行コンソール上に表示されます。
DynamoDBローカルの導入
DynamoDBはtemplate.yamlのスタックからはエミュレート出来ないので別途、構築する必要があります。
Dockerコンテナから導入するのが楽です。
$ docker pull amazon/dynamodb-local
docker networkの作成
lambda関数とは別コンテナになり、lambda関数側のコンテナからアクセスする用に、同じnetworkに配置する為のdocker networkセグメントを作成します。
$ docker network create lambda-local-test-network
DynamoDB コンテナの起動
--networkに作成したdocker networkを、--nameにlambdaプログラムからアクセスする為の名前解決用エイリアスを指定します。
$ docker run -d --network lambda-local-test-network --name DynamoLocal -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -inMemory -sharedDb
これでlocalhost:8000にDynamoDBのendpointが出来上がります。
tableの作成
SAM templateからはcreate table出来ないので、コマンドから作成します。忘れずに--endpoint-urlを指定すること。指定を忘れると、ログインユーザのprofile先の本番AWS環境に作成してしまいます(^_^;) 地味にハマった笑
$ aws dynamodb create-table --endpoint-url http://localhost:8000 --table-name sampleTable --attribute-definitions AttributeName=id,AttributeType=N --key-schema AttributeName=id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
lambda_functionからのDynamoDBローカルへの接続
lambda_function上のboto3から利用する場合は、endpoint_urlにDockerコンテナ名を指定することで接続できます。
import boto3 dynamodb = boto3.resource('dynamodb',endpoint_url='http://DynamoLocal:8000') table = dynamodb.Table("sampleTable")
lambda実行コンテナの起動
DynamoDBと同じnetwork上に配置する必要がある為、--docker-networkを指定してDynamoDBと同じnetwork上に配置します。
$ sam local start-api --template template.yaml --docker-network lambda-local-test-network
参考にしたページ: Serverless連載1: SAMを使ったローカルテスト(Go編) | フューチャー技術ブログ
