前提・実現したいこと
以下のサイトを参考にLambdaでMecabを動かしたいのですが、上手くいきません。
https://qiita.com/rtaguchi/items/e6cb594196fa8186e9a2
https://dev.classmethod.jp/cloud/aws-lambda-with-mecab/
https://github.com/KunihikoKido/docs/blob/8608849b1abfce67dbb4d97eddac50e0d85570d0/_posts/2016-02-12-aws-lambda-with-mecab-improved.md
手順としては以下の順番でMecabパッケージを作り、Lambdaにアップロードしましたが、import Mecabでエラーが起きてしまいます。
(1)Amazon SageMakerのターミナルを使って(Amazon Linux)、Mecab、IPA辞書、mecab-python-3をインストール。インストール先のフォルダは、/var/taskとしています。
フォルダ作成
sudo mkdir task cd ~ sudo ln -s /usr/libexec/gcc/x86_64-amazon-linux/4.8.5/cc1plus /usr/local/bin/
MeCabのダウンロードとビルド
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
IPA辞書のダウンロードとビルド
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
mecab-python-3のインストール
cd ~ sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm sudo yum makecache sudo yum -y install mecab-devel mkdir temp cd temp pip install mecab-python3 -t . sudo mv ./* /var/task
(2)1のパックをZipで圧縮して一旦ローカルに落とし、Pycharmで書いたlambda_function.py、settings.py、local_settings.pyとまとめて再度Zipファイルを作成。
zip /home/ec2-user/mecabpack -r var/task
ローカル環境でZip化したフォルダ構成
lambda_function.py
settings.py
local_settings.py
var
└task
taskの下
├__pycache__
├bin
├etc
├include
├lib
├libexec
├mecab_python3-0.996.1.dist-info
└share
mecabrcに記述されている内容
⇒dicdir = /var/task/lib/mecab/dic/ipadic
(3)2をS3にアップロードした上でLambda関数を作成し、S3からZipファイルを解凍・コード生成。
ランタイム:Python3.6(後はディフォルトの設定をそのまま利用)
(4)この状態でコンパイルできるかテストをしたところ、エラーが発生。import mecabで問題が起きてしまいます。
発生している問題・エラーメッセージ
START RequestId: 53a16fbc-63de-40c3-b636-08d1090f639f Version: $LATEST
Unable to import module 'lambda_function': No module named 'MeCab'
END RequestId: 53a16fbc-63de-40c3-b636-08d1090f639f
REPORT RequestId: 53a16fbc-63de-40c3-b636-08d1090f639f Duration: 0.45 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 57 MB
該当のソースコード
##lambda_function.py # coding=utf-8 import os import settings import json import logging logger = logging.getLogger(__name__) logger.setLevel(settings.LOG_LEVEL) # preload libmecab import ctypes libdir = os.path.join(os.getcwd(), './var/task/lib') libmecab = ctypes.cdll.LoadLibrary(os.path.join(libdir, 'libmecab.so')) import MeCab def lambda_handler(event, context): slack_comment = '金曜日は中華屋で台湾ラーメン&ミニチャーハン ' return {"slack_comment": slack_comment}
## settings.py import logging DEBUG = False LOG_LEVEL = logging.INFO try: from local_settings import * except ImportError: pass
## local_settings.py import logging DEBUG = True LOG_LEVEL = logging.DEBUG
試したこと
次の3つのどれかに問題があると考え、それぞれ対応を試みました。
①Mecabパッケージのフォルダ構成
フォルダ構成に問題があるのではないかと考え、/var/task以外に/var/task/mecabや/home/ec2-user/var/taskなどのパターンも作成しましたが、結果は同じでした。
②Python3のバインディング
当初はmecab-python-3のインストールでmecab-configが見つからないというエラーが起きました。仕方なくsetup.pyファイルを書き換えて対応しましたが、Groongaリポジトリを導入するとimport mecab-python-3でエラーが起きなくなりました(ただ、どちらにしてもLambdaでは動きません)。
③import mecabのサブプロセス化
lambda_function.pyでimport mecabをするのではなく、サブプロセス内(tokenizer.py)でmecabを呼び出してみましたが、結果は同じでNo module named 'MeCab'とのエラーが発生します。
呼び出し方に問題があるのか、呼ばれる方の構造に問題があるのか、全く分からなくなってしまいました。どなたか知見のある方のアドバイスをお待ちしております。
回答1件
あなたの回答
tips
プレビュー