LoginSignup
8

More than 5 years have passed since last update.

AWS LambdaでPythonのweb3.pyライブラリを使用する

Last updated at Posted at 2018-03-16

AWSのLambdaでWeb3.py (Pythonのweb3ライブラリ)を使用しようとして動かない場合があります。

スクリーンショット 2018-03-16 19.50.22.png

Unable to import module 'handler': No module named '_pysha3'

上記のようなエラー。
どうやらPythonのビルドオプションに依存した問題の模様です。

私はMacで資材を作成した際に再現しました。

結論

Amazon Linux環境で資材を作成すれば問題なく動作します。
このエントリではその資材の構築手順を記載します。
環境構築が面倒な方は↓のDockerfileにまとめてありますのでご利用ください。
- https://github.com/sot528/lambda-web3py

環境

Docker for Mac: Version 17.12.0-ce-mac55 (23011) d62ef8d1b0
Dockerイメージ・amazonlinux: 3faa54d46dec

Amazon Linuxのコンテナイメージを取得

docker pull amazonlinux

:warning: 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にデプロイすれば問題なく動作します。

スクリーンショット 2018-03-16 19.31.57.png

備考: コンソールから動作確認する手順

以下、要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)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8