AmazonSAMをローカル実行してMySQLに接続する

AmazonSAMをローカル実行してMySQLに接続する

AmazonSAMをローカル実行してMySQLに接続する

AmazonSAMのLambdaをローカルで実行する時は以下ですよね。

$ sam local start-api

AmazonSAMって上記で自動的にDockerコンテナ起動してLambdaの実行環境を作ってくれます。
で、既にDockerでMySQLが起動してる場合、そのMySQLにLambdaから接続される方法でちょっと困ったんで手順残しときます。

Dockerネットワーク作成

AmazonSAMとMySQLでネッワークを共有させるためにネットワークを作ります。

作成

$ docker network create my-network

削除

$ docker network rm my-network

MySQLで独自ネットワークを使わせる

作成したmy-network上でMySQLのコンテナを起動します。
直接コンテナ起動する場合は --network オプションを指定します。

$ docker run -e MYSQL_ROOT_PASSWORD=passw0rd -d -p 3306:3306 --network my-network mysql:8.0

docker-composeを使う場合はcompose.ymlを以下のように設定します。

version: '3.9'

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: passw0rd
      TZ: 'Asia/Tokyo'
    hostname: db_host
    ports:
      - 3306:3306
    networks:
      - my-network

networks:
  my-network:
    external: true

AmazonSAMで独自ネットワークを使わせる

以下のように --docker-network オプションを指定するだけです。

$ sam local start-api --docker-network my-network

これでLambdaからはMySQLのホスト名である db_host を指定すれば名前解決してくれるようになります。
以外と簡単?
でもdocker-composeを使ってるとDockerネットワークってあまり意識して使わないんですよね。
docker-composeがちゃんと一つのネットワークとしていい感じにしてくれます。
今回のようにコンテナ別々に起動するとか複数のdocker-composeで起動するとかした場合にコンテナ間でやり取りしたい時にはDockerネットワーク重要です。
Dockerを勉強し始めた時に使ってたんだけどすっかり忘れてました。

普通はこんなことしなくていいかと思います。
SAMのCloudFormationのテンプレートにRDSの記述を書いておけば多分RDSも勝手にローカルで起動されるから(確認してませんが)。
今回ちょっと既にあるMySQLに接続しないといけなかったのでこんな形になりました。

コメント

このブログの人気の投稿

(真)ESP32の開発環境をVSCodeで作る

ESP32にmicroSD接続

ESP32でデバッグ