AWS SAMのtemplate.yamlの構成をローカル環境でテストする

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

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編) | フューチャー技術ブログ