Serverless Framework を Docker で動かす Dockerfile テンプレート

# 概要
Serverless Framework のコマンドを Mac で叩きたかったがローカル環境を汚したくなかったので
Docker コンテナ上で叩けるような Dockerfile を作成しました。

# 環境
Mac
Docker version 18.09.2, build 6247962
docker-compose version 1.23.2, build 1110ad01

# 作成した Dockerfile 



```dockerfile
FROM python:3.7-alpine
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY

ENV NODE_PATH /usr/lib/node_modules/
# install nodejs
RUN apk update \
  && apk add --no-cache nodejs npm

# install aws-cli
RUN pip install awscli

# install serverless framework
RUN npm install -g serverless serverless-plugin-existing-s3

# set aws key 
RUN sls config credentials --provider aws --key $AWS_ACCESS_KEY_ID --secret $AWS_SECRET_ACCESS_KEY

# change work directory
RUN mkdir -p /app
WORKDIR /app

```

# 作成した docker-compose ファイル
```yml
version: '3.5'
services:
  serverless:
    build: 
      context: .
      dockerfile: ./dockerfiles/serverless/Dockerfile
      args: 
        - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
        - AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    tty: true
    stdin_open: true
    image: serverless
    working_dir: /app
    volumes:
      - .:/app
    container_name: serverless
```

# 解説

## Docerfile の設定

まず Dockerfile について解説します

***コンテナの設定***

```dockerfile
FROM python:3.7-alpine
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY

ENV NODE_PATH /usr/lib/node_modules/
```

aws cli をインストールするために alpine linux の python をインストールします。
OS は何でもいいのですが alpine linux は容量が少ないのでよく採用させてもらってます。
ちなみに python:3.7-alpine は 87MB でした。

次に docker-compose から渡された AWS のアクセスキーとシークレットキーを読み込ませます。
こちらはサーバレスフレームワークを利用する上で必要になります。
最後に `NODE_PATH` の環境変数を設定します。 `NODE_PATH` は npm のグローバルインストールを行うための
`node_module` フォルダパスを指定します。


***パッケージのインストール***

```dockerfile
# install nodejs
RUN apk update \
  && apk add --no-cache nodejs npm

# install aws-cli
RUN pip install awscli

# install serverless framework
RUN npm install -g serverless serverless-plugin-existing-s3
```
次にパッケージのインストールです。
`RUN` コマンドを利用して alpine-linux の `apk` コマンドを叩きます。
サーバレスフレームワークは npm で管理されているので `npm` と `nodejs` をインストールします。
また、裏で AWS CLI コマンドが動くので awscli を `pip` コマンドでインストールしています。
`npm install` コマンドでグローバルに serverless フレームワークと関連するプラグインをインストールしています。
作成済みの S3 バケットに対して後から lambda イベントを付与したかったので `serveless-plugin-existing-s3`
プラグインも入れてます。

https://github.com/matt-filion/serverless-external-s3-event


***sls コマンドの実行***

```dockerfile
# set aws key 
RUN sls config credentials --provider aws --key $AWS_ACCESS_KEY_ID --secret $AWS_SECRET_ACCESS_KEY

# change work directory
RUN mkdir -p /app
WORKDIR /app
```

最後に sls コマンドを実行して アクセスキーとシークレットキーの設定を実行しています。

## docker-compose の設定

```yml
version: '3.5'
services:
  serverless:
    build: 
      context: .
      dockerfile: ./dockerfiles/serverless/Dockerfile
      args: 
        - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
        - AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    tty: true
    stdin_open: true
    image: serverless
    working_dir: /app
    volumes:
      - .:/app
    container_name: serverless
```

docker-compose は特に複雑なことはせず Mac のローカルに設定されている環境変数を `args` で Dockerfile に渡してあげています。 
dockerfile は先程作成した dockerfile のパスを指定します。
作成した serverless.yml ファイルをコンテナ側でも参照できないと行けないので volume をマウントしてあげましょう。

解説した dockerfile と docker-compose のファイルは github においています。
ご自由にお使いください。

https://github.com/syoimin/serverless-cfn