Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
15
Help us understand the problem. What is going on with this article?
@menmenshod

【AWS・Lambda】Python外部ライブラリ読み込み方法

概要

 AWS lambdaでは初期状態でpandasやnumpyなどの外部ライブラリを読み込むことはできません.読み込ませる方法は二つあって,一つ目はインストール済みのライブラリと実行ファイルをまるっとzipファイルにまとめてlambdaにアップロードする方法,二つ目はlambdaでLayerとして読み込ませる方法です.後者の方法がおすすめですが,本記事ではこれらの方法をコード管理の面と合わせてTipsとしてまとめました.

環境

MacOS Catalina
docker 導入済み
AWS CLI 導入済み

はじめに

 lambda開発をブラウザ上で行うのはコード管理の面でよろしくないのでローカルで開発できるようにします.つまりgitHub管理できるようにローカルで作業を行いコードの変更を随時lambdaにアップロードするという形を取ります.
 ということでdocker-lambdaを使用してデプロイ環境つくりました.(使用する場合はcloneしてください)
https://github.com/shoda888/local2lambda

まずdockerイメージが必要なので作ります.(初回のみ)
$ docker build -t shoda888/local2pylambda .

その後,予め作ってあるlambda関数名をdeploy.shのfuncname変数に与えてを以下を実行すれば自動でアップロードが行われます.
$ sh deploy.sh

lambda_function.pyを書き換えて再度deploy.shして変更されているか確認してください.

ライブラリをzipファイルにまとめてlambdaにアップロードする方法

 requirements.txtにライブラリ名を与えてdeploy.shするだけです(pandas, numpy, requests など).作業ディレクトリ内にライブラリディレクトリが大量に生成されます.Pandasだと重すぎてアップロードに5分ほどかかってしまいます.lambda上で確認してみるとアップロード成功してますが,警告が出ます.

Lambda 関数「*******」のデプロイパッケージが大きすぎて、インラインコード編集を有効にできません。ただし、関数を呼び出すことはできます。

スクリーンショット 2019-12-07 15.27.14.png

一応これでも関数の呼び出しはできるようです.

ライブラリをLayerにまとめる方法

 毎回ライブラリをzip化してアップロードするのがだるいので,requirements.txtは空にしておくのがお勧めです.ライブラリをLayerにまとめれば使い回し可能で便利かと思います.(ただし将来的にライブラリのバージョン管理がめんどくさいかもしれません)
 ライブラリをLayerにまとめる方法を確認しましょう.

Pure Pythonなライブラリの場合

 純Pythonなライブラリの場合,たとえば画像のようにPython100%で構成されているライブラリはEC2でAmazonLinuxやubuntu環境を用意しなくてもお手持ちのMacでlayer用のzipファイルを簡単に作れます.
 purepython.png

例としてask_sdk_coreをインストールしたい場合, これだけです.(python3.7の例)

$ mkdir -p build/python/lib/python3.7/site-packages
$ pip3 install ask_sdk_core -t build/python/lib/python3.7/site-packages/
$ cd build
$ zip -r ask_sdk.zip .

生成されたask_sdk.zipをlayerに追加し,lambda内でlayerを適応させればライブラリが読み込まれます.
スクリーンショット 2019-12-07 17.22.29.png
layer.png

PureじゃないPythonのライブラリの場合

 numpyやpandasなどがそれにあたります.EC2でAmazonLinux環境を作りzip化するのが良いみたいです.(以前Layerをubuntuで作った気がしましたが,ubuntuでも可??)

これに関しては既に多くの方がやられているので他の方の記事がとても参考になります.
pandasをLambdaのLayerとして追加する
AWS Lambda Layersでライブラリを共通化

以下はyoutubeですがubuntuを使用してLayerを作られてます.(わかりやすい)
AWS Lambda Layers for Pandas library

まとめ

 ローカルでコード管理しながらLambda開発が行えるようにした上で,外部ライブラリの読み込み方法をTipsとしてまとめました.

15
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
menmenshod
スマホが無い世界にしたい

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
15
Help us understand the problem. What is going on with this article?