どうも! 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をインストールする方法はあります。
例えば、yum
や amazon-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-devel
とopenssl11-devel
の共存ができません。
細かい動作確認まではできていませんが、観測範囲ではopenssl
はアンインストールしなくとも動作に問題はない様です。
まとめ
Python 3.10.x をインストールする上で、 OpenSSLのバージョンに注意が必要なことをご紹介しました。
Python 3.9.x までは OpenSSLのバージョンを意識しなくともインストールができますが、3.10.xからは OpenSSL 1.1.1以降が必須となっています。
本記事がどなたかのお役に立てば幸いです。
swx-ochiai (執筆記事の一覧)