Python 仮想環境を利用してAWS CLIをインストール

# はじめに
Python 仮想環境を利用して AWS CLI をインストールし、システムのパスに追加して使えるようにする手順をまとめてみました。
また、それぞれのコマンドの役割も説明していきます。

今回の環境は *Alpine Linux* です。

# 仮想環境の作成
まずは *python3* をインストールします。
```bash:apk
/app　# apk add python3
(1/15) Installing libbz2 (1.0.8-r6)
(2/15) Installing libexpat (2.6.4-r0)
(3/15) Installing libffi (3.4.6-r0)
(4/15) Installing gdbm (1.23-r1)
(5/15) Installing xz-libs (5.6.2-r0)
(6/15) Installing mpdecimal (4.0.0-r0)
(7/15) Installing ncurses-terminfo-base (6.4_p20240420-r2)
(8/15) Installing libncursesw (6.4_p20240420-r2)
(9/15) Installing libpanelw (6.4_p20240420-r2)
(10/15) Installing readline (8.2.10-r0)
(11/15) Installing sqlite-libs (3.45.3-r1)
(12/15) Installing python3 (3.12.7-r0)
(13/15) Installing python3-pycache-pyc0 (3.12.7-r0)
(14/15) Installing pyc (3.12.7-r0)
(15/15) Installing python3-pyc (3.12.7-r0)
Executing busybox-1.36.1-r29.trigger
Executing glibc-bin-2.33-r0.trigger
/usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-x86-64.so.2 is not a symbolic link

1 error; 76 MiB in 48 packages
```

それでは、*python3* を使って仮想環境を作成します。
ここでの仮想環境の名前は *awscli-venv* です。
```bash:仮想環境作成
/app　# python3 -m venv awscli-venv
```

```bash:仮想環境の有効化
/app　# source awscli-venv/bin/activate
```

# AWS CLIのインストール
仮想環境内に *AWS CLI* をインストールします。
```bash:pip install
(awscli-venv) /app　# pip install awscli
Collecting awscli
  Downloading awscli-1.36.8-py3-none-any.whl.metadata (11 kB)
Collecting botocore==1.35.67 (from awscli)
  Downloading botocore-1.35.67-py3-none-any.whl.metadata (5.7 kB)
Collecting docutils<0.17,>=0.10 (from awscli)
  Downloading docutils-0.16-py2.py3-none-any.whl.metadata (2.7 kB)
Collecting s3transfer<0.11.0,>=0.10.0 (from awscli)
  Downloading s3transfer-0.10.4-py3-none-any.whl.metadata (1.7 kB)
Collecting PyYAML<6.1,>=3.10 (from awscli)
  Downloading PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl.metadata (2.1 kB)
Collecting colorama<0.4.7,>=0.2.5 (from awscli)
  Downloading colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)
Collecting rsa<4.8,>=3.1.2 (from awscli)
  Downloading rsa-4.7.2-py3-none-any.whl.metadata (3.6 kB)
Collecting jmespath<2.0.0,>=0.7.1 (from botocore==1.35.67->awscli)
  Downloading jmespath-1.0.1-py3-none-any.whl.metadata (7.6 kB)
Collecting python-dateutil<3.0.0,>=2.1 (from botocore==1.35.67->awscli)
  Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
Collecting urllib3!=2.2.0,<3,>=1.25.4 (from botocore==1.35.67->awscli)
  Downloading urllib3-2.2.3-py3-none-any.whl.metadata (6.5 kB)
Collecting pyasn1>=0.1.3 (from rsa<4.8,>=3.1.2->awscli)
  Downloading pyasn1-0.6.1-py3-none-any.whl.metadata (8.4 kB)
Collecting six>=1.5 (from python-dateutil<3.0.0,>=2.1->botocore==1.35.67->awscli)
  Downloading six-1.16.0-py2.py3-none-any.whl.metadata (1.8 kB)
Downloading awscli-1.36.8-py3-none-any.whl (4.5 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.5/4.5 MB 84.8 MB/s eta 0:00:00
Downloading botocore-1.35.67-py3-none-any.whl (13.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.0/13.0 MB 91.6 MB/s eta 0:00:00
Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Downloading docutils-0.16-py2.py3-none-any.whl (548 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 548.2/548.2 kB 25.0 MB/s eta 0:00:00
Downloading PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl (756 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 756.6/756.6 kB 34.5 MB/s eta 0:00:00
Downloading rsa-4.7.2-py3-none-any.whl (34 kB)
Downloading s3transfer-0.10.4-py3-none-any.whl (83 kB)
Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)
Downloading pyasn1-0.6.1-py3-none-any.whl (83 kB)
Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Downloading urllib3-2.2.3-py3-none-any.whl (126 kB)
Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: urllib3, six, PyYAML, pyasn1, jmespath, docutils, colorama, rsa, python-dateutil, botocore, s3transfer, awscli
Successfully installed PyYAML-6.0.2 awscli-1.36.8 botocore-1.35.67 colorama-0.4.6 docutils-0.16 jmespath-1.0.1 pyasn1-0.6.1 python-dateutil-2.9.0.post0 rsa-4.7.2 s3transfer-0.10.4 six-1.16.0 urllib3-2.2.3

[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: pip install --upgrade pip
```

# PATH環境変数に仮想環境のパスを追加
仮想環境の *bin* ディレクトリを **PATH** 環境変数に追加します。
これにより、仮想環境内の *aws* コマンドをシステム全体で使えるようにします。
```bash:PATH 環境変数へ追加
(awscli-venv) /app　# export PATH=$PATH:/app/awscli-venv/bin
```

# 永続的にPATHを設定
上記のPATH設定を *~/.bashrc* に追記します。
これにより、シェルを再起動しても仮想環境が認識されます。
```bash:PATH設定
(awscli-venv) /app　# echo 'export PATH=$PATH:/app/awscli-venv/bin' >> ~/.bashrc
```

# ~/.bashrc の変更を反映
新しく追加した **PATH** 設定を反映します。
```bash:PATH設定反映
(awscli-venv) /app　# source ~/.bashrc
```

# AWS CLIのバージョン確認
*AWS CLI* が正常にインストールされたかを確認します。
バージョン番号が出力されれば成功です。
```bash:バージョン確認
(awscli-venv) /app　# aws --version
```

# おわりに
この方法によって *Python* の仮想環境を使って *AWS CLI* をインストールし、仮想環境内で利用できるようにセットアップしています。また、**PATH** を通して仮想環境を抜けた後でも利用できるようにしています。
この方法によって、*AWS CLI* のインストールや依存関係の影響をシステム全体から分離することができます。