Pythonで開発したAWS Lambdaをデプロイしたら,以下のエラーが出て動きませんでした。(読みやすさのため一部改行を加えています)
[ERROR] Runtime.ImportModuleError:
Unable to import module 'lambda_function':
cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_' (/var/task/urllib3/util/ssl_.py)
Traceback (most recent call last):
"Runtime.ImportModuleError","Unable to import module"のエラーは他にも種類がありますが,最近(2023年5月以降)どれを試してもうまくいかなかった場合はこれかもしれません。
状況
- Python(3.10)でAWS Lambda関数を開発
- APIとの通信のため
import requests
している - ソースコードとモジュールファイルをzipにまとめてデプロイしたところ,上記のエラーで動かなかった
原因
botocore
が,urllib3
の最新版v2.0
に対応していないことが原因。
-
urllib3
の最新版v2.0
が最近リリースされたそうですが,現時点(2023年7月7日)ではbotocore
はこの最新版に対応しておらず,urllib3
と依存関係にあるrequests
モジュールも使えなくなってしまったということです。
解決策
モジュールのインストール時に,以前のバージョンのurllib3
を使用するよう条件を追加する。
Lambdaにデプロイすることを考えると,-t
(または--target
)オプションをつけるかvenv
を使用する必要がありますね。
手作業でインストールを行う場合
python3 -m pip install requests "urllib3<2"
requirements.txt
を使用する場合
requests
urllib3<2
その他の方法
pyproject.toml
およびpoetry dependencies
という方法もあるらしいのですが,そもそも私はこれらの方法知らなかった程なので,リンクを貼るに留めておきます。
githubのissue: https://github.com/psf/requests/issues/6443#issuecomment-1535667256
参考サイト
今回の内容で解決しなかった場合はこちらが参考になるかもしれません↓
ここまでお読みいただきありがとうございました。