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に接続しないといけなかったのでこんな形になりました。
コメント
コメントを投稿