ネットワークを構築したい
今日はこの間からずっと気になっていたVPCというのを使ってネットワークを構築していきたいと思っている。
まず,今日構築したいのはこんなシンプルなものだ。
グローバルIPが振られて,外からアクセスできるようなネットワークを1つと,外からはアクセスできないネットワークを1つ作りたい。
イメージとしては外からアクセスできるWebサーバと,外からはアクセスできないデータベースサーバをそれぞれ置けるような,ちょっと意味がありそうでだれでもすぐに思いつきそうなネットワーク構成。これを構築すると決めた。
AWSがどんなものかわからないからか,何をしたらいいのかわからなくなることが多い。だから先にやりたいことを見つけてやり方を探すようにしようと思った。
VPCの作成
VPCはクラウド上で仮想のネットワーク環境を構築するためのサービスらしい。そして,VPCというひとつのくくりの中にSubnetを作ることができるらしい。
とりあえず,VPCを作ることにする。びっくりしたのは,VPCはaws vpc ~ ではなくて,aws ec2であるということ。おそらく昔はec2の1機能だったのだろうと勝手に想像してみた。
$ aws ec2 create-vpc --cidr-block 172.16.0.0/16
{
"Vpc": {
"InstanceTenancy": "default",
"State": "pending",
"VpcId": "vpc-6ece0d0b",
"CidrBlock": "172.16.0.0/16",
"DhcpOptionsId": "dopt-c83421aa"
}
}
Stateがpendingということは,しばらく待つ必要があるっていうのはもう慣れっこで,確認のために1分くらいおいてdescribe-vpcsする。
$ aws ec2 describe-vpcs
{
"Vpcs": [
{
"VpcId": "vpc-6ece0d0b",
"InstanceTenancy": "default",
"State": "available",
"DhcpOptionsId": "dopt-c83421aa",
"CidrBlock": "172.16.0.0/16",
"IsDefault": false
},
{
-略-
}
]
}
State がavailableになっているのを確認した。
今はこのようなVPCができている状態だと思われる。
ただ,VPCを作っただけではEC2をそこに起動することはできないようだ。Subnetというのを作る必要がある。
Subnetの作成
当初の予定どおり,グローバルのネットワークとローカルのネットワークの2つを作る。最初VPCでそれぞれ作るものと考えていたけれど,Subnetというので作れそうな気もしてきたので,こちらでやってみる。こちらもvpcではなくec2のサブコマンドのcreate-subnetでやれる。前回やったCLIの補完がだいぶ楽にしてくれているのが実感できる。もうドキュメントを見なくてもターミナルだけで探すことができている。
$ aws ec2 create-subnet --vpc-id vpc-6ece0d0b --cidr-block 172.16.64.0/24
{
"Subnet": {
"VpcId": "vpc-6ece0d0b",
"CidrBlock": "172.16.64.0/24",
"State": "pending",
"AvailabilityZone": "ap-northeast-1c",
"SubnetId": "subnet-5b1cf402",
"AvailableIpAddressCount": 251
}
}
$ aws ec2 create-subnet --vpc-id vpc-6ece0d0b --cidr-block 172.16.32.0/24
{
"Subnet": {
"VpcId": "vpc-6ece0d0b",
"CidrBlock": "172.16.32.0/24",
"State": "pending",
"AvailabilityZone": "ap-northeast-1c",
"SubnetId": "subnet-5d1cf404",
"AvailableIpAddressCount": 251
}
}
このようにvpcのIDとCIDRブロックを指定してSubnetを作成した。今回はグローバルにアクセスできるものとできないものとの2つのネットワークを作りたいから2つ作ったけど,この段階では区別はついていないように見える。
たぶん,今作った状態はこんな感じなんだろうけど,このサブネット間の通信とか,インターネットへの接続とかどうなっているのか,よくわからなかった。
EC2を起動して疎通の確認をしたかったけれど,EC2にSSHで接続することもできなかった。というか,グローバルのIPアドレスが与えられていない。
おそらく,Subnetはスイッチみたいな状態で存在していて,ルータには接続されていないんじゃないかと思った。EC2を起動すればスイッチには接続されて,同一スイッチ内でなら通信できるけど,それ以外とは通信できない。そんな状態だと想像している。
そういえば,Subnetを作った時にふと気づいた事がある。AWSにはAvailability Zoneという概念があるらしい。Availability Zoneという概念は,Regionと呼ばれる地域単位での区切りの中で,さらにデータセンターを分けたような考え方で,同じ東京のリージョンでも数十km離れた場所にあって,データセンターの障害に対応できる仕組みになっているらしい。
せっかくなので,複数のAvailability Zoneを利用したネットワーク構成をしてみようと思う。
Availability Zone
Subnetを作成する時に--availability-zone オプションを指定するとAvailability Zoneを指定してSubnetを作る事ができそうだ。マジでコマンドの補完便利すぎる。
さっき作ったやつはap-northeast-1cとなっていたので,今度はap-northeast-1bを指定しようとしたけれど
A client error (InvalidParameterValue) occurred when calling the CreateSubnet operation: Value (ap-northeast-1b) for parameter availabilityZone is invalid. Subnets can currently only be created in the following availability zones: ap-northeast-1c, ap-northeast-1a.
と出て,1aか1cしか使えないらしい。1bというのはないのかもしれない。
$ aws ec2 create-subnet --vpc-id vpc-6ece0d0b --cidr-block 172.16.128.0/24 --availability-zone ap-northeast-1a
{
"Subnet": {
"VpcId": "vpc-6ece0d0b",
"CidrBlock": "172.16.128.0/24",
"State": "pending",
"AvailabilityZone": "ap-northeast-1a",
"SubnetId": "subnet-ea0fd89d",
"AvailableIpAddressCount": 251
}
}
$ aws ec2 create-subnet --vpc-id vpc-6ece0d0b --cidr-block 172.16.160.0/24 --availability-zone ap-northeast-1a
{
"Subnet": {
"VpcId": "vpc-6ece0d0b",
"CidrBlock": "172.16.160.0/24",
"State": "pending",
"AvailabilityZone": "ap-northeast-1a",
"SubnetId": "subnet-d40fd8a3",
"AvailableIpAddressCount": 251
}
}
ap-northeast-1aにもSubnetを作ってみた。
今はきっとこの図のようになっているはずだ。
なっているはずだけれども,EC2を立ち上げても,SSHで接続できないので,確認できないのが悔しいところ。