Doker Desktop for Windows を利用した AWS lambda ローカルPC開発環境構築

## 環境
* Windows 10 Pro 20H2
* docker desktop Version 3.1.0(51484)

## docker desktop インストール

* [Docker Desktop for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows)  
Get Docker よりインストーラーをダウンロードして実行

ちなみに、私のPCではインストール実行後、以下の問題が出て解決するまで時間がかかりました。

* [\[Docker\] &quot;Timed out waiting for the lifecycle-server to start&quot;によりサービスが起動しない - Qiita](https://qiita.com/ktz_alias/items/f617c526a18de9b3f0f7)


## amazonlinux 起動
* docker desktop 起動後、PowerShell より以下のコマンドを実行

```
docker pull amazonlinux
```
* docker desktop の images > Images on disk より amazonlinux を RUN ボタンを押して Optional Settings を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58181/76ab3083-a540-c9b9-2338-d891a2352c83.png)  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58181/294dff54-d558-8ebc-7482-fe9cd1104848.png)  

* Optional Settings で Container Name, Volumes を設定して Run ボタンを押す  
Windows のローカルフォルダ D:\lambda を Amazonlinuxコンテナの /windows にマウントする例

```
# Container Name
lambda

# Host Path
/d/lambda

# Container Path
/windows
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58181/087ca231-5656-65b7-fa63-bb4a07fc3212.png)


* Containers / Apps より amazonlinux の CLI 起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58181/7ff362e0-02dc-27e7-1139-140d8879d520.png)


## 必要コマンドのインストール
* CLI に入るとroot状態で、まっさらな状態なので yum コマンドにて 諸々インストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58181/bc903303-0789-417b-4258-87b2b17cd30e.png)

```
yum -y install util-linux procps wget jq sudo
yum -y groupinstall 'Development tools'
yum -y install zlib-devel openssl-devel
yum -y install libffi-devel
```

## ユーザー作成
```
useradd username
```

## sudo を利用できるようにする
* visudo で /etc/sudoers を編集

```
visudo
```

* コメントアウトを外して保存

```
# %wheel        ALL=(ALL)       NOPASSWD: ALL
↓
%wheel        ALL=(ALL)       NOPASSWD: ALL
```

* ユーザーを wheel グループに追加

```
usermod -aG wheel username
```

* ユーザーにスイッチ

```
su username
```

以降、スイッチしたユーザーでPythonなどインストール。

## Python3.7のインストール
```
mkdir -p /tmp/python3.7
cd /tmp/python3.7
wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz
tar zxvf Python-3.7.9.tgz
cd Python-3.7.9
./configure
make
sudo make install

python3 --version
```

## aws cli インストール
```
mkdir -p /tmp/awscli
cd /tmp/awscli
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

aws --version
```

## lambda 環境構築
python-lambda-local, lambda-uploader を利用する例。

```
cd ~
python3 -m venv lambda
. ./lambda/bin/activate
pip install -U pip
pip install boto3
pip install python-lambda-local
pip install lambda-uploader
```

## LANG を UTF-8 に設定
~/.bashrc に以下を追加する。

```
export LANG=ja_JP.utf-8
```

## localtime を UTC から JST に変更
日本との時差が9時間出てしまうのを修正。

```
date
Mon Mar  1 15:26:48 UTC 2021

ll /etc/localtime
lrwxrwxrwx 1 root root 25 Feb 14 04:21 /etc/localtime -> ../usr/share/zoneinfo/UTC

cd /etc/
sudo ln -sf ../usr/share/zoneinfo/Japan localtime

ll localtime
lrwxrwxrwx 1 root root 27 Mar  1 23:44 localtime -> ../usr/share/zoneinfo/Japan

date
Tue Mar  2 00:26:19 JST 2021
```


## その他
lambda開発に慣れてきたらこの辺りも試したいところです。

* [AWS Lambda x Pythonでのローカル開発環境の再現について - Qiita](https://qiita.com/i35_267/items/15b981acae8cf7c763ae)

## 参考
* [Amazon Linuxでpyminizipがインストールできない - Qiita](https://qiita.com/cwaltz3031/items/042e334768372517d381)
* [CentOS 7.3 : sudoコマンドのインストール - Qiita](https://qiita.com/i35_267/items/324e6243051ecac1609f)
* [CentOSでuserをsudo可能にする - Qiita](https://qiita.com/Esfahan/items/a159753d156d23baf180)
* [Linux での AWS CLI バージョン 2 のインストール、更新、アンインストール - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html)
* [Blue21: Docker コンテナなら誰でも AmazonLinux が使える](https://blue21neo.blogspot.com/2017/01/docker-amazonlinux.html)
* [Docker - すでに作ったコンテナでホスト側ディレクトリをマウントするには？｜teratail](https://teratail.com/questions/60233)
* [【AWS】python-lambda-localとlambda-uploaderを使ってみた - 学びノート](https://www.oio-blog.com/contents/lambda_dev_env/)