AWS Lambda での「cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_'」エラー解決
エラーの概要
AWS Lambda で Python スクリプトを実行する際、以下のエラーが発生する場合があります。
{
"errorMessage": "Unable to import module 'lambda_function': cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_'",
"errorType": "Runtime.ImportModuleError"
}
このエラーは主に外部ライブラリを含む Lambda レイヤー を使用した場合に、依存関係のバージョン競合によって発生します。
エラーの根本原因
DEFAULT_CIPHERS
は urllib3>=2.0.0
で削除された属性です。一方で、Lambda 環境標準ライブラリの boto3/botocore
は urllib3<2.0
に依存しています。
レイヤーに requests
, pandas
などをインストールすると依存関係で urllib3
の最新版(v2.0 以上)が導入され、既存の botocore
との互換性が失われます。
注意ポイント
- AWS Lambda の標準環境には既に
boto3
,botocore
,urllib3
がプリインストール済み - レイヤーで追加ライブラリをインストールすると依存関係が競合する
解決方法
🔧 方法1: urllib3のバージョンを明示的に固定(推奨)
最も確実な解決策です。インストール時に urllib3<2
を指定します。
実装手順:
# レイヤーの構築コマンド例
pip install requests pandas beautifulsoup4 'urllib3<2' -t ./python --no-user
requirements.txt 使用時:
# 必ず urllib3<2 を追加
requests
pandas
beautifulsoup4
urllib3<2 # バージョン競合を防ぐ
重要
単独で urllib3==1.26.15
をインストールしても不十分です。pip
の依存解決メカニズムによって最新版が再導入される可能性があります。<2
という範囲指定が必須です。
🔄 方法2: boto3を最新バージョンに更新
botocore>=1.29.153
と boto3>=1.26.153
では urllib3>=2.0
に対応しています。
レイヤーに明示的に最新版を追加:
pip install boto3>=1.26.153 botocore>=1.29.153 -t ./python --no-user
🚀 方法3: LambdaランタイムのPythonバージョンアップグレード
Python 3.10+ では標準環境の botocore
が更新され、問題が解消されるケースがあります。
- Lambda 設定画面でランタイムを Python 3.10 または 3.11 に変更
- レイヤー再構築時にランタイムバージョンに合ったライブラリをインストール
📦 方法4: Dockerで互換性のある環境を構築
ローカル環境とLambda環境の差異を解消します。
Dockerを使用したレイヤー作成手順:
# 例: Python 3.11 の場合
mkdir layer
cp requirements.txt layer/requirements.txt
docker run -ti -v $(pwd)/layer:/app -w /app \
--entrypoint /bin/bash public.ecr.aws/lambda/python:3.11 \
-c "pip install --target ./python -r requirements.txt"
生成された layer/python
をZIP圧縮し、Lambdaレイヤーとしてアップロード。
Windows PowerShell ユーザー向け
$(pwd)
を ${pwd}
に置き換えて実行:
docker run -ti -v ${pwd}/layer:/app -w /app ...
🗂 テーブル比較:解決策の選択ガイド
方法 | 手軽さ | 推奨シナリオ |
---|---|---|
urllib3<2 固定 | ★★★ | 既存のランタイム変更なしで解決したい |
boto3更新 | ★★ | 最新AWS機能を使用したい場合 |
ランタイムアップグレード | ★★ | 新規作成のLambda関数 |
Docker使用 | ★ | 複雑な依存関係がある場合 |
根本原因と補足
- なぜ再発しやすいのか:
requests
などのライブラリはurllib3
に依存し、最新版が自動選択される - 回避のコツ:
pip freeze > requirements.txt
で明示的なバージョン管理 - 検証情報: urllib3公式移行ガイドに該当エラーの詳細記載あり
::: success ベストプラクティス urllib3<2
の明示的指定が最も効果的です。Lambda レイヤーやコンテナビルド時に必ずこの条件を含めると、互換性問題を確実に回避できます。 :::