Glide で Go 言語のパッケージ管理と vendoring - Librabuch で書いた vendoring のプロセスは現状そこそこうまく回っています。

最近 AWS Lambda のコードを Python で書く機会が多いのですが、ここでも vendoring することにしました。

課題

AWS Lambda で Python の サードパーティ・パッケージを利用する場合、デプロイファイル群の中にパッケージを含める必要があります。よくサンプルでは、プロジェクト直下に pip install requests -t . などとしたのちにプロジェクトのディレクトリごと zip で固める方法が提示されます。

元々、関係無いファイルが含まれるディレクトリごとデプロイするのはあまり上品ではないなぁと思っていたので、対象物だけ明示的に指定するようにしていたのですが、依存パッケージに変化があった際にデプロイスクリプトを追従させるのも手間でした。

解決案

上述のとおり、Lambda へのアップロードにはパッケージを含める必要があるので、vendoring を行ったうえで、vendoring ディレクトリをデプロイファイル群に含めるようにします。

vendoring は以下のコマンドで実行できます。

mkdir ./vendor
pip install -U -r requirements.txt -t ./vendor
# もちろん個別指定でも OK
# pip install -U requests -t ./vendor

vendor ディレクトリを認識させるために、lambda_function.py にコードを追加します。

import os
import sys

# 以下の行を追加
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'vendor'))

import requests

デプロイファイルを以下のように生成します。

zip -r src.zip lambda_function.py vendor

できあがった src.zip を Lambda へデプロイすれば OK です。

vendoring していることで精神衛生上よろしいのと、デプロイプロセスも多少スマートになってまぁいいかなぁと思っています。