Help us understand the problem. What is going on with this article?

Lambdaでアップロードしたzipに対してハンドラーを指定する方法についての、あまりなさそうな勘違い

More than 3 years have passed since last update.

※handlerの設定方法を根本的に勘違いして半日ぐらい無駄にした感じがするので、自戒を込めて記録を残しておきます。

結論

Lambdaのハンドラの指定方法は、file-name.function-name という形式なので、

  • 間違い:path.to.module.handler
  • 正しい:path/to/module.handler

作業記録

やりたかったこと

小さいサービス向けに、Lambda関数のセットをまとめた状態でzipにしたものを関数作成時に指定したくて、

フォルダ構成

+ attakei/
  + __init__.py
  + models.py
  + handlers.py 

ファイルの中身(一部)

attakei/handlers.py
def get_articles(event, context):
    return {}

def search_by_tags(event, context):
    return {"""something"""}

のような構成にした上で、Lambda関数作成時に、attakei.handlers.get_articles のように各種ハンドラーを指定していくことで、関数をセットで管理したい。

なぜかできない

この状態でAWSのルール通りにzipを作成してS3にアップロード→上記の書式でハンドラーを指定すると、Test実行時に全く動かない。こんなログが出続ける。

Unable to import module 'attakei.handlers': No module named attakei.handlers

トライ&エラー

上の結論に至るまでに試してみたことの羅列

  • lambda-uploadを使ってアップロード ... NG
  • main.pyを用意して、main内の関数でattakei.handlers.get_articles を呼ぶようにする ... OK
  • main.pyを用意して、main内ではfrom attakei.handler import get_articlesのみ書いて、main.get_articlesをハンドラー登録する ... OK

この辺で、「なんだこれ?」と感じで ドキュメント読みに行ってハッとなって問題点解決。
ドキュメントはちゃんと読まないとダメですね

愚痴

pythonのパッケージ作る際にコンソールコマンドを定義する時って、モジュールパス:関数名 って記載するから、完全に意識をそっちに向けてしまって脳が停滞してしまっていた模様。
でも、この形式に合わせてもらった方が個人的にはありがたかったかな...

attakei
東京湾岸にて勤務中。 【公私】主にインフラ・サーバサイドWeb担当。Pythonista 【他】徒歩バカ
nijibox
ニジボックスの開発は、社内のUI/UXデザインチームと連携をとりながらワンストップで行う開発支援サービスです。Reactを始めPHP(Laravel)・Ruby on Rails、Swift・Kotlinを使った開発実績も多く、バックエンドからアプリまで幅広く対応しています。Twitterで情報発信しています: https://twitter.com/nijibox_jp
https://nijibox.jp/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした