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

元記事はこちら

AWS Lambdaビルダー