その他
    ホーム 技術発信 DoRuby pyenv + pyenv-virtualenv + Serverless Framework で AWS Lambda 向け開発環境を作る
    pyenv + pyenv-virtualenv + Serverless Framework で AWS Lambda 向け開発環境を作る
     

    pyenv + pyenv-virtualenv + Serverless Framework で AWS Lambda 向け開発環境を作る

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    先日の記事のとおり、Serverless Frmework で Python3.6 の環境を作成するのにちょっとハマったということを書きましたが、やっぱり pyenv が便利なので pyenv の場合の環境構築手順をまとめてみました。

    環境

    • OS: CentOS Linux release 7.3.1611 (Core)
    • Serverless Frameowrk 1.14.0

    あらかじめ Serverless Framework はインストールされている前提です。
    インストールされていない場合は、以下のページなどを参考にインストールして下さい。

    pyenv と pyenv-virtualenv をインストール

    Pythonの環境を複数用意する方法として、 pyenv + pyenv-virtualenv で行う方法と、virtualenv(venv) で行う方法があり、デファクトスタンダードは virtualenv(venv) のようですが、
    コマンドのインターフェースが rbenv に似てて個人的に使いやすい点、python-build によって気軽に複数バージョンをインストールできる点から pyenv を使う方法を選択しました。

    pyenv

    以下のように pyenv をインストールします。

    # Github から clone 
    $ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
    
    # .bash_profile に環境変数等の設定を追加しておく
    $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
    $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
    

    シェルを再起動した後、試しに現在利用中の Python のバージョンを確認してみると

    $ pyenv versions
    system (set by /home/vagrant/.pyenv/version)
    
    $ python --version
    Python 2.7.5
    

    system にインストールされている Python 2.7.5 が利用中ということがわかります。

    pyenv-virtualenv

    続いて pyenv-virtualenv をインストールします。

    # Githubから ~/.pyenv/plugins 配下に clone
    $ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
    
    
    # プロンプトへのバージョン表示を無効化(個人的にうざいので止める)
    $ echo 'export PYENV_VIRTUALENV_DISABLE_PROMPT=1' >> ~/.bash_profile
    # .python-version ファイルによる自動的な環境切り替えを有効化するために以下を実行
    $ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
    

    シェルを再起動して、インストール結果を確認

    $ pyenv virtualenv --version
    pyenv-virtualenv 1.0.0 (virtualenv unknown)
    

    上記のようにバージョンが表示されてたらインストール完了。

    pyenvでpython3.xをインストール

    Lambda の実行環境として Python3.6 を使いたいので、pyenv でインストールします。

    まずインストール可能なバージョンの一覧を確認

    $ pyenv install --list
    

    一覧から、現時点の最新のリリースと思われる 3.6.1 が見つかったので、以下のようにインストール

    $ pyenv install 3.6.1
    

    インストールが完了したら、以下のコマンドでインストールされているバージョンを確認

    $ pyenv versions
    * system (set by /home/vagrant/.pyenv/version)
      3.6.1
    

    このように 3.6.1 がインストールされていることがわかります。

    pyenv-virtualenv で環境作成

    # 一旦、 shell で利用する python のバージョンを 3.6.1 に切り替え
    $ pyenv shell 3.6.1
    

    pyenv-virtualenv では Python3系に標準添付の venv モジュールがあればそれが利用されますが、それ以下のバージョンでは virtualenv パッケージが別途インストールされている前提で動作するような挙動となっているようです。
    もし、ここでバージョンを切り替えずに system 環境に virtualenv パッケージがインストールされていない場合、 pyenv-virtualenv の実行中ににエラーとなります。

    # 3.6.1 に python3.6 という名前で環境を作成
    $ pyenv virtualenv --python ~/.pyenv/versions/3.6.1/bin/python3.6 python3.6
    

    –python ~/.pyenv/versions/3.6.1/bin/python3.6 の箇所が重要。
    これが無いと、仮想環境の bin ディレクトリに python3.6 コマンドが無いため、前回の記事のようなエラーとなります。

    プロジェクトディレクトリで利用するバージョンを指定

    プロジェクトのディレクトリに移動して、利用するバージョン(環境名)を指定します。

    $ cd path/to/project
    $ pyenv local python3.6
    

    ここで指定する python3.6 は前述の pyenv virtualenv コマンドで指定した環境名です。

    上記コマンドの結果、カレントディレクトリに.python-version が出来て、このディレクトリ配下で利用するバージョン(環境名)が保存されます。

    試しに現在のバージョンを確認します

    $ pyenv version
    python3.6 (set by /home/vagrant/path/to/project/.python-version)
    
    # 念のため python3.6 コマンドにPATHが通っていることも確認
    $ type python3.6
    python3.6 は /home/vagrant/.pyenv/shims/python3.6 です
    

    必要なパッケージをインストール

    環境ができたのでこの中に必要なパッケージをインストールしていきます。
    今回、Lambdaへデプロイする前提のため、boto3をインストールします。

    $ pip install boto3
    

    以上で、Serverless Framework を使うための環境が用意できました。

    試しに Python3.6 向けの Lambda 関数をローカルで実行してみる

    以下のようにテスト用のサービスを作ります。

    $ sls create --template aws-python3 --path hello36
    $ cd hello36
    

    handler.py を以下のように変更

    import sys
    import json
    
    def hello(event, context):
        return {
            "message": "Go Serverless v1.0! Your function executed with %s" % sys.executable ,
            "event": event
        }
    

    ローカルでこの Lambda 関数を実行してみます。

    $ sls invoke local -f hello
    {
        "message": "Go Serverless v1.0! Your function executed with /home/vagrant/.pyenv/versions/3.6.1/envs/python3.6/bin/python3.6",
        "event": {}
    }
    

    無事、ローカル環境でも Python3.6 上で Lambda関数が実行できるようになりました。

    実際、この Lambda 関数を AWS 上にデプロイして実行するためには serverless.yml をいろいろ設定する必要がありますが、その点についてはこの記事では触れません。

    詳しくは Serverless Framework – AWS Lambda Guide などを参考にしてください。

    さいごに

    自分自身、まだ python の環境構築系のツールの使い方に慣れていないので、もっと良いやり方があれば指摘もらえると幸いです。

    最後に、環境を構築するにあたって参考としたサイトを記載しておきます。