Lambda for Pythonのデプロイ環境によって生じる問題
特にC拡張の使われているライブラリを使用する際に多いのですが、ビルド時のオプションの違いによって問題がエラーが起きることがあります。
特に文字コードですね・・・観測した範囲ではCircleCIの環境がUCS2
を使用しており、Lambda(Amazon Linux)の標準ではUCS4
を使用しているためエラーになることがあります。
他にも色々試行錯誤している時だったのでどんなエラーだったかは覚えていないですが、手元のUbuntu環境にpyenv
で入れたPythonで動いたコードがLambda上で動かなかった経験があります。
問題を解消する方法
Amazon Linuxを使う
まず、Amazon Linux上のvirtualenvで独立させた環境にpypiライブラリ等をインストールし、デプロイするという方法があります。一番分かりやすくて確実です。ですが、そのためだけに一台EC2を立てておくのも勿体無いですし、Jenkins等を使うことになるでしょうが、運用も面倒です。
Amazon Linuxと同じオプションでPythonをビルドする
これならどこでも使えます。ですが、既存の環境を汚さないように配慮する等考えると面倒ですし、CI as a Serviceなんかだと毎回捨てられてしまうのでデプロイの度にビルドするのも時間がかかります。Dockerイメージ持ち込み可能なサービスを使ってイメージに焼くという手もありますが、ちょっと大袈裟な感じがします。
Amazon Linuxと同じオプションでビルド済みのPythonを含むパッケージをインストールする
これが、今回の本命です。Amazon Linuxと同じオプションでビルドされ、独立したPythonランタイムを提供するrpm
, deb
等があれば手軽で手早く、かつ安全に使用することができます。
ということで、はい。作りました。
http://qiita.com/marcy-terui/items/9b3610bed4e5fcafd9b9
一部システムグローバルなライブラリなどに依存できないために外したオプションなどもありますが、普段使わないものばかりだったので問題ないはずです。
インストール方法
yum
①リポジトリを追加
echo "
[bintraybintray-willyworks-rpm]
name=bintray-willyworks-rpm
baseurl=https://dl.bintray.com/willyworks/rpm/centos/\$releaserver/\$basearch/
gpgcheck=0
enabled=1
" | sudo tee -a /etc/yum.repos.d/bintray-willyworks-rpm.repo
②インストール
sudo yum install lamvery
apt
①リポジトリを追加
echo "deb https://dl.bintray.com/willyworks/deb trusty main" | sudo tee -a /etc/apt/sources.list
②インストール
sudo apt-get update
sudo apt-get install install lamvery
使用方法
/opt/lamvery/bin
配下に以下の実行バイナリ(スクリプト)がありますので、必要に応じてPATHを通すなどしてお使いください。
- Python 2.7.9 (2016.03.18現在)
- pip
- virtualenv
- lamvery
参考までにCircleCIで使用する場合の記述例はこちら。
---
machine:
environment:
PATH: /opt/lamvery/bin:$PATH
dependencies:
pre:
- |
echo "deb https://dl.bintray.com/willyworks/deb trusty main" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install lamvery
最後に
virtualenv
内でlamvery
を使用すると、とても簡単にLambda for Pythonのfunctionがデプロイできます。
興味があればこちらも参照してみてください。もちろんPythonだけ使うために使ってもOKです。
AWS Lambda向けデプロイ・管理ツール「Lamvery」について
http://qiita.com/marcy-terui/items/1617ab4e20e3339d1930
CircleCI + LamveryによるLambda functionのdeployベストプラクティス
http://qiita.com/marcy-terui/items/900b72efb38f9b26e8f0
以上、ステマでした。