Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named '○○' は、Lambda が関数を読み込む(import する)段階で失敗したときのエラーです。 コードの中身が動く前のエラーなので、原因は「何が入っているか(zip の中身)」と「どこを指しているか(ハンドラ名)」のどちらかです。

No module named のあとの名前で、原因がほぼ決まります。

メッセージ 原因 直し方
No module named 'requests' など、ライブラリ名 ライブラリを zip に入れていない pip install -t で入れて zip に含める
No module named 'lambda_function'、自分のファイル名 zip の1階層下にファイルがある、またはファイル名とハンドラ名が違う zip の一番上にファイルを置く/ハンドラ名を合わせる
cannot import name '…' from 'pydantic_core._pydantic_core' など Mac・Windows や別の Python の版で入れたネイティブ拡張 pip install --platform manylinux2014_x86_64 で入れ直す
Handler 'lambda_handler' missing on module ファイルはあるが、関数名が違う(Runtime.HandlerNotFound) ハンドラ設定の関数名を合わせる
Syntax error in module(Runtime.UserCodeSyntaxError) 構文エラー 手元で python -m py_compile

確認方法:AWS が公開している Lambda のランタイムクライアント(awslambdaric 4.2.0、Python 3.11、Linux x86_64)を手元で動かし、Lambda と同じ読み込み処理で再現しました。表のメッセージは、ランタイムクライアントが Lambda に送ったエラー本文そのままです(確認日 2026年10月12日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Lambda Unable to import moduleの直し方|Python」

まず CloudWatch Logs でメッセージ全文を見る

コンソールの「テスト」の結果か、CloudWatch Logs に次のように出ます(手元で再現したときの出力)。

[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'requests'

Lambda に送られたエラー本文は次の形でした。

{"errorMessage": "Unable to import module 'lambda_function': No module named 'requests'",
 "errorType": "Runtime.ImportModuleError", "stackTrace": []}

Unable to import module 'lambda_function' の lambda_function はハンドラ名の前半(ファイル名)、No module named のあとが「見つからなかったもの」です。

原因① ライブラリを zip に入れていない(No module named 'requests')

Lambda の Python ランタイムに最初から入っているのは、標準ライブラリと AWS SDK(boto3)です。 requests のように自分で pip で入れたライブラリは、zip に含めないと見つかりません。

import requests          # ← zip に requests が無いとエラー

def lambda_handler(event, context):
    return {"statusCode": 200}

直し方は、ライブラリを package フォルダに入れ、関数のファイルと一緒に zip にすることです。 AWS のドキュメントの手順です。

cd my_function
mkdir package
pip install --target ./package requests

cd package
zip -r ../my_deployment_package.zip .   # ライブラリを zip の一番上に
cd ..
zip my_deployment_package.zip lambda_function.py   # 関数のファイルも一番上に

手元で requests を入れて同じ関数を動かすと、{"statusCode": 200, "requests": "2.34.2"} が返りました。

複数の関数で同じライブラリを使うなら、Lambda レイヤーにまとめる方法もあります。レイヤーの作り方は、関連記事「AWS CLIでLambdaを作成・更新 環境変数とレイヤー」で扱っています。

原因② zip の1階層下にファイルがある(No module named 'lambda_function')

フォルダごと zip にすると、ファイルが1階層下に入り、Lambda から見つかりません。

NG:フォルダごと zip にした            OK:フォルダの中身を zip にした
my_function/                            lambda_function.py
my_function/lambda_function.py
# NG
zip -r bad.zip my_function
# OK(フォルダの中に入ってから)
cd my_function && zip -r ../good.zip .

unzip -l で中身を確かめると違いが分かります。

$ unzip -l bad.zip
        0  my_function/
       83  my_function/lambda_function.py
$ unzip -l good.zip
       83  lambda_function.py

NG の zip を展開した状態で動かすと、Unable to import module 'lambda_function': No module named 'lambda_function' になりました。AWS のドキュメントにも「ハンドラのあるファイルとすべての依存関係は、zip の一番上(ルート)に置く」とあります。

フォルダそのものを選んで圧縮すると、この NG の形になります。 GUI で圧縮するときも、フォルダの中のファイルを選んでから圧縮します。

原因③ ファイル名とハンドラ名が違う

ハンドラ名は「ファイル名(.py なし).関数名」です。 コンソールで作った関数の既定は lambda_function.lambda_handler なので、ファイル名を app.py にすると読み込めません。

ファイル ハンドラ設定 結果
lambda_function.py に lambda_handler lambda_function.lambda_handler 動いた
app.py に lambda_handler lambda_function.lambda_handler No module named 'lambda_function'
app.py に lambda_handler app.lambda_handler 動いた
lambda_function.py に handler lambda_function.lambda_handler Runtime.HandlerNotFound

関数名が違うときは、ImportModuleError ではなく別のエラーでした。

{"errorMessage": "Handler 'lambda_handler' missing on module 'lambda_function'",
 "errorType": "Runtime.HandlerNotFound"}

ハンドラ設定は、コンソールの「コード」タブ →「ランタイム設定」→「編集」で変えられます。

原因④ Mac・Windows・別の Python の版で入れたライブラリ

pydantic・numpy・cryptography など、C や Rust で書かれた部分(ネイティブ拡張)を持つライブラリは、OS・CPU・Python の版ごとに別のファイルです。 Mac で pip install -t して zip にすると、Lambda(Amazon Linux)では読み込めません。

手元で、Mac(arm64)用と Python 3.13 用の pydantic を入れて、Python 3.11 のランタイムで動かすと、次のメッセージになりました。

{"errorMessage": "Unable to import module 'lambda_function': cannot import name 'ArgsKwargs' from 'pydantic_core._pydantic_core' (unknown location)",
 "errorType": "Runtime.ImportModuleError"}

Mac 用で入れたフォルダの中を見ると、ファイル名に darwin(macOS)が入っていました。

pydantic_core/_pydantic_core.cpython-311-darwin.so

No module named ではなく cannot import name ... (unknown location) という形になるので、原因①と見分けがつきにくいエラーです。ライブラリ名の下に _ で始まるモジュール(_pydantic_core など)が出ていたら、この原因を疑います。

直し方は、Lambda の CPU と Python の版を指定して入れ直すことです。 AWS のドキュメントのコマンドです。

# x86_64 の関数(Python 3.13 の例)
pip install \
  --platform manylinux2014_x86_64 \
  --target=package \
  --implementation cp \
  --python-version 3.13 \
  --only-binary=:all: --upgrade \
  pydantic

# arm64(Graviton)の関数
pip install --platform manylinux2014_aarch64 --target=package \
  --implementation cp --python-version 3.13 --only-binary=:all: --upgrade pydantic
合わせるもの どこで確かめるか
CPU(x86_64 か arm64) 関数の「ランタイム設定」の「アーキテクチャ」
Python の版 同じく「ランタイム」(python3.13 など)

手元で Python 3.11・x86_64 を指定して入れ直すと、{"name": "RJC"} が返り、読み込めました。

原因⑤ 構文エラー(UserCodeSyntaxError)

def の行の : を消すと、別の種類のエラーになりました。

{"errorMessage": "Syntax error in module 'lambda_function': expected ':' (lambda_function.py, line 1)",
 "errorType": "Runtime.UserCodeSyntaxError"}

zip にする前に、手元で python -m py_compile lambda_function.py を実行すると見つけられます。

アップロード前のチェックリスト

確かめること コマンド・場所
lambda_function.py が zip の一番上にある unzip -l 関数.zip
使っているライブラリが zip の一番上にある unzip -l 関数.zip | grep requests
ハンドラ設定が「ファイル名.関数名」と合っている コンソール →「ランタイム設定」
ネイティブ拡張を含むライブラリを --platform 付きで入れた .so のファイル名に darwin・win が無い
Python の版とアーキテクチャが、入れたときと同じ コンソール →「ランタイム設定」

よくある質問

Q. boto3 も zip に入れる必要がありますか。 A. Lambda の Python ランタイムには boto3 が入っています。AWS のドキュメントでは、入っている版はランタイムの版とリージョンによって決まるとされています。特定の版の機能を使うなら、zip に入れて版を固定する方法もあります。

Q. コンソールのエディタで直接書いたら動いたのに、zip にしたら動きません。 A. zip の階層(原因②)か、ファイル名(原因③)を確かめます。unzip -l で一番上に lambda_function.py があるかを見ます。

Q. SAM や CDK を使っても起きますか。 A. SAM の sam build は、requirements.txt のライブラリを入れて組み立てるので、原因①は起きにくくなります。関連記事「AWS SAM入門」で扱っています。

まとめ

  • Unable to import module は、関数を読み込む前の失敗。原因は zip の中身かハンドラ名
  • No module named 'ライブラリ名' は入れ忘れ。pip install --target ./package で zip に含める
  • No module named 'lambda_function' は zip の階層かファイル名。ファイルは zip の一番上
  • cannot import name ... _pydantic_core は Mac などで入れたネイティブ拡張。--platform manylinux2014_x86_64 で入れ直す
  • 関数名違いは Runtime.HandlerNotFound、構文エラーは Runtime.UserCodeSyntaxError

参考・出典

確認日はいずれも 2026年10月12日です。

  • AWS Lambda デベロッパーガイド「Working with .zip file archives for Python Lambda functions」:https://docs.aws.amazon.com/lambda/latest/dg/python-package.html
  • AWS Lambda デベロッパーガイド「Define Lambda function handler in Python」:https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html
  • AWS Lambda デベロッパーガイド「Building Lambda functions with Python」(ランタイム一覧・含まれる SDK):https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html
  • awslambdaric(AWS Lambda Runtime Interface Client for Python)4.2.0:https://pypi.org/project/awslambdaric/

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Lambda Unable to import moduleの直し方|Python」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?