OpenSSL 1.1.1 が必須なPython 3.10.x をAmazon Linux 2 にインストールする

記事タイトルとURLをコピーする

どうも! swx-ochiai です。

Python 3.10.x をAmazon Linux 2 にインストールします。

ただし、プリインストールのOpenSSLバージョンが 1.1.1 未満の場合、インストールに失敗します。

そのため、この記事では、ハマりやすいポイントを取り除くためインストール方法をまとめました。

なお、表示されるバージョンおよび手順は執筆時点(2022/5)時点のものです。

紹介するインストール方法

Pythonのインストール方法はいろいろあります。この記事で紹介するインストール方法は次のとおりです。

  • pyenv を利用してインストールする

他のブログ記事でも紹介はしていますが、 pyenv はPythonの言語バージョンを管理するツールです。

複数のバージョンを1つのOSにインストールでき、言語のバージョンをシステム全体(global)で切り替えることや、特定フォルダ配下(local)にのみに適用することができます。

なぜこの方法を紹介するのか

他にもAmazon Linux 2 にPythonをインストールする方法はあります。

例えば、yumamazon-linux-extras などのパッケージ管理ツールを利用する方法です。

ただし、 これらの方法でインストールできるPythonのバージョンは現状次のとおりです。

yum の場合 : Python 3.7.10

$ yum list python3
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Installed Packages
python3.x86_64                                  3.7.10-1.amzn2.0.1                                   installed
Available Packages
python3.i686                                    3.7.10-1.amzn2.0.1                                   amzn2-core
$ python3 --version
Python 3.7.10

現行のAmazon Linux 2 ではPython 3.7.10 がプリインストールされていますね。

amazon-linux-extras の場合: Python 3.8.5

Amazon Linux 2には Extras Library と呼ばれるパッケージ群が存在し、特定のパッケージをより新しいバージョンで利用することができます。 Extra Packages for Enterprise Linux (EPEL) のような位置づけです。通常はディストリビューション標準のパッケージを利用する一方で、特定のパッケージではより新しいバージョンを利用できます。

$ amazon-linux-extras
~~~ 略 ~~~
44  python3.8                available    [ =stable ]
~~~ 略 ~~~
$ sudo amazon-linux-extras install -y python3.8
$ python3.8 --version
Python 3.8.5

利用できるのは、Python 3.8.5 ですね。

したがって、異なるバージョンや3.9.x 以降のPythonを利用したい場合には、ソースコードからビルドしたり、今回ご紹介する pyenv などのツールを利用する必要があります。

その中でも、3.10.x 以降では、OpenSSLのバージョン 1.1.1 以降を必須としていることがハマりやすいポイントのため、今回ご紹介しています。

これまで、Pythonでは OpenSSL のVersion 1.0.2以降が利用可能でしたが、Python 3.10からは、OpenSSL 1.1.1以降が必須となりました(PEP 644 Require OpenSSL 1.1.1 or newer)。

WindowsやMacなどで、Python.orgのインストーラを利用する場合には、OpensSSLの最新版が含まれているので気にする必要はありません。また、Macのbrewなどでインストールする場合も、OpenSSL 1.1.1が使用されます。

Linux環境などで独自にPythonをビルドする場合には、OpenSSL 1.1.1以降を用意する必要があります。

引用元: Python 3.10の新機能(その8) OpenSSL 1.1.1が必須に

Python 3.10.x インストール手順

それでは、Python 3.10.x のインストール手順の詳細を見ていきましょう。

構築例の環境

EC2 インスタンス(Amazon Linux 2)の起動についての記事はたくさんありますので、この記事では割愛させていただきます。

検証には、次のAMI を使用しています。

  • AMI

    ami-02c3627b04781eada

    (Amazon Linux 2 Kernel 5.10 AMI 2.0.20220426.0 x86_64 HVM gp2)

この記事で実行するコマンドは、ec2-user で操作しています。

事前準備 : OpenSSL 1.1.1 のインストール

まずは、OpenSSL 1.1.1 のインストール からです。

1. OpenSSLのバージョン確認

現行のAmazon Linux 2 にプリインストールされている OpenSSLのバージョンを確認しておきましょう。

$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

1.0.2 ですね。

2. OpenSSL 1.1.1 をインストール

OpenSSL 1.1.1 をインストールしましょう。

$ sudo yum install -y openssl11 openssl11-devel

3. OpenSSL 1.1.1 のインストールを確認

インストールが正常に完了したか確認しましょう。次のようにOpenSSLのバージョンが表示されれば成功です。

$ openssl11 version
OpenSSL 1.1.1g FIPS  21 Apr 2020

pyenvで Python 3.10.x をインストールする

ここからは、pyenvを利用した Python 3.10.xのインストール手順の紹介です。

1. pyenv 公式推奨ビルド環境の構築

まずは、pyenv のインストールに必要なパッケージをインストールします。

$ sudo yum install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel tk-devel libffi-devel xz-devel

公式推奨ビルド環境 ドキュメントに記載の openssl-develはインストールしないようにしましょう。次のように、コンフリクトが発生している旨のエラーが発生し、インストールができません。

Error: openssl11-devel conflicts with 1:openssl-devel-1.0.2k-24.amzn2.0.2.x86_64

既にopenssl-develをインストール済の場合は、アンインストールします。

$ sudo yum remove -y openssl-devel

2. pyenv のインストール

必要なパッケージがインストールできたら、pyenvをインストールしましょう。 今回は、自動インストーラーを利用して実行します。

自動インストーラーの実行には、Gitが必要です。未インストールの場合はインストールしましょう。

$ sudo yum install -y git

自動インストーラーをダウンロードして、実行します。

$ curl https://pyenv.run | bash

インストーラーを実行すると、次のように「pyenvを実行できるようにするには環境変数(PATH)を設定してね」という旨の警告メッセージが出ます。

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by appending
# the following to
~/.bash_profile if it exists, otherwise ~/.profile (for login shells)
and ~/.bashrc (for interactive shells) :

export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

# Restart your shell for the changes to take effect.

警告メッセージが出る場合は、環境変数を設定しましょう。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc

設定ができたら、シェルを再起動します。

$ exec $SHELL -l

3. pyenv のインストールを確認

インストールが正常に完了したか確認しましょう。次のようにpyenvのバージョンが表示されれば成功です。

$ pyenv --version
pyenv 2.3.0

4. Python 3.10.x のインストール

pyenv が実行できるようになりました。pyenv で Python 3.10.x をインストールしましょう。

インストールできるPythonのバージョンを確認します。

$ pyenv install -l 

今回は、3.10.4 をインストールします。

$ pyenv install 3.10.4

Downloading Python-3.10.4.tar.xz...
-> https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tar.xz
Installing Python-3.10.4...
Installed Python-3.10.4 to /home/ec2-user/.pyenv/versions/3.10.4

5. Python 3.10.x のインストールを確認

インストールが正常に完了したか確認しましょう。次のようにpythonのバージョンが表示されれば成功です。

$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)
  3.10.4

おまけ

OpenSSLのバージョンが古い状態で、pyenvで Python 3.10.xをインストールしようとすると次のようなエラーとなります。

$ pyenv install 3.10.4
Downloading Python-3.10.4.tar.xz...
-> https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tar.xz
Installing Python-3.10.4...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (Amazon Linux 2 using python-build 2.3.0-6-g70b23638)

Inspect or clean up the working tree at /tmp/python-build.20220516111828.3001
Results logged to /tmp/python-build.20220516111828.3001.log

Last 10 log lines:
         ./python -E -m ensurepip \
                $ensurepip --root=/ ; \
fi
Looking in links: /tmp/tmpzyz9va_b
Processing /tmp/tmpzyz9va_b/setuptools-58.1.0-py3-none-any.whl
Processing /tmp/tmpzyz9va_b/pip-22.0.4-py3-none-any.whl
Installing collected packages: setuptools, pip
  WARNING: The scripts pip3 and pip3.10 are installed in '/home/ec2-user/.anyenv/envs/pyenv/versions/3.10.4/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-22.0.4 setuptools-58.1.0

現状、openssl-developenssl11-develの共存ができません。

細かい動作確認まではできていませんが、観測範囲ではopensslはアンインストールしなくとも動作に問題はない様です。

まとめ

Python 3.10.x をインストールする上で、 OpenSSLのバージョンに注意が必要なことをご紹介しました。

Python 3.9.x までは OpenSSLのバージョンを意識しなくともインストールができますが、3.10.xからは OpenSSL 1.1.1以降が必須となっています。

本記事がどなたかのお役に立てば幸いです。