Lambda で No module named エラーになるときの確認ポイント ── 依存ライブラリをレイヤーにまとめる
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - Lambda・CloudShell を操作できる IAM ユーザーまたはロールでコンソールにログイン済みであること
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| Lambda 関数 | dva-layer-fn | requests を使う関数 |
| IAM ロール | dva-layer-fn-role-xxxxxxxx(自動作成) | 関数の実行ロール |
| Lambda レイヤー | dva-requests(バージョン 1) | requests とその依存ライブラリ |
手順 1: requests を使う関数を作る
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。上部の検索バーに Lambda と入力し、「Lambda」を選択します。
「関数を作成」をクリックし、「一から作成」で以下を設定して、画面下部の「関数を作成」をクリックします。
- 関数名:
dva-layer-fn - ランタイム:
Python 3.13 - アーキテクチャ:
x86_64(「その他の設定」の「ARM64 アーキテクチャ」はオフのまま) - 実行ロール: 「その他の設定」の「カスタム実行ロール」はオフのまま(基本的な Lambda アクセス許可の実行ロールが自動で作られます)
「コード」タブのエディタで lambda_function.py を次の内容に置き換え、「Deploy」をクリックします。
import requests
def lambda_handler(event, context):
resp = requests.get("https://aws.amazon.com/", timeout=5)
return {"requests_version": requests.__version__, "status_code": resp.status_code}
手順 2: テストしてエラーを確かめる
「テスト」タブで、イベント名に empty と入力し、イベント JSON は {} のまま「テスト」をクリックします。実行結果は「実行中の関数: 失敗」になり、「詳細」を開くと Runtime.ImportModuleError と No module named 'requests' が表示されます。Python 3.13 のランタイムに requests が入っておらず、デプロイパッケージにも入れていないためです。
手順 3: CloudShell でレイヤーの .zip を作る
コンソール上部の CloudShell のアイコンから CloudShell を開き、python フォルダに requests を入れて .zip にします。
mkdir -p ~/layer/python && cd ~/layer
pip3 install requests -t python/
zip -r -q layer.zip python
unzip -l layer.zip | head -n 8
unzip -l の結果で、すべてのファイルが python/ の下に入っていることを確認します。requests とその依存ライブラリ(urllib3・idna・charset_normalizer・certifi)は Python だけで書かれているので、CloudShell で入れたものをそのまま使えます。
手順 4: レイヤーを発行する
CloudShell で、レイヤーを発行します。
aws lambda publish-layer-version \
--layer-name dva-requests \
--description "requests and its dependencies" \
--zip-file fileb://layer.zip \
--compatible-runtimes python3.13 \
--compatible-architectures x86_64 \
--query '{LayerVersionArn: LayerVersionArn, Version: Version}'
Version が 1 のレイヤーバージョンの ARN が表示されます。Lambda のコンソールの左側ナビゲーションで「レイヤー」を選択すると、dva-requests が表示されます。
手順 5: 関数にレイヤーをアタッチする
dva-layer-fn の画面に戻り、「コード」タブの一番下の「レイヤー」セクションで「編集」をクリックします。「レイヤーを編集」の画面で「レイヤーの追加」をクリックすると、「レイヤーを選択」のダイアログが開きます。以下を選択して「追加」をクリックします。
- レイヤーソース: 「カスタムレイヤー」
- カスタムレイヤー:
dva-requests - バージョン:
1
「レイヤーを編集」の画面に戻るので、「保存」をクリックします。
手順 6: もう一度テストする
「テスト」タブで、もう一度「テスト」をクリックします。今度は成功し、requests_version に requests のバージョン、status_code に 200 が返ります。関数のコード(デプロイパッケージ)は変えていませんが、レイヤーが /opt/python に展開されたので、import requests ができるようになりました。
関数のデプロイパッケージは数百バイトのままです。ライブラリを入れ替えたいときは、新しいレイヤーのバージョンを発行して、関数にアタッチするバージョンを変えます。