本記事で構成するVPC
VPC(Virtual Private Cloud)
AWS内部の自分専用のネットワーク。セキュリティの設定などもここに含まれる。
用語
- リージョン:国・地域
- AZ(アベイラビリティゾーン):データセンター
備考
- VPCはリージョンを跨いで作成することはできない。
- 1アカウントにつき、1リージョンに5つまでVPCを作成できる。
サブネット
大きなネットワーク(VPC)を複数の小さなネットワーク(サブネット)に分割することでセキュリティレベルを高めることができる。
備考
- サブネットはAZを跨いで作成することはできない。
- パブリックサブネットとプライベートサブネットの2種類が存在する。(後述)
補足:IPアドレス概要
192.168.0.1
← よく見るこういうヤツ。
実は全部で32ビットのデータで、8ビット毎にピリオドで区切られている。
CIDR表記を用いてIPアドレスをいくつ確保するかを表現する。
/nと書いた場合、$2^{32-n}$通りのIPアドレスを確保したことになる。
CIDR表記 | 表しているもの |
---|---|
10.21.59.223/32 | 10.21.59.223(1通り) |
10.21.59.223/24 | 10.21.59.*(256通り) |
10.21.59.223/16 | 10.21.*.*(65536通り) |
0.0.0.0/0 | 全てのIPアドレス(4294967296通り) |
備考
- VPCのアドレスレンジ帯は/16~/28。
- サブネットのアドレスレンジは/24がおすすめ。
- 十分な量(256個)のIPアドレスを確保できる。
- 第4オクテッドのみを使用するため分かりやすい。
- 最小単位の/28で作成してしまうとELB(Elastic Load Balancing)が配置できない。
- VPCのアドレスレンジは上記のサブネットのアドレスレンジとの兼ね合いを考え、余裕を持って決めると良い。
- VPCのアドレスレンジを
/21
、サブネットのアドレスレンジを/24
とすると、例えば、VPCが10.0.0.0/21
の場合、8つのサブネット(10.0.0.0/24
〜10.0.7.0/24
)を作成することができる。($2^{24-21}=2^3=8$通り)
- VPCのアドレスレンジを
ルートテーブル
サブネットから外に出る通信をどこに向けて発信するかを定義する。
デフォルトでは以下のようになっている。
送信先(このIPアドレスが来たら) | ターゲット(ここに飛ばす) |
---|---|
10.0.0.0/21 | local |
※ local:VPCの内部全てのこと
インターネットゲートウェイとNATゲートウェイ
VPCを外部のネットワーク(インターネット)と接続する際に使用する。
どちらも自動でスケールしてくれる優れモノ。
インターネットゲートウェイ
VPCにアタッチして、VPC内のAWSリソースとインターネットを繋ぐ。
以下のようにルートテーブルに設定し、使用する。
送信先(このIPアドレスが来たら) | ターゲット(ここに飛ばす) |
---|---|
10.0.0.0/21 | local |
0.0.0.0/0 | Internet Gateway |
備考
- 先述の2種類のサブネットは以下のように定義できる。
- パブリックサブネット:インターネットゲートウェイへのルーティングがあるサブネット
- プライベートサブネット:インターネットゲートウェイへのルーティングがないサブネット
NATゲートウェイ
パブリックサブネットに配置して、プライベートサブネットからのインターネット接続を可能にする。
インターネットゲートウェイとは違い、アウトバウンドはできるが、インバウンドはできない。(発信はできるが、外部からのアクセスはできない。)
以下のようにルートテーブルに設定し、使用する。
送信先(このIPアドレスが来たら) | ターゲット(ここに飛ばす) |
---|---|
10.0.0.0/21 | local |
0.0.0.0/0 | NAT Gateway |
備考
- NAT(Network Address Translation)
- NATゲートウェイはインターネットゲートウェイへのルーティングが必要なため、必ずパブリックサブネットに配置して使用する。
ENI(Elastic Network Interface)
EC2インスタンスやNATゲートウェイ等にIPアドレスをアタッチする際、実はENIにIPアドレスを割り当て、それをアタッチ/デタッチしている。
パブリック IPアドレスとElastic IPアドレス
一般に、外部ネットワーク(インターネット)に接続する際は、外部接続用のIPアドレスが必要となる。
AWSの場合、インターネットに接続する際は、外部接続用のIPアドレスとしてパブリック IPアドレスかElastic IPアドレスのどちらかが必要となる。
パブリック IPアドレス
AWSのIPアドレスプールから割り当てられるIPアドレス。
インスタンスが再起動/停止/終了した場合、このアドレスは解放される。
Elastic IPアドレス
AWSアカウントに関連づけられた静的なIPアドレス。
インスタンスが再起動/停止/終了しても同じアドレスのまま。
備考
- Elastic IPアドレスはどこにもアタッチしていない場合、1時間あたり約1円かかる。
- パブリック IPアドレスを持つインスタンスにElastic IPアドレスをアタッチした場合、Elastic IPアドレスが有効となる。
- Elastic IPアドレスは同一アカウントであれば、他のVPCのインスタンスにも付け替えができる。
補足:インスタンスのアドレス事情
インスタンスはVPC内部用と外部接続用等、複数のIPアドレスを持つことがある。
- VPC内部用:サブネットのアドレスレンジ内のIPアドレスが自動で割り当てられる。
- 外部接続用:Elastic IPアドレスをアタッチして使用することが多い。
備考
- NATゲートウェイを通る場合、NATゲートウェイ自身にアタッチされたElastic IPアドレスが使用される。
セキュリティグループとネットワークACL
どちらもAWSの仮想ファイアウォールサービスではあるが、用途が違う。
基本的にはセキュリティグループで対策をしていき、ネットワークACLは補助的に使用する。
参考:AWS セキュリティグループとネットワークACLの違い
新規作成したセキュリティグループ/ネットワークACLでは、インバウンドトラフィックが全て拒否されている。「なんか繋がらないなー」とならないよう、設定はきちんと行おう。
セキュリティグループ
ENI単位で設定するファイアウォール。
許可リストを設定する。拒否リストは設定できない。
ポート番号/アドレスレンジ/セキュリティグループ単位で許可リストを設定できる。
ステートフル・インスペクション型(戻り通信の設定が不要)
備考
ネットワークACL
サブネット単位で設定するファイアウォール。
許可リストを設定する。拒否リストは設定できない。
ポート番号/アドレスレンジで許可リストを設定できる。
ステートレス・インスペクション型(戻り通信の設定が必要)
備考
- ACL(Access Control List)
- サブネットはネットワークACLを1つしか持てない。
- ネットワークACLはサブネット内の全のAWSリソースに適用される。
デモンストレーション
完成系の図
https://www.draw.io/ で作成。
作成手順
- リージョンが東京であることを確認する。
- VPC(
test-vpc
)を作成する。
VPC(test-vpc
)
- サブネット(
test-subnet-0
test-subnet-2
)をtest-vpc
に作成する。 - IGW(
test-igw
)を作成し、test-vpc
にアタッチする。 - セキュリティグループ(
test-sg
)をtest-vpc
に作成する。- インバウンドルールに
SSH
を追加するのを忘れずに
- インバウンドルールに
サブネット(test-subnet-0
)
- ルートテーブルに
0.0.0.0/0 : test-igw
を追加する。 - EC2(
Name: test-ec2-0
)を作成する。- 自動割り当てパブリックIP:
有効
- 新しいキーペア:
test-keypair
- 自動割り当てパブリックIP:
-
test-ec2-0
のセキュリティグループをtest-sg
に変更する。 -
test-subnet-0
のネットワークACLを一応確認する。
test-ec2-0
にSSH接続してみる
$ cd <秘密鍵があるディレクトリへのパス> # 秘密鍵があるディレクトリへ移動
$ chmod 400 <秘密鍵> # 権限変更
$ ssh -i <秘密鍵> ec2-user@<IPアドレス> # EC2にSSH接続
$ exit # EC2から抜け出す
- Elastic IPアドレスを割り当て、
test-ec2-0
に関連づける。 - 今度はElastic IPアドレスで
test-ec2-0
にSSH接続してみる。
$ ssh -i <秘密鍵> ec2-user@<Elastic IPアドレス> # EC2にSSH接続
$ exit # EC2から抜け出す
サブネット(test-subnet-2
)
- EC2(
Name: test-ec2-2
)を作成する。- 自動割り当てパブリックIP:
有効
- セキュリティグループ:
launch-wizard-4
-
既存のキーペア:
test-keypair
- 自動割り当てパブリックIP:
test-ec2-0
を踏み台サーバーにしてtest-ec2-2
にSSH接続してみる
$ scp -i <秘密鍵> <秘密鍵> ec2-user@<IPアドレス>:/tmp/ # EC2の/tmp/に秘密鍵をコピー
$ ssh -i <秘密鍵> ec2-user@<Elastic IPアドレス> # EC2にSSH接続
# test-ec2-0
$ cd /tmp/
$ ssh -i <秘密鍵> ec2-user@<プライベート IPアドレス> # EC2にSSH接続
NATゲートウェイを通じてtest-ec2-2
からインターネットに接続してみる
- NATゲートウェイ(
Name: test-nat
)をtest-subnet-0
に作成する。- Elastic IP割り当てID:
新しいEIPの作成
- Elastic IP割り当てID:
- ルートテーブル(
test-rtb
)をtest-vpc
に作成し、test-subnet-0
に関連づける。-
0.0.0.0/0 : test-nat
を追加する。
-
# test-ec2-2
$ curl httpbin.org/ip # インターネット上のhttpbin.org/ipにアクセス
# 自分がどのIPアドレスを使用しているか返してくれる
# test-nat のElastic IPアドレスが帰ってくるはず
削除手順
このまま放置すると料金がかかるため、削除を行っていく。
- EC2(
test-ec2-0
test-ec2-2
)を削除(終了
)する。 - NATゲートウェイ(
test-nat
)を削除する。 - Elastic IPアドレス2つを削除(
開放
)する。 - VPC(
test-vpc
)を削除する。これで、- サブネット(
test-subnet-0
test-subnet-2
) - IGW(
test-igw
) - セキュリティグループ(
test-sg
) - など、依存関係のあるものは全て削除される。
- サブネット(
より詳しい解説は「くろかわこうへいのAWS講座VPC編#4【デモ】自宅PCからEC2にログインしよう」を見ると良い。
参考
- くろかわこうへいのAWS講座VPC編 #1~4(チャンネル登録はこちら)
- 動画で学ぶAWS講座 VPC編 section1~4(チャンネル登録はこちら)