LoginSignup
5
7

More than 5 years have passed since last update.

Amazon Linuxと同じオプションでビルドされたPythonを使って安全にLambda functionをデプロイしよう

Last updated at Posted at 2016-03-18

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で使用する場合の記述例はこちら。

circle.yml
---
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

以上、ステマでした。

5
7
0

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