MeCabをAWSのLambdaで使う

# あらすじ
仕事で形態素解析エンジン**MeCab**を**AWS Lambda**で動かさなくてはならなくなった。

ローカルのPythonのコードからMeCabを動かせたので、Windows Subsystem for Linux(WSL)でMeCabと辞書をビルドしてコードと一緒にZipにしたところ、エラーが多発してまったく使えなかった。

色々なサイトを見て解決策を探したところ、Lambdaに搭載するバイナリファイルはLambdaのランタイムと全く同一の環境でビルドしなければならないことが判明。

LambdaのPython3.7ランタイム環境のOSは**AmazonLinux**である。他の記事にある通り、AmazonLinuxのEC2上でビルドすればよいのだが、いちいちEC2を立ち上げるのはどうなのかと感じた。

そんな中、[AmazonLinux](https://hub.docker.com/_/amazonlinux)のイメージを発見した。このイメージを元にしたコンテナ内でMeCabをビルドしたところうまくいった。

# コンテナのファイルとか
Dockerfileとその他ファイルは以下の通り。このコンテナの中でMeCabをビルドする。  
同時にPythonからMeCabを呼び出すためのライブラリもビルドしてる。必要に応じてNode.jsなど他の言語のランタイムとライブラリにしてほしい。

```Dockerfile:Dockerfile
FROM amazonlinux:1

ADD ./config/.bash_profile /root/
ADD ./config/.bashrc /root/

RUN yum -y update && yum install -y sudo \
&& sudo yum install -y gcc gcc-c++ make git openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel \
&& sudo git clone https://github.com/yyuu/pyenv.git /usr/bin/.pyenv \
&& cd /usr/bin/.pyenv \
&& sudo mkdir shims versions \
&& sudo yum -y install libffi-devel \
&& source ~/.bashrc \
&& sudo plugins/python-build/install.sh \
&& /usr/bin/.pyenv/bin/pyenv install 3.7.1 \
&& pyenv local 3.7.1 \
&& pyenv global system 3.7.1 \
&& pip install -U pip \
&& source ~/.bash_profile \
&& sudo mkdir /var/task \
&& sudo ln -s /usr/libexec/gcc/x86_64-amazon-linux/4.8.5/cc1plus /usr/local/bin/ \
&& cd ~ \
&& curl -L "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE" -o mecab-0.996.tar.gz \
&& tar -zxvf mecab-0.996.tar.gz \
&& cd mecab-0.996 \
&& sudo ./configure --prefix=/var/task --with-charset=utf8 \
&& sudo make && sudo make install \
&& cd ~ \
&& curl -L "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM" -o mecab-ipadic-2.7.0-20070801.tar.gz \
&& tar -zxvf mecab-ipadic-2.7.0-20070801.tar.gz \
&& cd mecab-ipadic-2.7.0-20070801 \
&& sudo ./configure --prefix=/var/task --with-charset=utf8 --with-mecab-config=/var/task/bin/mecab-config \
&& sudo make && sudo make install \
&& cd ~ && mkdir temp && cd temp \
&& pip install mecab-python3 -t . \
&& mv ./* /var/task \
&& mkdir /var/task/dic
```
```bashrc:.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
# User specific aliases and functions
export PYENV_ROOT="/usr/bin/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
```
```bash_profile:.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
alias python=python3.7
alias pip=pip3
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/var/task/lib
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/.pyenv/shims:/var/task/bin
export PATH
export LD_LIBRARY_PATH
```
# 使い方
**コンテナの中の**<u>**/var/task**</u>にPythonでMeCabを使用するためのライブラリが含まれている。
[Dockerhub](https://hub.docker.com/r/corn0214/mecab_for_lambda)にイメージを置いたので煮るなり焼くなりしてほしい。  
このイメージはPythonでMeCabを使用するためのライブラリも含んでいるが、必要に応じてNode.js等他のランタイム向けのライブラリを使うこともできる。
ただし、その場合はLambdaのランタイムにどのOSが使用されているのかよく確認すること。
[AWS Lambda ランタイム](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html)

# 学んだこと
* Lambdaは便利な反面、制約が多くEC2やコンテナを置き換える選択肢ではない  
→サーバレスが重要なトレンドになっているが、従来のサーバ関連の知識も変わらず必要である

# 参考
* [AWS Lambda でMeCabを動かす (2018年9月時点）](https://qiita.com/rtaguchi/items/e6cb594196fa8186e9a2)