Skip to content

AWS Lambda での「cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_'」エラー解決

エラーの概要

AWS Lambda で Python スクリプトを実行する際、以下のエラーが発生する場合があります。

json
{
  "errorMessage": "Unable to import module 'lambda_function': cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_'",
  "errorType": "Runtime.ImportModuleError"
}

このエラーは主に外部ライブラリを含む Lambda レイヤー を使用した場合に、依存関係のバージョン競合によって発生します。

エラーの根本原因

DEFAULT_CIPHERSurllib3>=2.0.0 で削除された属性です。一方で、Lambda 環境標準ライブラリの boto3/botocoreurllib3<2.0 に依存しています。
レイヤーに requests, pandas などをインストールすると依存関係で urllib3 の最新版(v2.0 以上)が導入され、既存の botocore との互換性が失われます。

注意ポイント

  • AWS Lambda の標準環境には既に boto3, botocore, urllib3 がプリインストール済み
  • レイヤーで追加ライブラリをインストールすると依存関係が競合する

解決方法

🔧 方法1: urllib3のバージョンを明示的に固定(推奨)

最も確実な解決策です。インストール時に urllib3<2 を指定します。
実装手順:

sh
# レイヤーの構築コマンド例
pip install requests pandas beautifulsoup4 'urllib3<2' -t ./python --no-user

requirements.txt 使用時:

txt
# 必ず urllib3<2 を追加
requests
pandas
beautifulsoup4
urllib3<2  # バージョン競合を防ぐ

重要

単独で urllib3==1.26.15 をインストールしても不十分です。pip の依存解決メカニズムによって最新版が再導入される可能性があります。<2 という範囲指定が必須です。

🔄 方法2: boto3を最新バージョンに更新

botocore>=1.29.153boto3>=1.26.153 では urllib3>=2.0 に対応しています。
レイヤーに明示的に最新版を追加:

sh
pip install boto3>=1.26.153 botocore>=1.29.153 -t ./python --no-user

🚀 方法3: LambdaランタイムのPythonバージョンアップグレード

Python 3.10+ では標準環境の botocore が更新され、問題が解消されるケースがあります。

  1. Lambda 設定画面でランタイムを Python 3.10 または 3.11 に変更
  2. レイヤー再構築時にランタイムバージョンに合ったライブラリをインストール

📦 方法4: Dockerで互換性のある環境を構築

ローカル環境とLambda環境の差異を解消します。
Dockerを使用したレイヤー作成手順:

sh
# 例: 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} に置き換えて実行:

ps1
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 レイヤーやコンテナビルド時に必ずこの条件を含めると、互換性問題を確実に回避できます。 :::