最近、AWS Lambdaをよく使っているが、その機能の一つとしてLambdaレイヤーがある。レイヤーにパッケージを取り込むことで、複数のLambda関数から使用可能になる。ビジネスロジックを共通化する、ビルドの手間を省く等の恩恵があるが、私的にはデプロイするファイルのサイズを小さくするのに重宝している。Lambdaの制限は結構きつくて、デプロイするファイルのサイズが大きくなり、デプロイに失敗するということが起きる。
Lambdaレイヤーにパッケージを取り込むには、パッケージをzip化してアップロードすればいいのだが、それがまた面倒くさい。pip
でディレクトリを指定してパッケージをインストールし、zip
コマンドで圧縮した後S3にアップロードし、Lambdaコンソールから取り込む。また、単にどこでもいいからパッケージをインストールすればいいというわけでもなく、Lambdaの実行環境に合わせた環境でビルドしてやらないと実行に失敗する。手動でやるのは実に面倒くさい。
そういうわけで、一連の作業を一つのシェルスクリプトにしてみた。以下のスクリプトでは、Docker Lambdaを使ってパッケージをインストールし、それをzip化した後、Lambdaレイヤーにアップロードしている。不要なパッケージを除去してパッケージのサイズを小さくするような機能はないが、面倒くさいことをせずに、とにかくパッケージをアップロードしたいときに使える。
以下のようにオプションを指定して実行するようになっている。n
にはパッケージ名、r
にはリージョン名、p
にはPythonのランタイムを指定する。
sh publish_lambda_layer.sh -n spacy -r us-east-1 -p python3.7