"Thông" Mạng Cho Aws SAM Và Dynamodb Local (日本語)
Dynamodb localを使いローカルで開発時
SAM localのstart-apiやinvokeコマンドを使い、Lambda関数をローカルで実行する時は、
- Lambda関数がSAMのDockerコンテナ上で実行され
- Dynamodb localが別のDockerコンテナ上で動く
そのため、Lambda関数がDynamodb localへアクセルできるように、 2つのDockerコンテナを同じネットワークに繋がせる必要があります。
対応方法は以下の通りです。
まずはDynamodb localのDockerセットアップ file: docker-compose.yml
services:
dynamodb:
container_name: dynamodb #重要:コンテナ名を指定
image: amazon/dynamodb-local
networks:
- aws_local_network #繋がるネットワークを指定
<省略>
networks:
aws_local_network:
name: aws_local_network #重要:ネットワーク名を強制的に指定
そして、モデルのソースコードを以下のように修正
if os.environ.get('AWS_SESSION_TOKEN') is None:
host = "http://dynamodb:8000"
解説: AWS_SESSION_TOKEN 環境変数には、実際のAWS環境で実行する時にしか値がないので
ローカルで実行しているかどうなの判別に使えます。
また、http://dynamodb:8000
のdynamodb
はDynamodb localのコンテナ名です。
最後に、Lambda関数をローカルで実行する時 --docker-network aws_local_network
を追加で指定
sam local start-api --docker-network aws_local_network
又は、sam local invoke HogeFunction -e event.json --docker-network aws_local_network