AWSのLambdaでWeb3.py (Pythonのweb3ライブラリ)を使用しようとして動かない場合があります。
Unable to import module 'handler': No module named '_pysha3'
上記のようなエラー。
どうやらPythonのビルドオプションに依存した問題の模様です。
私はMacで資材を作成した際に再現しました。
結論
Amazon Linux環境で資材を作成すれば問題なく動作します。
このエントリではその資材の構築手順を記載します。
環境構築が面倒な方は↓のDockerfileにまとめてありますのでご利用ください。
環境
Docker for Mac: Version 17.12.0-ce-mac55 (23011) d62ef8d1b0
Dockerイメージ・amazonlinux: 3faa54d46dec
Amazon Linuxのコンテナイメージを取得
docker pull amazonlinux
Lambdaの環境は厳密には異なりますがひとまず上記のコンテナイメージで問題ありません。
コンテナで環境を構築
コンテナを起動。
docker run -it amazonlinux:latest /bin/bash
yumで必要なものを入れる。
yum install -y vi git gcc zip wget libssl-dev zlib-devel bzip2 \
bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
pipを入れる。
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pyenvを入れる。
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
以下を~/.bash_profile
に3行追記。
$ vi ~/.bash_proifile
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
反映してLambdaで使用するバージョンのPythonを入れる。
source ~/.bash_proifile
pyenv install 3.6.1
作業用ディレクトリを作成。
mkdir ~/work
cd ~/work
pyenv local 3.6.1
Lambdaにデプロイする資材を作成
ミニマムのhandlerを書く。
vi lambda_function.py
以下を書き込む。
YOUR_ETH_NODE
にはEthereumのノードのアドレスを入れる。
# -*- coding: utf-8 -*-
from web3 import Web3,HTTPProvider
def lambda_handler(event, context):
web3 = Web3(HTTPProvider('http://YOUR_ETH_NODE:8540'))
blockNumber=web3.eth.blockNumber
print(blockNumber)
return blockNumber
ライブラリを入れる。
pip install ethereum web3 -t .
資材をzipに固める。
zip -r upload.zip *
生成されたupload.zip
をlambdaにデプロイすれば問題なく動作します。
備考: コンソールから動作確認する手順
以下、要AWS設定。
dockerコンテナからファイルをローカルに持ってくる。
docker cp YOUR_CONTAINER_ID:/root/work/upload.zip /tmp
Lambda Function作成。
cd /tmp
aws lambda create-function \
--function-name web3pytest \
--runtime python3.6 \
--role arn:aws:iam::099999999999:role/somerole \
--handler lambda_function.lambda_handler \
--zip-file fileb:///path/to/upload.zip
実行。
aws lambda invoke --function-name web3pytest result.txt
成功して200が返り、result.txt
にブロックナンバーが書き込まれるはずです。
追記:
以下のようなエラーとなる場合もあります。
Unable to import module 'handler': dynamic module does not define module export function (PyInit__cpuid)