はじめに
参考
VPC について
やってみよー
やること
- VPC を作成する
- VPC 内に subnet を作成する
- InternetGateway を作成する
- VPC と InternetGateway を関連付ける
- VPC 内にセキュリティグループを作成する
- 作成したセキュリティグループのインバウンドトラフィックルールを作成する
- VPC 内に EC2 インスタンスを作成して SSH でアクセスする
ゴールは以下のようなイメージになる。
VPC を作成する
aws --profile us ec2 create-vpc --cidr-block 192.168.0.0/16
以下のようにレスポンスが返ってくる。
{ "Vpc": { "InstanceTenancy": "default", "State": "pending", "VpcId": "vpc-1234567", "CidrBlock": "192.168.0.0/16", "DhcpOptionsId": "dopt-12345678" } }
Enable DNS hostname support for instances launched in this VPC.
を有効にしたい場合はどのようなコマンドを投げるのだろうか?
VPC 内に subnet を作成する
aws --profile us ec2 create-subnet --vpc-id ${vpc_id} --cidr-block 192.168.1.0/24
以下のようにレスポンスが返ってくる。
{ "Subnet": { "VpcId": "vpc-1234567", "CidrBlock": "192.168.1.0/24", "State": "pending", "AvailabilityZone": "us-east-1b", "SubnetId": "subnet-12345678", "AvailableIpAddressCount": 251 } }
VPC
作成時点で Routing Table
が作成されるっぽい(未確認...)
VPC の InternetGateway を作成
aws --profile us ec2 create-internet-gateway
以下のようなレスポンスが返ってくる。
{ "InternetGateway": { "Tags": [], "InternetGatewayId": "igw-1234567", "Attachments": [] } }
この時点では InternetGateway
と VPC
の関連付けは行われていない。
VPC の routing table ID を確認する
aws --profile us ec2 describe-route-tables --filters Name=route.destination-cidr-block,Values="192.168.0.0/16"
以下のようなレスポンスが返ってくる。
{ "RouteTables": [ { "Associations": [ { "RouteTableAssociationId": "rtbassoc-12345678", "Main": true, "RouteTableId": "rtb-12345678" } ], "RouteTableId": "rtb-12345678", "VpcId": "vpc-12345678", "PropagatingVgws": [], "Tags": [], "Routes": [ { "GatewayId": "local", "DestinationCidrBlock": "192.168.0.0/16", "State": "active" } ] } ] }
InternetGateway と VPC をアタッチする
aws --profile us ec2 attach-internet-gateway --internet-gateway-id ${gateway_id} --vpc-id ${vpc_id}
以下のようなレスポンスが返ってくる。
{ "return": "true" }
VPC の route を設定(Default Gateway を設定する)
aws --profile us ec2 create-route --route-table-id ${rtb_id} --destination-cidr-block 0.0.0.0/0 --gateway-id ${gateway_id}
以下のようなレスポンスが返ってくる。
{ "return": "true" }
セキュリティグループを作成する
aws --profile us ec2 create-security-group --group-name kawahara-test --description "kawahara-test" --vpc-id ${vpc_id}
以下のようなレスポンスが返ってくる。
{ "return": "true", "GroupId": "sg-1234567" }
さらにセキュリティグループの Inbound トラフィックへのルールも追加する。
aws ec2 --profile us authorize-security-group-ingress --group-id sg-12345678 --protocol tcp --port 22 --cidr xxx.xxx.xxx.xxx/32
以下のようなレスポンスが返ってくる。
{ "return": "true" }
EC2 インスタンスを作成する
instance_ID=`aws --profile us ec2 run-instances \ --image-id ${ami_ID} \ --count 1 \ --instance-type t1.micro \ --key-name ${keyname} \ --security-group-ids ${security-group_ID} \ --subnet-id ${subnet_ID} \ --associate-public-ip-address | jq -c -r '.Instances[]|.InstanceId'`
作成したインスタンスの PublicIpAddress を確認する
aws --profile us ec2 describe-instances | jq -r '.Reservations[].Instances[]|select(.InstanceId=="${instance_ID}").PublicIpAddress'
インスタンスのグローバル IP が表示されるので確認して SSH を使ってアクセスする。
最後に
Management Console と aws-cli でどっちが楽?
と聞かれたら Management Console かなと思ってしまったり。但し、各機能がどのように連携しているかを掴むには aws-cli は打ってつけだと思う。