Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@marcy-terui

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

More than 5 years have passed since last update.

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

以上、ステマでした。

7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
marcy-terui
Cloud Architect / Developer / Infrastructure as Code / Full-time employee / Part-time freelance / #jawsug / #gcpug / アラサー / 二児の父 / 発言は個人のアレです
serverless-operations
AWSクラウド技術の豊富な知見を活かし、サーバーレスによる開発や運用の支援、コンサルティングまで行う会社です

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?