概要
AWS Lambda のローカル開発環境を Windows 上で構築しなければならなくなったため、
自分なりの構築手順を備忘録として記述していきます。
その通りやるだけで簡単に構築できる素晴らしい記事 を参考に進めていきたいと思います。
- WSL(Windows Subsystem for Linux)の環境を構築します。
- ローカルに Docker Desktop for Windows の環境を構築します。
- WSL からローカルの Docker Desktop for Windows を操作できるようにします。
- ローカル環境に AWS Lambda(Python) の開発環境を構築します。
環境情報
- Windows10 Pro(1909)
- WSL(Ubuntu 18.* LTS)
- bash
- Docker
- Python3.6
※ちなみに記事の内容は bash を想定して書いていますが
私の環境は fish ですので表示が間違っている可能性があります。
万が一、間違っている箇所がありましたら、
お手数ですがコメントで教えていただけると助かります。
前提知識
- 基本的なLinux(Ubuntu, bash)の操作を理解している
- 仮想OS, WSL, Dockerに関する基本的な知識がある
- AWS Lambda の基本的な知識がある
WSLの構築
下記の素晴らしい記事を参考に「おまけ」「アンインストール」以外を実施
※下記の 初めにやっておく設定 の中で Hyper-V にチェックが無い場合は
一緒にチェックを入れて有効にしてください。
Docker Desktop on Windows をインストール
下記の素晴らしい記事を参考に「おまけ」「アンインストール」以外を実施
※docker desktop for windows の docker デーモンを WSL から使えるようにする の時に
Shared Drives でローカルの作業ディレクトリのあるドライブにチェックを入れておいてください。
docker desktop for windows + WSL で docker 環境
ソースを準備
GitHub にこの記事で使用するソースのテンプレートを用意しました。
下記のリンクから MIT License で公開しています。
ご自由にお使いください。
エイリアスを登録
新規のLambda関数はテンプレートのソースを基に作成していくため、
Dockerを実行する際のコマンドは常に一定になる想定です。
毎回入力するのは大変ですので、あらかじめ WSL にエイリアスを登録しておきます。
.bash_aliases を vim で開く(無ければ新規作成)
~$ sudo vim ~/.bash_aliases && source ~/.bash_aliases
.bash_aliases に下記コマンドを追加
alias docrun='docker run -v $(wslpath -m $PWD):/var/task --env-file .env lambci/lambda:python3.6 lambda_function.lambda_handler $(printf "%s" $(cat event.json))'
簡単にですが docrun
の内容を説明します。
docker run
Dockerイメージからコンテナを生成・実行
-v $(wslpath -m $PWD):/var/task
:
ホストOSのディレクトリ:コンテナのディレクトリ でボリュームを割り当てています。
※コンテナ上の /var/task
の中で、左に指定したホストOSのディレクトリの中が見えるということです。
ただし、WSL 上でローカル環境のディレクトリにいる時
/mnt/d/Program/Python/AWS/docker-lambda $ echo $PWD
/mnt/d/Program/Python/AWS/docker-lambda
となっていますので、これをローカル環境のパスに変換するために
/mnt/d/Program/Python/AWS/docker-lambda $ echo $(wslpath -m $PWD)
D:/Program/Python/AWS/docker-lambda
としています。
--env-file .env
環境変数ファイルを読み込みます。
lambci/lambda:python3.6
Dockerイメージを指定しています。
lambda_function.lambda_handler
lambda_function.py の lambda_handler を実行するようにしています。
$(printf "%s" $(cat event.json))
event.json の内容を lambda_handler の引数 event に渡しています。
Lambda関数を実行してみる
Windows
テンプレートのソースファイルを作業ディレクトリにコピーします。(ここでは D:\Program\Python\AWS\docker-lambda
にします。)
WSL
作業ディレクトリに移動
~$ cd /mnt/d/Program/Python/AWS/docker-lambda/
Lambda関数を実行
/mnt/d/Program/Python/AWS/docker-lambda $ docrun
START RequestId: c02ba91d-7783-1719-3b5e-269dfb11c807 Version: $LATEST
event:{'Hello': 'World'}
ENV:LOCAL
END RequestId: c02ba91d-7783-1719-3b5e-269dfb11c807
REPORT RequestId: c02ba91d-7783-1719-3b5e-269dfb11c807 Init Duration: 439.63 ms Duration: 4.32 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 39 MB
"{\"message\": \"success\"}"
初めて実行する時はDockerイメージのPullから始まります。
Pull完了後に関数が実行され、上記のような表示がされれば環境構築は完了です。
参考
WSLのインストール・アンインストール方法
docker desktop for windows + WSL で docker 環境
docker-lambdaでAWS Lambda環境をお手軽に動かす
いまさらだけどDockerに入門したので分かりやすくまとめてみた
最後に
なるべく初学者の方にもわかるように説明しているつもりですが、
分かりづらい点があったり、間違っている点がありましたら
コメントをいただけると助かります。