Amazon Linuxでpyminizipがインストールできない

##本記事について
__[AWS Lambda実践ガイド](https://www.amazon.co.jp/gp/product/B0764C5MT5/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)__に従ってEC2インスタンス（Amazon linux）上でPythonの環境構築を行おうとしたところ、`pyminizip`ライブラリがインストールできない事態に遭遇したので備忘録として残しておきます。

##事象
####「pyminizip」ライブラリがインストールできない

インストールしようとすると、以下のエラーが発生する状況でした。

```
ModuleNotFoundError: No module named '_ctypes'
```

##解決策
__「libffi-devel」をインストールし、Pythonを再インストール__で解決しました。
細かな手順は下の方に載せてます。

##原因
__「ctypes」モジュールがインストールされていなかった__ことが原因でした。
エラーメッセージにそのまま書いてあったのですが、よく読まずに適当にググったせいで時間が掛かってしまいました。反省...。

あと、Pythonインストール時のログにしっかり残っていました。
Successfullyって表示されてたのみて__「よっしゃ次！」__ってやっちゃったのが結果的に良くなかったようです。

```
Failed to build these modules:
_ctypes
```

##エラー発生から解決までの道のり
※EC2インスタンスにSSH接続してからの手順のみ記載します。

####1. Pythonインストール

```
=== ビルドに必要なライブラリをインストール ===
$ sudo yum -y groupinstall 'Development tools'
$ sudo yum -y install zlib-devel openssl-devel

=== 作業用ディレクトリにソースコードをダウンロード ===
$ mkdir python3.7
$ cd python3.7
$ wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz

=== ソースコードを展開してビルド&インストール ===
$ tar zxvf Python-3.7.9.tgz
$ cd Python-3.7.9
$ ./configure
$ make
$ sudo make install

=== virtualenvのインストール ===
$ sudo /usr/local/bin/pip3.7 install virtualenv
```

####2. 仮想環境（Lambda開発用）構築

```
=== 開発用ディレクトリを作成 ===
$ /usr/local/bin/virtualenv -p python3.7 directoryName

=== 作成した仮想環境に切り替え ===
$ cd encryptfile
$ source bin/activate

※以下のように切り替わればOK
(encryptfile)[ec2-user@ip-xx-xx-xx-xx encryptfile]$
```

###3. ライブラリのインストール（ここでエラー）

```
=== boto3のインストール === 
$ pip install boto3

=== pyminizipのインストール ===
$ sudo yum install -y gcc zlib-devel
$ pip install pyminizip
```

`pip install pyminizip`で以下のエラーが発生しました。

```
    ERROR: Command errored out with exit status 1:
     command: /home/ec2-user/encryptfile/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-9wsdjk4f/pyminizip/setup.py'"'"'; __file__='"'"'/tmp/pip-install-9wsdjk4f/pyminizip/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-1l6ds8e7
         cwd: /tmp/pip-install-9wsdjk4f/pyminizip/
    Complete output (13 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/home/ec2-user/encryptfile/lib/python3.7/site-packages/setuptools/__init__.py", line 18, in <module>
        from setuptools.dist import Distribution
      File "/home/ec2-user/encryptfile/lib/python3.7/site-packages/_virtualenv.py", line 89, in exec_module
        old(module)
      File "/home/ec2-user/encryptfile/lib/python3.7/site-packages/setuptools/dist.py", line 32, in <module>
        from setuptools import windows_support
      File "/home/ec2-user/encryptfile/lib/python3.7/site-packages/setuptools/windows_support.py", line 2, in <module>
        import ctypes
      File "/usr/local/lib/python3.7/ctypes/__init__.py", line 7, in <module>
        from _ctypes import Union, Structure, Array
    ModuleNotFoundError: No module named '_ctypes'
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```

要所だけ抜粋すると、

```
ModuleNotFoundError: No module named '_ctypes'
```

「ctypes」モジュールが存在しない、というエラーが発生していることが確認できる。
ということで、ctypesをインストールしてリトライ...しようとしたのですが、色々調べてみたところ、どうやらPythonの再インストールが必要だということが分かりました（Pythonアンインストール → ctypesインストール → Python再インストールという流れ）。

ここにたどり着くまでに長い時間を要してしまい、__俺の体はボドボド__だったので、手っ取り早くインスタンスごと作り直すことにしました。

- __参考（これがなければ死んでいた）__<br>
[pipでのuWSGIのインストールが”ModuleNotFoundError: No module named ‘_ctypes'”で失敗する](https://katsuwosashimi.com/archives/371/python-pip-uwsgi-ctypes-not-found/)<br>
[aws nginx、各種パッケージインストール、rubyインストール、mysql　（小難しい権限取得とかは省いたよ）](https://qiita.com/KoyoIshikawa/items/d30c4132d17df67737a0)

####4. EC2インスタンス再作成
手順は省略。

- AMI：Amazon Linux2（64bit x86）
- インスタンスタイプ：t2.micro
- ストレージ：汎用SSD 8GB

作成後、Tera TermでSSH接続。

####5. Python再インストール

「libffi-devel」ライブラリのインストールが追加された以外は 1. と同じ

```
=== ビルドに必要なライブラリをインストール ===
$ sudo yum -y groupinstall 'Development tools'
$ sudo yum -y install zlib-devel openssl-devel

=== ctypes（libffi-devel）のインストール ===
$ sudo yum -y install libffi-devel

=== 作業用ディレクトリにソースコードをダウンロード ===
$ mkdir python3.7
$ cd python3.7
$ wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz

=== ソースコードを展開してビルド&インストール ===
$ tar zxvf Python-3.7.9.tgz
$ cd Python-3.7.9
$ ./configure
$ make
$ sudo make install

=== virtualenvのインストール ===
$ sudo /usr/local/bin/pip3.7 install virtualenv
```

####6. 仮想環境（Lambda開発用）構築

ここは 2. と全く同じ

```
=== 開発用ディレクトリを作成 ===
$ /usr/local/bin/virtualenv -p python3.7 directoryName

=== 作成した仮想環境に切り替え ===
$ cd encryptfile
$ source bin/activate

※以下のように切り替わればOK
(encryptfile)[ec2-user@ip-xx-xx-xx-xx encryptfile]$
```

###7. ライブラリのインストール

問題の箇所。今度は成功するのか...。

```
=== boto3のインストール === 
$ pip install boto3

=== pyminizipのインストール ===
$ sudo yum install -y gcc zlib-devel
$ pip install pyminizip
```

__結果__

```
Collecting pyminizip
  Downloading pyminizip-0.2.4.tar.gz (258 kB)
     |????????????????????????????????| 258 kB 19.7 MB/s
Building wheels for collected packages: pyminizip
  Building wheel for pyminizip (setup.py) ... done
  Created wheel for pyminizip: filename=pyminizip-0.2.4-cp37-cp37m-linux_x86_64.whl size=210022 sha256=91f751ffbc533887b8ead3cae792e470b674a2d47e2a83d31b99c346caf1b993
  Stored in directory: /home/ec2-user/.cache/pip/wheels/07/6d/5f/fbd11be9c22eaa294d53a9d2ac439d80e7b586b2e1ef9318f5
Successfully built pyminizip
Installing collected packages: pyminizip
Successfully installed pyminizip-0.2.4
```

__やったああああああああああああ！！！！！！！！__

##おわりに
初心者なので参考書通りにやってうまくいかないと死にそうになりますが、あきらめない気持ちが大切ですね。インターネットは広いので、どこかに情報は載っているものです。
メッセージをちゃんと読めば原因がすぐにわかるタイプのエラーだったのも幸いでした。

在宅でトラブルシュートがうまくいった時って奇声あげがちですよね。
会社だと奇声あげられないのでメガネクイッくらいですけど。