WSL + Docker Desktop for Windows + docker-lambda + Python でローカル開発環境を構築

# 概要
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** にチェックが無い場合は
　一緒にチェックを入れて有効にしてください。

[WSLのインストール・アンインストール方法](https://qiita.com/tkj06/items/b5c195db860241663485)

# Docker Desktop on Windows をインストール
下記の素晴らしい記事を参考に「おまけ」「アンインストール」以外を実施
※**docker desktop for windows の docker デーモンを WSL から使えるようにする** の時に
　**Shared Drives** でローカルの作業ディレクトリのあるドライブにチェックを入れておいてください。

[docker desktop for windows + WSL で docker 環境](https://qiita.com/tkj06/items/71e187d959363b8cec11)

# ソースを準備
GitHub にこの記事で使用するソースのテンプレートを用意しました。
下記のリンクから MIT License で公開しています。
ご自由にお使いください。

[ソースコードのTemplateをダウンロード](https://github.com/yuukiyouki/docker-lambda-template)

# エイリアスを登録
新規のLambda関数はテンプレートのソースを基に作成していくため、
Dockerを実行する際のコマンドは常に一定になる想定です。
毎回入力するのは大変ですので、あらかじめ WSL にエイリアスを登録しておきます。

.bash_aliases を vim で開く（無ければ新規作成）

```bash
~$ sudo vim ~/.bash_aliases && source ~/.bash_aliases
```

.bash_aliases に下記コマンドを追加

```vim:.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 上でローカル環境のディレクトリにいる時

```bash
/mnt/d/Program/Python/AWS/docker-lambda $ echo $PWD
/mnt/d/Program/Python/AWS/docker-lambda
```
となっていますので、これをローカル環境のパスに変換するために

```bash
/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

作業ディレクトリに移動

```bash
~$ cd /mnt/d/Program/Python/AWS/docker-lambda/
```

Lambda関数を実行

```bash
/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のインストール・アンインストール方法](https://qiita.com/tkj06/items/b5c195db860241663485)
[docker desktop for windows + WSL で docker 環境](https://qiita.com/tkj06/items/71e187d959363b8cec11)
[docker-lambdaでAWS Lambda環境をお手軽に動かす](https://qiita.com/hihats/items/56005088f0f2018143cf)
[いまさらだけどDockerに入門したので分かりやすくまとめてみた](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1)


# 最後に
なるべく初学者の方にもわかるように説明しているつもりですが、
分かりづらい点があったり、間違っている点がありましたら
コメントをいただけると助かります。