ようへいの日々精進XP

よかろうもん

aws-cli で使って覚える VPC の作り方と EC2 インスタンスの作り方

はじめに

  • VPC について aws-cli を使いながら仕組みを理解しながら構築してみる

参考


VPC について


やってみよー

やること

  • VPC を作成する
  • VPC 内に subnet を作成する
  • InternetGateway を作成する
  • VPC と InternetGateway を関連付ける
  • VPC 内にセキュリティグループを作成する
  • 作成したセキュリティグループのインバウンドトラフィックルールを作成する
  • VPC 内に EC2 インスタンスを作成して SSH でアクセスする

ゴールは以下のようなイメージになる。

f:id:inokara:20140302141749p:plain

VPC を作成する

f:id:inokara:20140302142153p:plain

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 を作成する

f:id:inokara:20140302142529p:plain

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 を作成

f:id:inokara:20140302143212p:plain

aws --profile us ec2 create-internet-gateway

以下のようなレスポンスが返ってくる。

{
    "InternetGateway": {
        "Tags": [], 
        "InternetGatewayId": "igw-1234567", 
        "Attachments": []
    }
}

この時点では InternetGatewayVPC の関連付けは行われていない。

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 をアタッチする

f:id:inokara:20140302143308p:plain

aws --profile us ec2 attach-internet-gateway --internet-gateway-id ${gateway_id} --vpc-id ${vpc_id} 

以下のようなレスポンスが返ってくる。

{
    "return": "true"
}

VPC の route を設定(Default Gateway を設定する)

f:id:inokara:20140302143552p:plain

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"
}

セキュリティグループを作成する

f:id:inokara:20140302143713p:plain

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 インスタンスを作成する

f:id:inokara:20140302143838p:plain

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 を使ってアクセスする。

f:id:inokara:20140301170626p:plain


最後に

Management Console と aws-cli でどっちが楽?

と聞かれたら Management Console かなと思ってしまったり。但し、各機能がどのように連携しているかを掴むには aws-cli は打ってつけだと思う。

ちなみに

一連の操作をシェルスクリプトにしたのでアップした。