LoginSignup
17
30

More than 5 years have passed since last update.

AWSでNATインスタンス構築

Last updated at Posted at 2019-01-22

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インスタンスを構築
  • 開発用インスタンスには踏み台サーバー経由でログインする
  • 費用は出来るだけ抑える

ネットワーク構成

ネットワーク構成図.png

AWS シンプルアイコンを使って書きました。
旧式と比べて随分シンプルになりました。

NAT構成の種類

2種類ありますが、費用を抑えるために今回は1.を採用しました。

1. NATインスタンス
2. NATゲートウェイ

1.はEC2を構築するやり方、自前運用でカスタマイズ性が高い。
2.はAWSで用意しているゲートウェイを使うやり方で、運用が楽。

料金 (アジアパシフィック (東京)、2019/01/20時点)は、
1. 0.0068USD/時間 (t3.nanoで構築する場合)
2. 0.062USD/時間

構築手順

AWSマネージメントコンソール (ブラウザ)から行いました。
リージョンは、アジアパシフィック (東京)です。

ネットワークの設定

インスタンスを作成する前に、ネットワークの設定を整えました。
設定値は末尾に記載します。

  1. VPCの作成
  2. サブネットの作成
  3. インターネットゲートウェイの作成
  4. ルートテーブルの作成 (サブネットに割り付ける)
  5. ネットワークACLの作成 (サブネットに割り付ける)
  6. セキュリティグループの作成 (後でインスタンスに割り付ける)

インスタンスの作成

インスタンス 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
17
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
30