CfnCluster を Amazon Linux 2 にインストールしようとしたら出来なかった(ので pyenv を使った)話

2018.07.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

小ネタです。

AWS 上に HPC 環境を構築するときには、CfnCluster を使うと便利です。

ただタイトルにも書いたことの繰り返しになりますが、これを Amazon Linux 2 (AL2) 上に普通にインストールしても、もとから入っている botocore のバージョン依存関係をクリアできずに起動しないという現象にでくわしました。

$ uname -sr
Linux 4.14.47-64.38.amzn2.x86_64

$ sudo yum -y install python2-pip
$ pip install cfncluster --user
Collecting cfncluster
 :
Successfully installed boto3-1.7.61 botocore-1.10.61 
    cfncluster-1.5.1 configparser-3.5.0 future-0.16.0

$ cfncluster --help
Traceback (most recent call last):
 :
pkg_resources.ContextualVersionConflict: 
    (botocore 1.8.12 (/usr/lib/python2.7/site-packages), 
    Requirement.parse('botocore<1.11.0,>=1.10.61'), set(['boto3']))

そういう時はきれいな状態から整えるのが一番手っ取り早いので、さくっと pyenv を導入してしまいましょう。

そもそも CfnCluster とは

下記の記事をご参照下さい。

始めてみよう CfnClusterでHPCクラスター

pyenv で解決

Amazon Linux 2 上で pyenv をインストールするために、まずは Development Tools と必要なライブラリを yum から入れます。

$ sudo yum -y groupinstall development
$ sudo yum -y install openssl-devel bzip2-devel readline-devel sqlite-devel

その上で pyenv を導入します。下記のドキュメントに従ってさくっと入れてしまいましょう。

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
$ source ~/.bash_profile

pyenv が入ったら、2.7 系の現時点での最新バージョンである 2.7.15 をインストールします。

$ pyenv install 2.7.15

インストールには少々(インスタンスタイプによって差がありますが概ね数分程度)時間がかかりますので、気長目に待って下さい。

インストールが終わったら、 CfnCluster の作業で使用するディレクトリを作成します。ここでは ~/cfncluster としました。そしてそのディレクトリから呼び出される Python の環境を pyenv で設定しましょう。

$ mkdir ~/cfncluster && cd $_
$ pyenv local 2.7.15

$ which python
~/.pyenv/shims/python

$ python --version
Python 2.7.15

ちなみにですが、たまにシェルのキャッシュが効いてうまくバージョンが切り替わらなかったりすることがあります。手っ取り早いのは SSH でログインし直すことなので、動作がおかしいと思ったら一度ログアウトして入り直して下さい。

うまくいったら( pip のアップグレードをした後で) CfnCluster をインストールします。

$ pip install --upgrade pip
$ pip install cfncluster
Collecting cfncluster
 :
Successfully installed PyYAML-3.13 awscli-1.15.62 boto3-1.7.61 botocore-1.10.61 
    cfncluster-1.5.1 colorama-0.3.9 configparser-3.5.0 docutils-0.14 future-0.16.0 
    futures-3.2.0 jmespath-0.9.3 pyasn1-0.4.3 python-dateutil-2.7.3 rsa-3.4.2 
    s3transfer-0.1.13 six-1.11.0

こんどは入りました!

$ cfncluster --help
usage: cfncluster [-h] [--config CONFIG_FILE] [--region REGION] [--nowait]
                  {create,update,delete,start,stop,status,list,instances,configure,version}
                  ...

cfncluster is a tool to launch and manage a cluster.

 :

きちんと動作するようです。ついでにといってはアレですが、AWS CLI も最新のものがインストールされたようなので確認してみましょう。

$ aws --version
aws-cli/1.15.62 Python/2.7.15 Linux/4.14.47-64.38.amzn2.x86_64 botocore/1.10.61

これで、CfnCluster を使う準備ができました。

まとめ

Amazon Linux 2 に CfnCluster 環境を整えるために pyenv を使いました。これを使うと既存の環境をこわさずに Python の環境を作ることが可能なので、積極的に使っていきたいですね。