Box-SDK(*1)をLambdaで使おうとした際に色々ハマったのでメモ。
pipインストール時のプラットフォーム
ローカル環境(Mac)でテストができたので、いざデプロイ!
Serverless Frameworkは早速Layerに対応していたので、SDK部分をLayerに切り出しも簡単:)
ところが。。。
[ERROR] ModuleNotFoundError: No module named '_cffi_backend'
モジュールがないと言われる。
sdkのリポジトリ眺めてみると、環境依存がちらほら見つかる。
MacとLambda環境の差異と見受けられる。
ググるとEC2でビルドする手順が多く引っかかったが、今はLambdaのDockerイメージ(*2)が公開されているので、そっちを使う。
docker内での圧縮コマンド
Lambdaのdockerイメージの使い方についてもググると結構見つかった。
その中から、以下のDockerファイルを作ってビルド&デプロイ!
FROM lambci/lambda:build-python3.6
ENV AWS_DEFAULT_REGION us-east-1
ADD . .
CMD pip3 install -r requirements.txt -t /var/task && \
zip -9 deploy_package.zip lambda_function.py && \
zip -r9 deploy_package.zip *
また実行エラー。。。
lambda libffi-d78936b1.so.6.0.4: cannot open shared object file: No such file or directory: ImportError
ググってみると、情報 (*3)が見つかった。
"*" でなく、"."を使えとのこと。
よくみると、本家サイト(*2)のサンプルも、"."になっていた。本家サイトの熟読は急がば回れ。
最終行の"*" を"."に変更して再ビルド&デプロイ!
成功 :)
ついでにDockerHubにアップしておいた。
https://hub.docker.com/r/pict3/aws-lambda-builder
以下のファイルを用意して、
- lambda_function.py
- Lambdaコード
- requirements.txt
- pipインストール対象
その後、以下のコマンドを叩けばパッケージが生成される。
$ docker run -v "$PWD":/var/task pict3/aws-lambda-builder
参考)
(*1) https://github.com/box/box-python-sdk
(*2) https://github.com/lambci/docker-lambda
(*3) https://github.com/snowflakedb/examples/issues/4