certbot-auto で ImportError: No module named cryptography.hazmat.bindings.openssl.binding エラー

AWS の EC2 で運用しているWebサイトがあり、そのサーバでは certbot-auto を使用してサイトのSSL化を行っていました。

先日、certbot-auto を使用してSSL証明書の作成を行おうとしたところ、以下のエラーが発生しました。

Upgrading certbot-auto 0.27.1 to 0.28.0...
Replacing certbot-auto...
Creating virtual environment...
Installing Python packages...
Installation succeeded.
Traceback (most recent call last):
  File "/opt/eff.org/certbot/venv/bin/letsencrypt", line 7, in <module>
    from certbot.main import main
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/certbot/main.py", line 10, in <module>
    import josepy as jose
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/josepy/__init__.py", line 44, in <module>
    from josepy.interfaces import JSONDeSerializable
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/josepy/interfaces.py", line 8, in <module>
    from josepy import errors, util
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/josepy/util.py", line 4, in <module>
    import OpenSSL
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/OpenSSL/rand.py", line 12, in <module>
    from OpenSSL._util import (
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/OpenSSL/_util.py", line 6, in <module>
    from cryptography.hazmat.bindings.openssl.binding import Binding
ImportError: No module named cryptography.hazmat.bindings.openssl.binding

Pythoncertbot も詳しくないのですが、タイトルのエラーについてはネット上にいくつも情報が転がっていました。

ただ、どれも微妙に異なる内容で、検索結果の上から試していきましたが一発では解決しませんでした。

結論、この環境では以下で復旧させることができました。

unset PYTHON_INSTALL_LAYOUT
/opt/eff.org/certbot/venv/bin/pip install --upgrade certbot

しかしネット上の情報と上記のエラーとを総合すると、原因は certbot-auto がアップグレードをかけるときに上手くいっていないためだろうと考えられました。
であるならば、certbot-auto を実行する前に unset PYTHON_INSTALL_LAYOUT すればよいのではないかと考え、別のサーバで unset PYTHON_INSTALL_LAYOUT してから certbot-auto を実行してみたところ、無事にアップグレードされました。

一度 certbot-auto してこのエラーが出てしまった後では、/opt/eff.org/certbot/venv/bin/pip install --upgrade certbot で明示的にアップグレードしてあげる必要があります。