pipのReadTimeoutError対策 (certbot-auto)

Pythonを使用して pipからモジュールをインストールする時、次のようなエラーでインストールが失敗することがあります。

raise ReadTimeoutError(self._pool, None, 'Read timed out.')
requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(Host='pypi.python.org', port=443): Read timed out.

このエラーは、Let’s Encryptで証明書の取得や更新に使用する certbot-autoで virtualenv から pipをインストールするときにも発生します。

コンソールでインストール失敗の場合には、判りやすいですが Let’s Encrypt の自動更新の処理で失敗している事に気がつかないと、いつのまにか証明書が無効になっていたという事故につながります。

pip を更新することで問題が解決する場合がありますが、再発するようであれば以下の対策を実施します。

pip ReadTimeoutErrorの対策

pip の ReadTimeoutError は、指定した時間内にモジュールを取得できなかった場合に発生します。

コマンドラインのインストールの場合には、次のようにしてタイムアウトを長くすることができます。

sudo pip --default-timeout=1000 install [MODULE_NAME]

certbot-autoでの対策:常にタイムアウトを長く

certbot-auto など、cronで自動処理する場合には certbot-auto を書き換えるのではなく、実行するユーザーの .bashrc などで次のように環境変数を定義します。
もしくは、実行するバッチファイルで環境変数を定義します。

export PIP_DEFAULT_TIMEOUT=100

今回は PIP_DEFAULT_TIMEOUT で 100(秒)を設定しました。
処理に失敗しないように確実にインストールしたい場合には、1000(秒)などもっと長いタイムアウトを指定することもできます。