Help us understand the problem. What is going on with this article?

MeCabをAWSのLambdaで使う

あらすじ

仕事で形態素解析エンジンMeCabAWS Lambdaで動かさなくてはならなくなった。

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

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

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

そんな中、AmazonLinuxのイメージを発見した。このイメージを元にしたコンテナ内でMeCabをビルドしたところうまくいった。

コンテナのファイルとか

Dockerfileとその他ファイルは以下の通り。このコンテナの中でMeCabをビルドする。

同時にPythonからMeCabを呼び出すためのライブラリもビルドしてる。必要に応じてNode.jsなど他の言語のランタイムとライブラリにしてほしい。

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
# 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
# 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

使い方

コンテナの中の/var/taskにPythonでMeCabを使用するためのライブラリが含まれている。
Dockerhubにイメージを置いたので煮るなり焼くなりしてほしい。

このイメージはPythonでMeCabを使用するためのライブラリも含んでいるが、必要に応じてNode.js等他のランタイム向けのライブラリを使うこともできる。
ただし、その場合はLambdaのランタイムにどのOSが使用されているのかよく確認すること。
AWS Lambda ランタイム

学んだこと

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away