【小ネタ】Lambda Layersのパッケージ作成に便利!!pipenvでsync対象ディレクトリを指定する方法

CX事業本部@大阪の岩田です。

Lambda Layers用のパッケージを作成する際にpipenv syncでライブラリをインストールする対象のディレクトリを指定したかったのですが、それらしきオプションが見つからず色々と試行錯誤していました。最終的にpipの環境変数を使うことでうまく制御できたので手順をご紹介します。

pipenvでsync対象ディレクトリを指定する方法

まず結論から

PIP_TARGET="<targetdir>" pipenv sync

これで<targetdir>ディレクトリ配下にPipfile.lockで定義されたライブラリがインストールできます。 あとはZIPに固めてアップロードすれば必要なライブラリが導入されたLambda Layerの完成です!

ググるとpipenv lock -r | pip install -r /dev/stdin -t <targetdir>でイケるぜ!!みたいな記事がいくつかヒットしたのですが、これだと都度都度Pipfile.lockの更新が走ってしまうので、導入対象ライブラリが依存しているライブラリが開発環境とは異なるバージョンでインストールされるというリスクが残ります。 開発環境で仮想環境をアクティベートしてpipenv run pip freeze| pip install -r /dev/stdin -t <targetdir>を実行するのもアリですが、これだと余計なdevパッケージまでインストールされてしまいます。

pipの環境変数について

pipのUser Guideに記載があるのですが、pipのコマンドラインオプションは環境変数から指定することが可能です。設定すべき環境変数はpipのコマンドラインのロングオプションを

  1. 大文字に変換する
  2. -_に変換する
  3. 先頭にPIP_をつける

というルールで変換したものです。

pip’s command line options can be set with environment variables using the format `PIP_` . Dashes (`-`) have to be replaced with underscores (`_`).

pip 19.2.3 documentation

例えばPIP_TARGET=<targetdir> pip installというコマンドはpip install --target <targetdir>と同様の挙動となります。pipenv syncは内部的にpip installを実行するためPIP_TARGET=<targetdir> pipenv syncというコマンドはpipenv install --requirement <Pipfile.lockで定義されたライブラリ達> --target <targetdir>を実行することになり、Pipfile.lockで定義されたライブラリを指定したディレクトリにインストールすることが可能です。

まとめ

これで開発環境と同一バージョンのライブラリでLayerが作成可能です。 開発環境とLambda実行環境でライブラリのバージョンが違ってバグを踏んだ...なんてことがないように有効活用していきましょう