AWSでNATインスタンスを構築してPython3をインストール。
AWSで開発環境、兼、Webサーバーを構築中のメモ。
参考になる資料が既に多く存在しているので、自分用の備忘録として書いています。
[参考資料]
NAT インスタンス - Amazon Virtual Private Cloud
NAT インスタンスと NAT ゲートウェイの比較 - Amazon Virtual Private Cloud
AWS NAT構成の作り方(NATインスタンス編) - Qiita
AWSで最低限セキュアな構成を組む - Qiita
NATインスタンスとNATゲートウェイの違い - Qiita
今回やったこと
- AWSに開発用インスタンスを構築しPython3をインストール
- 開発用インスタンスを外部に直接公開しないためにNATインスタンスを構築
- 開発用インスタンスには踏み台サーバー経由でログインする
- 費用は出来るだけ抑える
ネットワーク構成

AWS シンプルアイコンを使って書きました。
旧式と比べて随分シンプルになりました。
NAT構成の種類
2種類ありますが、費用を抑えるために今回は**1.**を採用しました。
1. NATインスタンス
2. NATゲートウェイ
1.はEC2を構築するやり方、自前運用でカスタマイズ性が高い。
2.はAWSで用意しているゲートウェイを使うやり方で、運用が楽。
料金 (アジアパシフィック (東京)、2019/01/20時点)は、
1. 0.0068USD/時間 (t3.nanoで構築する場合)
2. 0.062USD/時間
構築手順
AWSマネージメントコンソール (ブラウザ)から行いました。
リージョンは、アジアパシフィック (東京)です。
ネットワークの設定
インスタンスを作成する前に、ネットワークの設定を整えました。
設定値は末尾に記載します。
- VPCの作成
- サブネットの作成
- インターネットゲートウェイの作成
- ルートテーブルの作成 (サブネットに割り付ける)
- ネットワークACLの作成 (サブネットに割り付ける)
- セキュリティグループの作成 (後でインスタンスに割り付ける)
インスタンスの作成
インスタンス | AMI | インスタンスタイプ | ストレージ |
---|---|---|---|
踏み台サーバー | Amazon Linux 2 AMI | t3.nano | 汎用SSD,8GB |
NATインスタンス | amzn-ami-vpc-nat-hvm-2018.03.0.20181116-x86_64-ebs | t3.nano | マグネティック,8GB |
開発用インスタンス | Amazon Linux 2 AMI | t3.medium | 汎用SSD,32GB |
*1 踏み台サーバーとNATインスタンスの自動割り当てパブリック IPは"有効化"
*2 Capacity Reservationは"なし"
*3 T2/T3 Unlimitedは"無効化"
インスタンス作成後の設定変更
- NATインスタンスの送信元/送信先のチェックを無効にする
- Private Subnet1のルートテーブルを変更し、デフォルトゲートウェイにNATインスタンスを追加
疎通チェック
自宅PCから踏み台サーバーにログインして、VPC内インスタンスにping
ssh -i ./~~~.pem ec2-user@${IPアドレス}
ping {IPアドレス}
開発用インスタンスにログインし、インターネットに接続できるか確認
ssh -i ./~~~.pem ec2-user@${IPアドレス}
curl {WebサイトのURL}
Python3のインストール
Amazon Linux 2にインストールされているPythonのバージョンを確認
$ python --version
Python 2.7.14
Python3をインストール
$ sudo yum install python3
(中略)
$ python3 --version
Python 3.7.1
手順は以上。
[メモ]
メモ1 : ネットワークACLとセキュリティグループ
詳しくはネットを調べると色々と情報が出てきますが、
ネットワークACLは、サブネット単位で動作するファイアウォール。
セキュリティグループは、インスタンス単位で動作するファイアウォール。
今回の構成であれば、ネットワークACLは無しで、セキュリティグループのみでも良かったです。
ですが、今回は練習も兼ねて、ネットワークACLも設定しました。
[参考資料]
セキュリティ - Amazon Virtual Private Cloud
AWSのネットワークACLとセキュリティグループの違い - プログラマでありたい
メモ2:yumのリポジトリ確認
$ yum repolist all
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
リポジトリー ID リポジトリー名 状態
amzn2-core/2/x86_64 Amazon Linux 2 core repository 有効: 16,077
amzn2-core-debuginfo/2/x86_64 Amazon Linux 2 core repository 無効
amzn2-core-source/2 Amazon Linux 2 core repository 無効
amzn2extra-docker/2/x86_64 Amazon Extras repo for docker 有効: 9
amzn2extra-docker-debuginfo/2/x86_64 Amazon Extras debuginfo repo f 無効
amzn2extra-docker-source/2 Amazon Extras source repo for 無効
repolist: 16,086
メモ3:Amazon Linux2のリポジトリに登録されているPython3を確認
$ yum list | grep python3
python3.x86_64 3.7.1-9.amzn2.0.1 amzn2-core
python3-Cython.x86_64 0.27.3-2.amzn2.0.2 amzn2-core
python3-debug.x86_64 3.7.1-9.amzn2.0.1 amzn2-core
python3-devel.x86_64 3.7.1-9.amzn2.0.1 amzn2-core
python3-libs.i686 3.7.1-9.amzn2.0.1 amzn2-core
python3-libs.x86_64 3.7.1-9.amzn2.0.1 amzn2-core
python3-pip.noarch 9.0.3-1.amzn2.0.1 amzn2-core
python3-rpm-macros.noarch 3-23.amzn2 amzn2-core
python3-setuptools.noarch 38.4.0-3.amzn2.0.6 amzn2-core
python3-test.x86_64 3.7.1-9.amzn2.0.1 amzn2-core
python3-tkinter.x86_64 3.7.1-9.amzn2.0.1 amzn2-core
python3-tools.x86_64 3.7.1-9.amzn2.0.1 amzn2-core
python3-wheel.noarch 0.30.0a0-9.amzn2.0.3 amzn2-core
メモ4:設定値
[1. VPC]
名称 | IPv4 CIDR |
---|---|
Practice VPC | 10.0.0.0/16 |
[2. サブネット]
名称 | IPv4 CIDR |
---|---|
Entrance Subnet | 10.0.0.0/24 |
Public Subnet | 10.0.1.0/24 |
Private Subnet1 | 10.0.2.0/24 |
[4. ルートテーブル]
名称 | Destination | Target |
---|---|---|
Entrance Route Table | 10.0.0.0/16 | local |
0.0.0.0/0 | (インターネットゲートウェイ) | |
Public Route Table | 10.0.0.0/16 | local |
0.0.0.0/0 | (インターネットゲートウェイ) | |
Private Route Table 1 | 10.0.0.0/16 | local |
0.0.0.0/0 | (NATインスタンス) |
[5. ネットワークACL]
[Entrance Network ACL - Inbound]
Rule # | Type | Protocol | Port Range | Source | Allow / Deny |
---|---|---|---|---|---|
100 | SSH (22) | TCP (6) | 22 | 0.0.0.0/0 | ALLOW |
110 | すべての ICMP - IPv4 | ICMP (1) | すべて | 0.0.0.0/0 | ALLOW |
120 | カスタム TCP ルール | TCP (6) | 1024 - 65535 | 0.0.0.0/0 | ALLOW |
* | すべての トラフィック | すべて | すべて | 0.0.0.0/0 | DENY |
[Entrance Network ACL - Outbound]
Rule # | Type | Protocol | Port Range | Source | Allow / Deny |
---|---|---|---|---|---|
100 | SSH (22) | TCP (6) | 22 | 10.0.0.0/16 | ALLOW |
110 | すべての ICMP - IPv4 | ICMP (1) | すべて | 0.0.0.0/0 | ALLOW |
200 | HTTP (80) | TCP (6) | 80 | 0.0.0.0/0 | ALLOW |
210 | HTTPS (443) | TCP (6) | 443 | 0.0.0.0/0 | ALLOW |
220 | カスタム TCP ルール | TCP (6) | 1024 - 65535 | 0.0.0.0/0 | ALLOW |
* | すべての トラフィック | すべて | すべて | 0.0.0.0/0 | DENY |
[Public Network ACL - Inbound]
Rule # | Type | Protocol | Port Range | Source | Allow / Deny |
---|---|---|---|---|---|
100 | SSH (22) | TCP (6) | 22 | 10.0.0.0/24 | ALLOW |
101 | SSH (22) | TCP (6) | 22 | 10.0.1.0/24 | ALLOW |
110 | すべての ICMP - IPv4 | ICMP (1) | すべて | 10.0.0.0/16 | ALLOW |
200 | HTTP (80) | TCP (6) | 80 | 0.0.0.0/0 | ALLOW |
210 | HTTPS (443) | TCP (6) | 443 | 0.0.0.0/0 | ALLOW |
300 | カスタム TCP ルール | TCP (6) | 1024 - 65535 | 0.0.0.0/0 | ALLOW |
* | すべての トラフィック | すべて | すべて | 0.0.0.0/0 | DENY |
[Public Network ACL - Outbound]
Rule # | Type | Protocol | Port Range | Source | Allow / Deny |
---|---|---|---|---|---|
100 | SSH (22) | TCP (6) | 22 | 10.0.0.0/24 | ALLOW |
110 | すべての ICMP - IPv4 | ICMP (1) | すべて | 10.0.0.0/16 | ALLOW |
200 | HTTP (80) | TCP (6) | 80 | 0.0.0.0/0 | ALLOW |
210 | HTTPS (443) | TCP (6) | 443 | 0.0.0.0/0 | ALLOW |
300 | カスタム TCP ルール | TCP (6) | 1024 - 65535 | 0.0.0.0/0 | ALLOW |
* | すべての トラフィック | すべて | すべて | 0.0.0.0/0 | DENY |
[Private Network ACL 1 - Inbound]
Rule # | Type | Protocol | Port Range | Source | Allow / Deny |
---|---|---|---|---|---|
100 | SSH (22) | TCP (6) | 22 | 10.0.0.0/24 | ALLOW |
110 | SSH (22) | TCP (6) | 22 | 10.0.2.0/24 | ALLOW |
110 | すべての ICMP - IPv4 | ICMP (1) | すべて | 10.0.0.0/16 | ALLOW |
200 | カスタム TCP ルール | TCP (6) | 1024 - 65535 | 0.0.0.0/0 | ALLOW |
* | すべての トラフィック | すべて | すべて | 0.0.0.0/0 | DENY |
[Private Network ACL 1 - Outbound]
Rule # | Type | Protocol | Port Range | Source | Allow / Deny |
---|---|---|---|---|---|
100 | SSH (22) | TCP (6) | 22 | 10.0.2.0/24 | ALLOW |
110 | すべての ICMP - IPv4 | ICMP (1) | すべて | 10.0.0.0/16 | ALLOW |
200 | HTTP (80) | TCP (6) | 80 | 0.0.0.0/0 | ALLOW |
210 | HTTPS (443) | TCP (6) | 443 | 0.0.0.0/0 | ALLOW |
300 | カスタム TCP ルール | TCP (6) | 1024 - 65535 | 0.0.0.0/0 | ALLOW |
* | すべての トラフィック | すべて | すべて | 0.0.0.0/0 | DENY |
[6. セキュリティグループ]
[Entrance Security Group - Inbound]
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
SSH | TCP | 22 | 0.0.0.0/0 |
すべての ICMP - IPv4 | すべて | 該当なし | 0.0.0.0/0 |
[Entrance Security Group - Outbound]
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
HTTP | TCP | 80 | 0.0.0.0/0 |
SSH | TCP | 22 | 10.0.0.0/16 |
HTTPS | TCP | 443 | 0.0.0.0/0 |
すべての ICMP - IPv4 | すべて | 該当なし | 0.0.0.0/0 |
[NAT Security Group - Inbound]
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
HTTP | TCP | 80 | 10.0.2.0/24 |
SSH | TCP | 22 | 10.0.0.0/24 |
HTTPS | TCP | 443 | 10.0.2.0/24 |
カスタム ICMP ルール | エコー要求 | 該当なし | 10.0.0.0/24 |
[NAT Security Group - Outbound]
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
HTTP | TCP | 80 | 0.0.0.0/0 |
HTTPS | TCP | 443 | 0.0.0.0/0 |
カスタム ICMP ルール | エコー応答 | 該当なし | 10.0.0.0/24 |
[Private Security Group 1 - Inbound]
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
SSH | TCP | 22 | 10.0.0.0/24 |
SSH | TCP | 22 | 10.0.2.0/24 |
カスタム ICMP ルール | エコー要求 | 該当なし | 10.0.0.0/24 |
すべての ICMP - IPv4 | すべて | 該当なし | 10.0.2.0/24 |
[Private Security Group 1 - Outbound]
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
HTTP | TCP | 80 | 0.0.0.0/0 |
SSH | TCP | 22 | 10.0.2.0/24 |
HTTPS | TCP | 443 | 0.0.0.0/0 |
カスタム ICMP ルール | エコー応答 | 該当なし | 10.0.0.0/24 |
すべての ICMP - IPv4 | すべて | 該当なし | 10.0.2.0/24 |