Lambda(Python) を実行すると "Unable to import module '...': No module named ..."

事象

  • Lambda(Python) のコードと外部ライブラリを zip に圧縮し、AWSマネジメントコンソールからアップロードして実行すると、"Unable to import module" エラーが発生する
Unable to import module '...': No module named ...

原因

ディレクトリではなく、ディレクトリの中身を圧縮します。ZIP ファイルの内容は、Lambda 関数の現在の作業ディレクトリとして利用できます (例: /project-dir/codefile.py/lib/yourlibraries)。

デプロイパッケージの作成 (Python) - AWS Lambda

対策

ディレクトリの中身を圧縮する。
f:id:cloudmemo:20161217100822p:plain
コマンドラインでは以下の通り。

$ ls
lambda_sample
$ zip -r lambda_sample lambda_sample
$ cd lambda_sample
$ zip -r ../lambda_sample .

補足

$ zip -r lambda_sample_dir lambda_sample
$ unzip lambda_sample_dir.zip 
Archive:  lambda_sample_dir.zip
   creating: lambda_sample/ ★展開時にサブディレクトリができる
   creating: lambda_sample/beautifulsoup4-4.5.1.dist-info/
  • ディレクトリを圧縮すると展開時にディレクトリが作成され、Lambda > Functions > ファンクション名 > Configuration > Handler とマッチしない。

f:id:cloudmemo:20161217105648p:plain

f:id:cloudmemo:20161217105656p:plain