その他
    ホーム 技術発信 DoRuby `sls invoke local` すると`Error: spawn python3.6 ENOENT`と言われた
    `sls invoke local` すると`Error: spawn python3.6 ENOENT`と言われた
     

    `sls invoke local` すると`Error: spawn python3.6 ENOENT`と言われた

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

    Serverless Framework 使ってみてますが便利ですね。Serverless Frameworkの「売り」のひとつである「ローカル環境での Lambda関数の実行」がなぜかエラーになっていたので少し突っ込んで調べてみました。

    環境

    以下のような環境で確認しました。

    • macOS 10.10.5 (Yosemite)
    • python 3.6.1 (pyenvでインストール)
    • Serverless Framework 1.14.0
    • node 4.4.5

    原因

    serverless コマンドのソースコードを覗いてみました。
    どうやら、lib/plugins/aws/invokeLocal/index.js の ここ や ここ で process.env の 環境変数 PATH を書き換えているが、pyenvでインストールしている python3.6 にPATHが通っていないため発生している模様。

    対処

    最初、Serverless Framework側にプルリク投げる必要があるかと思ったが、いろいろ見たら、pyenv はいらないという結論になったのでpyenvをアンインストール。

    あらためて pytho3.6 をインストール

    $ brew install python3
    

    boto3 も入れ直す

    $ pip3 install boto3
    

    以上で正常に動作するようになった。

    さいごに

    最近、rbenv で Ruby 環境を構築するのに慣れてて、同じ感覚で Python 環境も構築してましたが、ちょっと勝手が違ったようです。

    今回は、Python 2.x 系と 3.x 系を共存させたいという要件はなかったため、Python 3.6 をそのままインストールしてしまいましたが、共存させる場合は前述の Qiita の記事にあるように virtualenv(venv) 使うのが良さそうです。

    2017/6/4 追記

    この記事では pyenv をやめて直接 Python3.6 をインストールしたという結果になりましたが、後日調査して pyenv でも Python3系でのローカル実行できる環境が作成できることがわかりました。
    以下の記事をご覧ください。