Pythonパッケージをwhlファイルを使ってインストールする

# 背景・目的
インターネットに接続できない環境で、Wheelファイルを使用することでPythonのパッケージのインストールが可能です。
今回は、IGWがアタッチされていない環境でEC2に、boto3をインストールします。

# まとめ
- pipを使わずに、whlファイルを使ってインストールします。

# 概要
## Wheelファイルとは？
[PEP427](https://peps.python.org/pep-0427/)を参照すると、以下のように書かれています。

> wheel は、特別な形式のファイル名と .whl 拡張子を持つ ZIP 形式のアーカイブです。特定のインストールスキームで PEP 376 に従ってインストールされるのとほぼ同じ単一のディストリビューションが含まれています。専用のインストーラーが推奨されますが、標準の「unzip」ツールを使用してサイト パッケージに展開するだけでホイール ファイルをインストールできます。

- Wheelは、ZIP形式のアーカイブのこと。拡張子は、「.whl」。


# 実践
インターネットが繋がるPC上で、whlファイルをダウンロードし一旦S3に配置後、EC2からダウンロードしインストールします。

## whlファイルのダウンロード
インターネットが繋がるPCで、boto3と関連するファイルをダウンロードし、S3にアップロードします。

```
curl https://files.pythonhosted.org/packages/23/d8/3b41ce8c96dedbb449f24de21eee0742786f414fea176f984b1101154f30/boto3-1.24.84-py3-none-any.whl -O
curl https://files.pythonhosted.org/packages/36/32/6ddb12143e32535550263514875db6d1a3ad50daf1377fbb1aac03a000aa/botocore-1.27.84-py3-none-any.whl -O
curl https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl -O
curl https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl -O
curl https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl -O
curl https://files.pythonhosted.org/packages/6f/de/5be2e3eed8426f871b170663333a0f627fc2924cc386cd41be065e7ea870/urllib3-1.26.12-py2.py3-none-any.whl -O

aws s3 cp boto3-1.24.84-py3-none-any.whl s3://${バケット名}/ec2/
aws s3 cp botocore-1.27.84-py3-none-any.whl s3://${バケット名}/ec2/
aws s3 cp jmespath-1.0.1-py3-none-any.whl s3://${バケット名}/ec2/
aws s3 cp python_dateutil-2.8.2-py2.py3-none-any.whl s3://${バケット名}/ec2/
aws s3 cp six-1.16.0-py2.py3-none-any.whl s3://${バケット名}/ec2/
aws s3 cp urllib3-1.26.12-py2.py3-none-any.whl s3://${バケット名}/ec2/
```

## インストール
EC2にログインし、先程、アップロードしたファイルをS3からダウンロード後、インストールします。
```
aws s3 cp s3://${バケット名}/ec2/boto3-1.24.84-py3-none-any.whl /home/ssm-user/
aws s3 cp s3://${バケット名}/ec2/botocore-1.27.84-py3-none-any.whl /home/ssm-user/
aws s3 cp s3://${バケット名}/ec2/mespath-1.0.1-py3-none-any.whl /home/ssm-user/
aws s3 cp s3://${バケット名}/ec2/python_dateutil-2.8.2-py2.py3-none-any.whl  /home/ssm-user/
aws s3 cp s3://${バケット名}/ec2/six-1.16.0-py2.py3-none-any.whl  /home/ssm-user/
aws s3 cp s3://${バケット名}/ec2/urllib3-1.26.12-py2.py3-none-any.whl  /home/ssm-user/


sh-4.2$ pwd
/home/ssm-user
sh-4.2$ ls -l
total 9528
-rw-r--r-- 1 ssm-user ssm-user  132500 Oct  1 15:13 boto3-1.24.84-py3-none-any.whl
-rw-r--r-- 1 ssm-user ssm-user 9189276 Oct  1 15:46 botocore-1.27.84-py3-none-any.whl
-rw-r--r-- 1 ssm-user ssm-user   20256 Oct  1 15:53 jmespath-1.0.1-py3-none-any.whl
-rw-r--r-- 1 ssm-user ssm-user  247702 Oct  1 15:58 python_dateutil-2.8.2-py2.py3-none-any.whl
-rw-r--r-- 1 ssm-user ssm-user   11053 Oct  1 16:05 six-1.16.0-py2.py3-none-any.whl
-rw-r--r-- 1 ssm-user ssm-user  140381 Oct  1 16:09 urllib3-1.26.12-py2.py3-none-any.whl
sh-4.2$

pip3 install  --no-deps ./boto3-1.24.84-py3-none-any.whl
pip3 install  --no-deps ./botocore-1.27.84-py3-none-any.whl
pip3 install  --no-deps ./mespath-1.0.1-py3-none-any.whl
pip3 install  --no-deps ./python_dateutil-2.8.2-py2.py3-none-any.whl
pip3 install  --no-deps ./six-1.16.0-py2.py3-none-any.whl
pip3 install  --no-deps ./urllib3-1.26.12-py2.py3-none-any.whl

sh-4.2$ pip3 list
Package           Version
----------------- -------
aws-cfn-bootstrap 2.0
boto3             1.24.84
botocore          1.27.84
docutils          0.14
jmespath          1.0.1
lockfile          0.11.0
pip               20.2.2
pystache          0.5.4
python-daemon     2.2.3
python-dateutil   2.8.2
setuptools        49.1.3
simplejson        3.2.0
six               1.16.0
urllib3           1.26.12
sh-4.2$

```

# 考察
インターネットに繋がらない環境で、環境を構築することはたまにあります。
忘れないようにメモとして残しておきます。

# 参考
https://peps.python.org/pep-0427/

https://pypi.org/project/boto3/#files