serverless-offline + dynamdb-local でLocal 開発する
serverless を利用してアプリ開発をする際、serverless-offline を利用するとお手軽にlambda functions をlocal 環境に立ち上げられる。
さらにDB にdynamoDB を利用する場合dynamodb-local を利用でき、通常serverless-offline と組み合せるにはserverless-dynamodb-local のプラグインを利用すると良い。
ただし、今回はserverless との接続だけでなくdynamodb-local container を単体で立ち上げてのテストも実行したい。
そこで個別にdynamodb-local のdocker container を立てて、docker network の設定でserverless-offline に繋げてみる。
serverless-offline はdefault bridge network を利用するため、dynamodb-local のcontainer でこのnetwork を指定すればよい。
docker-compose.yml
services:
dynamodb-local:
...
network_mode: bridge
・・・と思いきやこれでは上手くいかなかった。
ドキュメントにあるようにdefault bridge 上のコンテナ間通信ではalias ではなくIP address の指定が必要になるため、dynamoDB のエンドポイントをhttp://dynamodb-local:8000
のように指定できなくなってしまったからだ。
この問題を解決するにはまずnetwork のsubnet を指定する。
続いてcontainer 側のcidr を固定すればOK。
・・・と思いきや、今回はdefault bridge を利用するためnetwork
でなくnetwork_mode
を指定する必要があり、network.ipv4_address
は設定できない。
そして調べた感じ解決方法は見つけられなかった。
だがそもそも、仮にaddress を固定できてもdefault bridge network を使うのは微妙なのでserverless-offline 側でuser-defined network を作成したい。
serverless-offline は
dockerNetwork
When running Docker Lambda inside another Docker container, you may need to override network that Docker Lambda connects to in order to communicate with other containers.
のoption を提供しており、network は作成してくれないがこれを使うのが良さそう。
ここで素直に考えるとdocker network を作ってserverless-offline, dynamodb-local 共にそこに乗せるのが良さそうだが、今回は楽をしてdynamodb-local のdocker-compose 内で定義してserverless-offline はそれに依存させることにした。
serverless.yml
custom:
serverless-offline:
useDocker: true
dockerNetwork: myapp_dynamodb-local-network
plugins:
- serverless-offline
docker-compose.yml
services:
dynamodb-local:
...
networks:
- dynamodb-local-network
networks:
dynamodb-local-network:
driver: bridge