【AWS】決定版！最速でpython3.7仮想環境を１から構築


##はじめに

今回初めてVPCとEC2を触り、python3.7仮想環境を作成するところまで実施したため、皆さんにナレッジを共有します。(全て無料枠内です。)

ちなみにアーキテクトは以下です。超絶シンプル。
![Untitled Diagram.drawio-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/71c1237f-87b2-beb9-1827-fb3812a94822.png)


##アジェンダ
1. VPC作成&設定
2. EC2作成&設定
3. EC2にPython3.7仮想環境構築


## 1. VPC作成&設定

大まかな流れとしては、以下です。
①VPC作成
②VPC内にパブリックサブネットを作成
③インターネットゲートウェイを作成し、VPCに結びつける
④ルートテーブルを作成し、パブリックサブネットに割り当て
⑤ルートテーブルのデフォルトゲートウェイを、インターネットゲートウェイに設定

###①VPC作成

・VPC(Virtual Private Cloud)とは？
AWS上に作るプライベートなネットワーク環境。

(1)AWSマネジメントコンソールからVPCを開いて、以下の手順を実施。
<img width=100% alt="makeVPC1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/8db85bd1-fb83-7371-08d2-39bb0c59477d.png">

(2)以下を入力。

| 項目      |       値 |
:-----------------|:------------------|
| 名前タグ             |              任意の名前 | 
| IPv4 CIDR ブロック           |            192.168.0.0/16(プライベートIPアドレス[^1]なら他でもOK) |
| IPv6 CIDR ブロック           |            デフォルト |
| テナンシー          |            デフォルト |

<img width=100% alt="makeVPC1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/c5d039cf-57ce-874f-b500-7f049e0de9b4.png">

(3)完成!!
<img width=100% alt="makeVPC1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/25d422d3-419c-bdbc-e2a2-21fbcb5d78fa.png">


###②VPC内にパブリックサブネットを作成
・サブネットとは？
ネットワークをさらに分割したネットワークのこと。

(1)以下の手順を実施。
![全画面_2019_10_15_20_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/511dfb9f-c9f1-97fb-6f90-f6f5174456a5.png)

(2)サブネットのCIDRブロック等を入力。以下を参考。

| 項目      |       値 |
:-----------------|:------------------|
| 名前タグ             |              任意の名前 | 
| VPC           |            先ほど作成したVPC |
| アベイラビリティーゾーン           |            デフォルト |
| IPv4 CIDR ブロック          |            192.168.1.0/24(VPCのIPアドレスを分割した値であればOK) |


![全画面_2019_10_15_20_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/32fa3e4c-a30d-0655-3055-cb65b98cdadc.png)


(３)完成！！
![全画面_2019_10_15_21_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/9b20ad99-1f9d-47ea-e58a-b9f3165d47ae.png)


###③インターネットゲートウェイを作成し、VPCに結びつける

・インターネットゲートウェイとは？
VPC内のインスタンスとインターネットとの間の通信を可能にするVPCのコンポーネント。

(1)インターネットゲートウェイを作成。
![全画面_2019_10_21_14_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/1f477952-8003-43b0-b73f-ab0be69a162a.png)
![全画面_2019_10_21_14_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/c65aaf59-bdbc-4710-bbb2-c2090fc935e1.png)

(２)インターネットゲートウェイをVPCに結びつける。
![全画面_2019_10_21_14_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/aa84f299-392e-9ece-e9bc-3669e9820eab.png)
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/f75ea0cf-6904-81e3-d0ed-5d6b4305f293.png)

(３)完成！！
![全画面_2019_10_21_14_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/adfb3ce7-89cc-a079-cc2b-1d8e25942486.png)

###④ルートテーブルを作成し、パブリックサブネットに割り当てる。

・ルートテーブルとは？
通信をどこに流すかを定義するための情報。AWSではルートテーブルを各サブネットに関連付けする。

サブネットにはデフォルトで、VPCのデフォルトのルートテーブルのみ適用されている。（今回では、192.168.0.0/16のみ送信可能の状態。）
そのため、ここではインターネットゲートウェイにパケットを送信するように設定する。

（１）VPCにルートテーブルを作成。
![全画面_2019_10_21_15_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/55fe7805-f03e-a683-1a45-281ac0efa559.png)

| 項目      |       値 |
:-----------------|:------------------|
| 名前タグ             |              任意の名前 | 
| VPC           |            先ほど作成したVPC |

![全画面_2019_10_21_15_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/5e81bd32-88ff-b564-9a9e-3bccb6c1a1a0.png)
![全画面_2019_10_21_15_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/67f26086-1e18-8400-af38-2c07c1d29bcd.png)


（２）ルートテーブルをパブリックサブネットに割り当てる。
![全画面_2019_10_21_15_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/70e3e887-2165-311e-e061-4c142b094331.png)
![全画面_2019_10_21_15_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/0d594663-5135-e121-9d85-4f3baa24bb81.png)
![全画面_2019_10_21_15_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/64c13da0-4267-09cd-c42f-aa6b54e7139f.png)


###⑤ルートテーブルのデフォルトゲートウェイを、インターネットゲートウェイに設定

・デフォルトゲートウェイとは？
ネットワークから外部のネットワークに接続する際、通信の出入り口となるもの。

（１）ルートテーブルのルートを編集。
![全画面_2019_10_21_15_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/c18bf0d4-9532-8d0f-37a8-e1647ad04a0b.png)

（２）送信先に全てのIPアドレス範囲を示す「0.0.0.0/0」、ターゲットにインターネットゲートウェイ（igw-XXX）を指定。
![全画面_2019_10_21_15_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/5ac889f9-c1be-b1df-5660-918c92cb4810.png)

（３）完成！！
![全画面_2019_10_21_15_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/45c02719-30d7-83f1-4613-de364c356eb2.png)
![全画面_2019_10_21_15_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/7b1059da-a7af-7632-3186-14fe7741b357.png)

##2. EC2作成&設定

大まかな流れとしては、以下です。
①AMIを選択
②インスタンスタイプを選択
③インスタンスの詳細情報を設定
④ストレージを設定
⑤インスタンスの名前付け
⑥セキュリティグループの設定
⑦設定を確認し、EC2ログインするための秘密鍵をダウンロード

###①AMIを選択
・AMIとは？
ソフトウェア構成(オペレーティングシステム、アプリケーションサーバー、アプリケーションなど)を記録したテンプレート。

AWSマネジメントコンソールからEC2を開いて、以下の手順を実施。
![全画面_2019_10_21_18_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/440e5174-ad92-83bd-b54e-ee2729932ef9.png)
今回はLinux2を選択。
![全画面_2019_10_21_18_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/a99aa584-31db-761a-08e9-519e0283afa4.png)

###②インスタンスタイプを選択
![全画面_2019_10_21_18_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/886bb2bb-af22-0db6-aff4-678f20ea7db6.png)

###③インスタンスの詳細情報を設定
以下の項目を入力。残りの項目はデフォルトのままでOK。

| 項目      |       値 |
:-----------------|:------------------|
| ネットワーク             |              作成したVPC | 
| サブネット           |            作成したパブリックサブネット |
| 自動割り当てパブリックIP            |              有効化[^2] | 
| プライマリIP(→プライベートIPアドレス)           |            192.168.1.10 |

![merge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/df188174-7816-0592-9e4f-21c8597646bb.png)

###④ストレージを設定
デフォルトのままで何も変更しない。
![全画面_2019_10_21_18_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/6d6bea0c-79f8-c794-2d83-62ff3df44148.png)

###⑤インスタンスの名前付け
任意のキー名/値でOK。
![全画面_2019_10_21_18_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/ffa367f0-c46f-2e97-9306-21788f621c94.png)

###⑥セキュリティグループの設定
・セキュリティグループとは？
所謂、ファイアウォールのこと。デフォルトでは、SSH(22)というプロトコルでどこからでも接続可能になっている。<br>SSHは後続でPython環境構築する際、PCからEC2にアクセスする時に用いる。

任意のセキュリティグループ名でOK。
![全画面_2019_10_21_18_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/1fe57dbe-ade1-8645-04a3-14f7ed2eda25.png)

###⑦設定を確認し、EC2ログインするための秘密鍵をダウンロード
![全画面_2019_10_21_18_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/d897dd7a-7b29-e226-af9a-04e711684ccd.png)
任意のキーペア名でOK。秘密鍵は一度失くすと再発行不可のため大切に保管する。
１度秘密鍵を作ると、他にEC2を立ち上げる時も共有で利用可能。
![全画面_2019_10_21_19_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/0a6eabbe-4b3b-dade-915f-78902d2e8dab.png)

設定完了！！
![全画面_2019_10_21_19_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/4a19c7b1-c46d-09e9-ad27-4ca4c3c75379.png)
![全画面_2019_10_21_19_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/b426607e-224a-6d1c-4e87-1105d048b588.png)

##3. Python3.7仮想環境作成
Amazon Linux2ではデフォルトで python2.7系がインストールされていますが、
今回はpython3.7の仮想環境を作成していきます。

大まかな流れとしては、以下です。
①秘密鍵を使い、AWSのEC2にSSH接続
②環境構築に必要なパッケージをインストール
③pyenvのインストール
④pyenv-virtualenvのインストール
⑤ライブラリをインストール(任意)

###①秘密鍵を使い、AWSのEC2にSSH接続

まずはEC2のパブリックIPアドレスを確認。
![全画面_2019_10_22_14_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/6fea2f26-7900-03ed-e481-7d2119c29d51.png)

そしてsshコマンドで接続する。

```shell

//1.秘密鍵をホームユーザー配下に格納
$ mv test-my-key.pem.txt ~/.ssh

//2.秘密鍵の権限変更
$ chmod 400 ~/.ssh/test-my-key.pem.txt 

//3.sshでEC2に接続
$ sudo ssh -i ~/.ssh/test-my-key.pem.txt ec2-user@EC2のパブリックIPアドレス
```

Amazon Linux2のデフォルトのユーザー名は「ec2-user」のため、ec2-userを指定。
sshに成功したら以下が表示される。

```shell

$ sudo ssh -i ~/.ssh/test-my-key.pem.txt ec2-user@EC2のパブリックIPアドレス

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
15 package(s) needed for security, out of 31 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-192-168-1-10 ~]$
```

###②環境構築に必要なパッケージをインストール

コンパイラ、暗号化、圧縮、コマンドラインなどのライブラリをインストールします。

```shell

$ sudo yum -y install gcc gcc-c++ make git openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel libffi-devel
```

###③pyenvのインストール
・pyenvとは？
Pythonのバージョン管理を行なうコマンドラインツールで、複数のバージョンのPythonのインストールや切り替えが容易に可能。

Gitからインストール。

```shell

$ sudo git clone https://github.com/yyuu/pyenv.git /usr/bin/.pyenv
$ sudo mkdir /usr/bin/.pyenv/shims
$ sudo mkdir /usr/bin/.pyenv/versions
$ sudo chown -R ec2-user:ec2-user /usr/bin/.pyenv
```

環境変数の設定を行う。

```shell

$ vi ~/.bashrc
---------------------以下を追記
export PYENV_ROOT="/usr/bin/.pyenv"
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
-----------------------------
 
//設定変更を反映
$ source ~/.bashrc
```
python3.7.3のインストール。

```shell

//インストール可能なバージョンを確認
$ pyenv install --list

//今回は3.7.3をインストール
$ pyenv install 3.7.3

//インストール済みのバージョン一覧
$ pyenv versions

//pythonのバージョン確認。インストールしても2.7のまま。
$ python -V
Python 2.7.16
```

ちなみに以下で、EC2で利用するデフォルトのバージョンの設定が可能。

```shell

//3.7.3バージョンへ切り替え
$ pyenv global 3.7.3
```


###④pyenv-virtualenvのインストール
・pyenv-virtualenvとは？
分離されたPython環境を作成するツール。環境ごとに違うパッケージを入れることが可能。

Gitからインストール。

```shell

$ git clone https://github.com/yyuu/pyenv-virtualenv.git /usr/bin/.pyenv/plugins/pyenv-virtualenv
```

環境変数の設定を行う。

```shell

$ vi ~/.bashrc
---------------------以下を追記
eval "$(pyenv virtualenv-init -)"
-----------------------------
 
//設定変更を反映
$ source ~/.bashrc
```
python3.7.3仮想環境を作成

```shell

//バージョンpython3.7.3の仮想環境（名前：python3.7）を作成
$ pyenv virtualenv 3.7.3 python3.7

//カレントディレクトリにpython3.7.3の仮想環境を適用
$ pyenv local python3.7

//バージョン確認
(python3.7)$ python --version
Python 3.7.3

//仮想環境を設定していないディレクトリに移動すると、EC2デフォルトのバージョン
(python3.7)$ cd ~
$ python --version
Python 2.7.16
```

ちなみに仮想環境の削除は以下。

```shell

$ pyenv uninstall python3.7
```

###⑤ライブラリをインストール(任意)


```shell

//EC2のデフォルトではpipのバージョンが古いためアップグレード
$ pip install --upgrade pip

//任意のパッケージをインストール
$ pip3 install numpy
$ pip3 install sklearn

//ライブラリの格納先確認
$ pip3 show numpy
```


##終わりに

基本的かつ単純なアーキテクトなので、まだVPCとEC2に触ってみたことがない人はぜひ挑戦してみて下さい。
このアーキテクトに、プライベートサブネットを追加してEC2にDBをインストールするなど、色々と自分でカスタマイズもできます。

参考文献
・[Amazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/Amazon-Web-Services-基礎からのネットワーク-サーバー構築/dp/4822237443/ref=sr_1_2?adgrpid=58767793648&gclid=Cj0KCQjwuZDtBRDvARIsAPXFx3Csmk3ZkfD6JaXb23rSAkD66ZYPuHTCwPLruGQJulLNYctQjja2NPcaAk74EALw_wcB&hvadid=338546177887&hvdev=c&hvlocphy=1028853&hvnetw=g&hvpos=1t1&hvqmt=b&hvrand=4937903279423927182&hvtargid=kwd-302394876719&hydadcr=15815_11177318&jp-ad-ap=0&keywords=aws+本&qid=1571041531&sr=8-2)
・[Python開発環境構築](https://qiita.com/kazuya-s@github/items/5d77bc5647dec8780251)

[^1]: 10.0.0.0～10.255.255.255<br>172.16.0.0～172.31.255.255<br>192.168.0.0～192.168.255.255

[^2]: EC2が起動されるたびに、ランダムでIPアドレスが変わる。<br>Elastic IP（静的IP）で、IPアドレスを固定化できるが、EC2が止まっている時に別途費用がかかる。