【小ネタ】Amazon Linux 2 にPython3をインストールしてvenv環境を構築する【venv】

# はじめに
Amazon Linux 2をはじめとし、大抵のLinuxディストリビューションは、パッケージマネージャ（yumやaptなど）の機能でPythonをインストールすることが可能になっています。
しかしながら、これらパッケージマネージャでインストールされるソフトウェアは安定性が重視され、最新のアップデートに追従しないことが殆どです。

まれにAWS CLIの最新版が必要になることがありますが、これはOSディストリビューションのパッケージ版では大体において追従されないため、pipでのインストールを行うことが殆どかと思います。
OSディストリビューションのpipを利用してPythonパッケージのインストール／アップデートを行うと、他の既存のアプリケーションに影響を与えてしまう可能性があります。

そこで、OSディストリビューション環境に影響を与えずに、pipによるPythonパッケージのインストールを自由に行えるようにするため、venvを利用してPython3環境を整備する手順をまとめます。

# 環境
- ディストリビューション:
    - Amazon Linux release 2 (Karoo)
    - cpe:2.3:o:amazon:amazon_linux:2
- venv環境名:
    - my_venv

# 手順
## Python3のインストール
まずは、Amazon Linux 2のパッケージマネージャであるyumを利用し、Python3をインストールします。
2019/12/16現在のPython3のバージョンは、3.7.4のようです。

```
### Python3インストール
$ sudo yum install python3
※途中省略

Dependencies Resolved

================================================================================================================================================================
 Package                                    Arch                           Version                                     Repository                          Size
================================================================================================================================================================
Installing:
 python3                                    x86_64                         3.7.4-1.amzn2.0.3                           amzn2-core                          71 k
Installing for dependencies:
 python3-libs                               x86_64                         3.7.4-1.amzn2.0.3                           amzn2-core                         9.0 M
 python3-pip                                noarch                         9.0.3-1.amzn2.0.1                           amzn2-core                         1.9 M
 python3-setuptools                         noarch                         38.4.0-3.amzn2.0.6                          amzn2-core                         617 k

Transaction Summary
================================================================================================================================================================
Install  1 Package (+3 Dependent packages)

Total download size: 12 M
Installed size: 50 M
Is this ok [y/d/N]: y

※途中省略
```

```
### 意図したバージョンがインストールされていることを確認
$ which python3
/usr/bin/python3
$ python3 --version
Python 3.7.4
```

## my_venvという名称のvenv環境を作成
venvは専用のコマンドが用意されているわけではなく、Pythonのモジュールとして提供されます。そのため、Pythonの「-m」オプションを利用してvenvを実行します。

```
### my_venvという名称の環境を、ホームディレクトリ以下に作成
$ cd
$ python3 -m venv my_venv
$ ls ~/my_venv/
bin/        include/    lib/        lib64/      pyvenv.cfg
```

なお、venv環境への切り替えの際には、activateコマンドを利用します。これは「~/my_venv/bin/activate*」といったスクリプトで提供されます。

```
$ ls -l ~/my_venv/bin/activate*
-rw-r--r-- 1 vagrant vagrant 2203 Dec 15 15:30 /home/vagrant/my_venv/bin/activate
-rw-r--r-- 1 vagrant vagrant 1259 Dec 15 15:30 /home/vagrant/my_venv/bin/activate.csh
-rw-r--r-- 1 vagrant vagrant 2411 Dec 15 15:30 /home/vagrant/my_venv/bin/activate.fish
```

## venv環境に切り替え
それでは先ほど作成したmy_venv環境に切り替えます。
切り替わったかどうかの確認には、whichを使うと便利です。

```
$ . ~/my_venv/bin/activate
(my_venv) $ python --version
Python 3.7.4
(my_venv) $ which python
~/my_venv/bin/python
```

## AWS CLIのインストール
venv環境に切り替わった状態で、pip installを利用してAWS CLIをインストールします。

```
### 実行しているpipコマンドがvenv環境のものになっていること
(my_venv) $ which pip
~/my_venv/bin/pip
```

```
### AWS CLIのインストール・バージョンの確認
(my_venv) $ pip install awscli
Collecting awscli

※途中省略

Installing collected packages: PyYAML, docutils, six, python-dateutil, jmespath, urllib3, botocore, s3transfer, pyasn1, rsa, colorama, awscli
  Running setup.py install for PyYAML ... done
Successfully installed PyYAML-5.1.2 awscli-1.16.303 botocore-1.13.39 colorama-0.4.1 docutils-0.15.2 jmespath-0.9.4 pyasn1-0.4.8 python-dateutil-2.8.0 rsa-3.4.2 s3transfer-0.2.1 six-1.13.0 urllib3-1.25.7
```

インストールが完了したら、AWS CLIのバージョンが最新のものであることを確認します。

```
### 念のためシェルを実行しなおす
(my_venv) $ exec bash
(my_venv) $

### AWS CLIコマンドのパスが、venv環境以下のものであることを確認する
(my_venv) $ which aws
~/my_venv/bin/aws

### AWS CLIの最新版がインストールされていることを確認する
(my_venv) $ aws --version
aws-cli/1.16.303 Python/3.7.4 Linux/4.14.104-95.84.amzn2.x86_64 botocore/1.13.39
```