Closed6

serverless-offline + dynamdb-local でLocal 開発する

mosimosi

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 に繋げてみる。

mosimosi

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 のように指定できなくなってしまったからだ。

mosimosi

この問題を解決するにはまずnetwork のsubnet を指定する。
https://docs.docker.com/network/bridge/#configure-the-default-bridge-network

続いてcontainer 側のcidr を固定すればOK。
https://docs.docker.com/compose/compose-file/compose-file-v2/#ipv4_address-ipv6_address

・・・と思いきや、今回はdefault bridge を利用するためnetwork でなくnetwork_mode を指定する必要があり、network.ipv4_address は設定できない。

そして調べた感じ解決方法は見つけられなかった。

mosimosi

だがそもそも、仮に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 は作成してくれないがこれを使うのが良さそう。

mosimosi

ここで素直に考えると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
このスクラップは2022/04/10にクローズされました