VSCode & Docker で(自称)モダンなLambda開発環境を作る

# この記事について

最近Lambdaの関数を作成する機会がありました。
その際に、DockerとVScodeを使用してそれっぽい感じの開発環境作ってみました。
その環境の作り方をこの記事にまとめます。


# 前提

- 端末
    - macbook pro (mojave)
    - VSCodeインストール済み
    - Dockerインストール済み
- AWS CLIを実行するためのクレデンシャルが取得可能(権限は割愛しますが、Administrator Accessを持っていたら楽だと思います)
    - https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html

※DockerとVSCodeはバージョンが古すぎなければ大丈夫だと思います


# VSCode + Docker + Pythonの環境を作る

## VSCodeにremote-containerの拡張機能を入れる

拡張機能名`ms-vscode-remote.remote-containers`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/5aeeb3fa-8217-aadd-d944-7e7662c5e2e3.png)

## コンテナを立ち上げる

作業ディレクトリを作成します。

```
> mkdir work-lambda
> cd work-lambda
```

Dockerfileを作成します。

```
> vi Dockerfile
> cat Dockerfile
FROM python:3.8

RUN pip install pylint
```

VSCodeで作業ディレクトリを開いて、`Remote-Cotainers: Reopen in Container`を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/46366592-5b1d-2622-f88a-ee2cde7518a3.png)

`From 'Dockerfile'`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/23d46919-157d-5f09-b7e5-bb924fc08c08.png)

コンテナが作成され、コンテナの中に入ることが可能になります。(数分間待つ必要あり)
※以下をクリックすると、コンテナをビルドする際のログを確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/2710b8bd-1497-220b-a409-6403ee9baa94.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/7aab9f3c-ffc4-d680-7ffa-41841fe4de3c.png)

## コンテナ上でVSCodeの拡張機能を使用できるようにする

`.devcontainer/devcontainer.json`の以下箇所に、使用したい拡張機能を登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/51630f9b-f69c-3e8b-26be-ffae61418980.png)

`Remote-Containers: Rebuild Container`を実行して、コンテナをビルドし直します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/5a1d4de5-d7b5-c583-8610-30ede23cadeb.png)

pythonプログラムを実行できるか確認するため、hello.pyファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/c09060fb-499b-9197-0827-5fc6620ab2fb.png)

```python:hell.py
print("hello world!")
```

Pythonプログラムが実行できていることを確認します。

```
> python hello.py 

hello world!
```


# コンテナ上でLambda開発をできるようにする

## Chaliceについて

Chaliceというツール(フレームワーク)を使って、lambda開発環境を作ります。

https://www.slideshare.net/AmazonWebServicesJapan/20190619-aws-black-belt-online-seminar-dive-deep-into-aws-chalice

## コンテナにChaliceを入れる

Dockerfileを以下の通り更新します。

```
FROM python:3.8

RUN pip install pylint chalice 
```

`Remote-Containers: Rebuild Container`でコンテナをビルドし直します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/c338fa6b-e370-5e46-6172-0ee148c0e99a.png)

## lambdaファンクションをデプロイする

chaliceを実行するために、コンテナにクレデンシャル情報を登録します。

以下の操作をコンテナ上にて実施します。
```
> export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXXX
> export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

デフォルトリージョンを定義します。

```
> export  AWS_DEFAULT_REGION=ap-northeast-1
```

プロジェクトを作成します。

```
> chalice new-project helloworld
```

app.pyの中身を確認します。
(デフォルトでは{'hello': 'world'}を返すだけの関数)

```python:app.py
from chalice import Chalice

app = Chalice(app_name='helloworld')


@app.route('/')
def index():
    return {'hello': 'world'}
```

デプロイします。

```
> cd helloworld/
> chalice deploy
```

以下の出力が表示されていたらデプロイ完了です。

```
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:helloworld-dev
  - Rest API URL: https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/
```

マネコンからlambda関数が作成されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/ce59b34d-e7a9-35e0-7ba0-067b30126c9e.png)


一緒に作成されたAPI Gatewayのエンドポイントを叩いてみます。

```
curl https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/

{"hello":"world"}
```

ちゃんと動いてそうですね！

# 削除方法

lambda関数を削除したい場合は、削除したい関数のプロジェクトにて以下を実行します。

```
> chalice delete
```