MacでDockerとAmazon Linuxコンテナを使ってAWS Lambda (Node.js-v4.3.2)にデプロイしてみた。


# はじめに

AWS LambdaをMacから直接デプロイすることは元々可能でしたが、
ネイティブライブラリをEC2を利用してデプロイしていましたが、
Amazon Linuxのコンテナイメージが公開されたのでMac上でDockerを利用し、
AWS Lambdaの実行環境に近い環境を構築し、デプロイすることが可能になりました。

今回はNode.js用の環境を作ってみました。

## 検証バージョン
* Mac OS X El Capitan(10.11.6)
* Docker 1.12.3
* Node.js 4.3.2
* npm
	* aws-sdk 2.6.3

# Docker

HomebrewとCaskを利用している場合は下記のコマンドでインストールできます。

```bash
$ brew cask install docker
```

Dockerの公式サイトでdmgが公開されているのでお好きな方でインストールできます。
https://www.docker.com/products/docker#/mac

インストール後、LaunchpadにDockerが追加されているので起動してください。
ステータスバーにクジラのアイコンが追加され"Docker is running"となっていれば成功です。

コンソール上でもdockerコマンドが利用できるか確認します。

```bash
$ docker -v
Docker version 1.12.3, build 6b644ec
```

# Amazon Linuxイメージの入手

AWS CLIから入手する方法もありますが、DockerHubにも公開されたので今回はそちらから取得します。
また、本来であれば2016.03.3がLambda実行環境ですが、Dockerイメージは2016.09以降しか公開されていないのでそちらを利用します。

```bash
$ docker pull amazonlinux:2016.09
2016.09: Pulling from library/amazonlinux

8e3fa21c4cc4: Pull complete
Digest: sha256:f1d4ae3f7261a72e98c6ebefe9985cf10a0ea5bd762585a43e0700ed99863807
Status: Downloaded newer image for amazonlinux:2016.09
```

イメージの確認

```bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
amazonlinux         2016.09             5b52b314511a        4 days ago          292.3 MB
```

# AWS Lambdaに近い環境を構築

Amazon Linuxイメージをbash実行

```bash
$ docker run -i -t amazonlinux:2016.09 /bin/bash
bash-4.2#
```

ここからはAmazon Linux上で作業します。

Amazon Linuxのバージョンを確認しましょう。

```bash
bash-4.2# cat /etc/system-release
Amazon Linux AMI release 2016.09
```


yumでパッケージを最新に更新し、必要なライブラリをインストールします。

```bash
bash-4.2# yum update -y
bash-4.2# yum install gcc44 gcc-c++ libgcc44 cmake wget git aws-cli -y
```

node.jsをインストール

```bash
bash-4.2# wget http://nodejs.org/dist/v4.3.2/node-v4.3.2.tar.gz
bash-4.2# tar zxfv node-v4.3.2.tar.gz
bash-4.2# cd node-v4.3.2
bash-4.2# ./configure
bash-4.2# make
bash-4.2# make install
```

npmを更新

```bash
bash-4.2# npm -g install npm@v4.0.2
```

npmのaws-sdkをインストール

```bash
bash-4.2# npm -g install aws-sdk@2.6.3
```

# デプロイ

この記事ではnode-aws-lambdaを利用してgulpでデプロイしています。
お好きな方法でデプロイしてください。

デプロイやIAMの設定などは[AWS LambdaファンクションをGulpでデプロイ](http://dev.classmethod.jp/cloud/aws/how-to-deploy-a-lambda-function-with-gulp/)、[CircleCIからAWS Lambdaファンクションをデプロイしてみた](http://qiita.com/tomiyan/items/febd1508584c584388ae)を参考にしてください。


Lambdaデプロイ用にAPIキーをcredentialsに指定します。

```bash
bash-4.2# aws configure
AWS Access Key ID [None]: ABCD******************
AWS Secret Access Key [None]: 12*******************
Default region name [None]:
Default output format [None]:
```

Lambdaにデプロイしたいgitをcloneします。

```bash
bash-4.2# mkdir /app
bash-4.2# cd /app
bash-4.2# git clone https://github.com/tomiyan/lambda-sqlite3-sample.git
bash-4.2# cd /app/lambda-sqlite3-sample
```

IAM Roleは.envにしてあるので.envファイルを作成します。

```:/app/lambda-sqlite3-sample/.env
ROLE=arn:aws:iam::1234***********:role/sampleLambdaExecureRole
```

npmの依存パッケージを取得し、デプロイします。

```bash
bash-4.2# npm i -S
bash-4.2# npm run deploy
```

# おまけ

ここまでの手順をDockerfileにまとめてみました。

https://github.com/tomiyan/docker-lambda-deploy-sample

# 参考資料
* [Amazon Linuxがコンテナ化されたので、Macで動かしてみた。](http://qiita.com/taishin/items/1305d4f97ffe08e24bb0)
* [Dockerを使用したAmazonLinuxの開発環境作成](http://qiita.com/mogetarou/items/e1cb3d33fbaca5ae65ed)
* [Mac OS X へのDockerのインストール方法](http://qiita.com/hshimo/items/e24b1fbfbf775ec7c941)
* [docker コマンド チートシート](http://qiita.com/voluntas/items/68c1fd04dd3d507d4083)
* [Amazon Linuxコンテナイメージは AWS Lambda ネイティブライブラリ(.so)問題を解決するし財布にも優しい](http://qiita.com/imura81gt/items/a14389937315ec73140b)
* [AWS Lambda (Node.js-v4.3.2)の実行環境に近いEC2環境の構築](http://qiita.com/ikeisuke/items/b32e0ae51a188075ed17)
* [効率的に安全な Dockerfile を作るには](http://qiita.com/pottava/items/452bf80e334bc1fee69a)
* [Amazon Linuxのオフィシャルコンテナが DockerHubで公開されましたね](http://qiita.com/akym03/items/7f0b4084dbea7d7bebe9)