VPC

VPC

VPC (Virtual Private Cloud) によりプライベートネットワークを作成できる。

  • VPC > Your VPCs を選択
  • Create VPC ボタンを押下
  • 任意の CIDR Block を指定。範囲は xxx.xxx.0.0/16 に制限されている。
    • クラスC 192.168.0.0/16 と同じ範囲だが、10.0.0.0/16 のようにも指定できる。

CIDR Block は、以下のように割り当てて「最大 256 個の Subnet と、Subnet 内で 256 個のIPアドレスを持てる」と考えると管理しやすい。

  • VPC: 10.0.0.0/16
  • Subnets: 10.0.(0..255).0/24

すなわち 256 * 256 = 65536 個のプライベートIPアドレスを持てることになる。ただし、あくまで仕様上の個数であり、AWS 内で使える数には限りがある。

VPC 作成後はサイズ変更ができないため、最大の 10.0.0.0/16 を割り当てておくとよい。

Internet Gateways

VPC はそのままではインターネットとの通信経路が存在しない。Internet Gateway を VPC に紐付ける必要がある。

  • VPC > Internet Gateways を選択
  • Create Internet Gateway ボタンを押下
  • 作成された Internet Gateway を選択
  • Attach to VPC ボタンを押下
  • 対象の VPC を選択し Internet Gateway と紐付ける

通信経路が確保されただけであり、Elastic IP でグローバル IP アドレスを割り当てるまでは、インターネットからは VPC にアクセスはできない。

Subnets

VPC 内に、Subnet と呼ばれるプライベートアドレス空間を作成する。EC2 インスタンスはこの Subnet 内に置かれる。

  • Public Subnet
    • Internet Gateway とのルートを持つ Subnet = インターネットからアクセス可
  • Private Subnet
    • Internet Gateway とのルートを持たない Subnet = インターネットからアクセス不可

Subnet は以下の手順で作成する。

  • VPC > Subnets を選択
  • Create Subnet ボタンを押下
  • 任意の CIDR Block を指定。範囲は xxx.xxx.xxx.0/24 に制限されている。

VPC の CIDR Block が 10.0.0.0/16 である場合、以下のように Subnet の CIDR Block を割り当てる。

  • Subnet1: 10.0.0.0/24
  • Subnet2: 10.0.1.0/24
  • Subnet3: 10.0.2.0/24

Route Tables

Subnet はそのままではインターネットとの通信経路が存在しない。Subnet 毎の Route Table で経路を指定する。

  • VPC > Route Tables を選択
  • 作成した Subnet の Route Table を選択 rtb-*
  • Routes タブを選択
  • Edit を押下して、Route Table を編集

1 行目の以下のエントリにより、VPC 内のインスタンスが相互接続できるようになる。もちろん変更や削除はできない。

  • Destination: VPC の CIDR Block
  • Target: local

Public Subnet とする場合は、Internet Gateway への経路を追加する。

  • Destination: 0.0.0.0/0
  • Target: Internet Gateway igw-* を指定

Private Subnet の場合は、Subnet 内からインターネットに接続できるように、後述の NAT インスタンスの ID を指定する。

  • Destination: 0.0.0.0/0
  • Target: NAT インスタンスのID i-* を指定

NAT Instance

Internet Gateway との経路を持たない Subnet は、インターネットに接続できない。パッケージのダウンロードなどで Subnet 内からインターネットへのアクセスは必要になる。

この場合は、Public Subnet 内に、Private Subnet からの通信を外部ネットワークに中継する NAT インスタンスを立てる。

Public AMI で ami-vpc-nat の名前で提供されているが、単に rc.local の起動スクリプトで IP マスカレードを設定しているのみなので、任意のインスタンスを NAT インスタンスとしたい場合は、同様のスクリプトを置けばよい。

eth0 の MAC アドレスを取得する。

ETH0_MAC=`/sbin/ifconfig  | /bin/grep eth0 | awk '{print tolower($5)}' | grep '^[0-9a-f]\{2\}\(:[0-9a-f]\{2\}\)\{5\}$'`

MAC アドレスから Amazon 提供の Instance Metadata を使って、CIDR Block を得る。

VPC_CIDR_URI="http://169.254.169.254/latest/meta-data/network/interfaces/macs/${ETH0_MAC}/vpc-ipv4-cidr-block"
...
VPC_CIDR_RANGE=`curl --retry 3 --retry-delay 0 --silent --fail ${VPC_CIDR_URI}`

取得した CIDR を送信元にして、IP マスカレードを設定する。

echo 1 >  /proc/sys/net/ipv4/ip_forward && \
   echo 0 >  /proc/sys/net/ipv4/conf/eth0/send_redirects && \
   /sbin/iptables -t nat -A POSTROUTING -o eth0 -s ${VPC_CIDR_RANGE} -j MASQUERADE

Security Groups

SecurityGroup は、EC2-Classic と VPC では異なる。

  • EC2-Classic
    • EC2 インスタンスに対して Security Group を割り当てる。
    • 異なる EC2 インスタンス間で、同一の Security Group を共有できる。
    • 起動時に EC2 インスタンスに割り当てた Security Group は変更できない。
  • VPC
    • VPC 内で Security Group を定義する。
    • 異なる VPC 間で、Security Group を共有することはできない。
    • VPC 内に定義した Security Group の中から、必要なものを EC2 インスタンスに割り当てる。
    • EC2 インスタンス起動後も、割り当てた Security Group を変更できる。

このため VPC では、サーバの役割に応じて、SSH / Web などのポート別で Security Group を作っておくとよい。