【学習記録】AWS CLIでサブネット、インターネットゲートウェイあたりを作成

AWS CLIVPCは作成済みの状態からサブネットなどを作っていきます。
以下の公式チュートリアルを参考にしてます。 docs.aws.amazon.com

サブネット作成

AWS CLI サブネット作成コマンド

aws ec2 create-subnet --vpc-id vpc-02479fa33475f641d --cidr-block 10.0.1.0/24

--vpc-idに設定しているのは先に作成済みのVPCのもの --cidr-blockでVPCのCIDRをより細かく分割したものを設定する。

以下のようなJSONが出力される。

{
    "Subnet": {
        "AvailabilityZone": "ap-northeast-1c",
        "AvailabilityZoneId": "apne1-az1",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.1.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        "SubnetId": "subnet-0d6f762206638a34b",
        "VpcId": "vpc-02479fa33475f641d",
        "OwnerId": "XXXXXXX",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "SubnetArn": "arn:aws:ec2:ap-northeast-1:428351874559:subnet/subnet-0d6f762206638a34b"
    }
}

JSONを見てみると、当たり前だと思いますがVpcIdの値はコマンドで入力したものと同じになってますね。 アベイラビリティーゾーンはVPC作成時から特に指定していなかったのですが、ap-northeast-1cになってました。

マネジメントコンソールではサブネット作成画面は以下のようになっています。
試しにVPCの範囲外のCIDRを入力すると警告が出てサブネット作成できませんでした。 f:id:JunpeiNakasone:20201216061848p:plain

サブネットをパブリックにする

下記コマンドを実行してインターネットゲートウェイを作成します。

aws ec2 create-internet-gateway

すると以下のようなJSONが出力されます。

{
    "InternetGateway": {
        "Attachments": [],
        "InternetGatewayId": "igw-018f9fcec0e9b94b3",
        "OwnerId": "XXXXXXXX",
        "Tags": []
    }
}

マネジメントコンソールで確認するとインターネットゲートウェイが想定通り作成されてました。
JSONの出力でもAttachmentsが[]になっているように、「状態」の項目がDetachedになっていてまだどのVPCにもアタッチされていない状態になっています。

f:id:JunpeiNakasone:20201216062455p:plain

以下のコマンドでVPCにインターネットゲートウェイをアタッチします。

aws ec2 attach-internet-gateway --vpc-id vpc-02479fa33475f641d --internet-gateway-id igw-018f9fcec0e9b94b3

JSONの出力はなし。

マネジメントコンソールで確認すると上記コマンドで設定したVPCにインターネットゲートウェイがアタッチされてました。
f:id:JunpeiNakasone:20201216063409p:plain

以下のコマンドでVPCに対してカスタムルートテーブルを作成。

aws ec2 create-route-table --vpc-id vpc-02479fa33475f641d

以下のようなJSONが出力されます。

{
    "RouteTable": {
        "Associations": [],
        "PropagatingVgws": [],
        "RouteTableId": "rtb-02764c54f3e3c886f",
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Tags": [],
        "VpcId": "vpc-02479fa33475f641d",
        "OwnerId": "XXXXXXXX"
    }
}

マネジメントコンソールでもルートテーブルが作成されてました。
f:id:JunpeiNakasone:20201216064107p:plain

インターネットゲートウェイへのすべてのトラフィック(0.0.0.0/0)をdestination-cidr-blockに持つ(外部インターネットに繋がっている)ルートを作成する。

aws ec2 create-route --route-table-id rtb-02764c54f3e3c886f --destination-cidr-block 0.0.0.0/0 --gateway-id igw-018f9fcec0e9b94b3

以下のJSONが出力されました。実行結果がbooleanで返ってくるっぽい。

{
    "Return": true
}

以下のコマンドでルートが有効になっているかを確認。

aws ec2 describe-route-tables --route-table-id rtb-02764c54f3e3c886f

以下のようなJSONが出力されます。
コマンドで入力した末尾94b3のインターネットゲートウェイに0.0.0.0/0のDestinationCidrBlockを持つルートがあるので成功しているようです。

{
    "RouteTables": [
        {
            "Associations": [],
            "PropagatingVgws": [],
            "RouteTableId": "rtb-02764c54f3e3c886f",
            "Routes": [
                {
                    "DestinationCidrBlock": "10.0.0.0/16",
                    "GatewayId": "local",
                    "Origin": "CreateRouteTable",
                    "State": "active"
                },
                {
                    "DestinationCidrBlock": "0.0.0.0/0",
                    "GatewayId": "igw-018f9fcec0e9b94b3",
                    "Origin": "CreateRoute",
                    "State": "active"
                }
            ],
            "Tags": [],
            "VpcId": "vpc-02479fa33475f641d",
            "OwnerId": "XXXXXXX"
        }
    ]
}

マネジメントコンソールで確認すると以下のようになっており、ルートが設定されているのがわかりました。
localとなっているのはアタッチされているVPCだと思います。
f:id:JunpeiNakasone:20201216065117p:plain

一応サブネットがまだ関連づけられていないのを確認。 f:id:JunpeiNakasone:20201216065938p:plain

まだルートテーブルはサブネットに関連付けられていないので、サブネットからのトラフィックがインターネットゲートウェイにルーティングされるよう設定していきます。

以下のコマンドでサブネットIDとCIDRのみ出力されるように--queryオプションを設定してIDを確認する。
今はサブネットひとつしかないので使用しないが、サブネットが複数ある場合は--filterオプションも使ったほうがいいはず。

aws ec2 describe-subnets --query 'Subnets[*].{ID:SubnetId,CIDR:CidrBlock}'

すると以下のJSONが出力されました。

[
    {
        "ID": "subnet-0d6f762206638a34b",
        "CIDR": "10.0.1.0/24"
    }
]

外部インターネットに接続しているカスタムルートテーブルにサブネットを関連づけます。
このサブネットはパブリックサブネットになります。

aws ec2 associate-route-table --subnet-id subnet-0d6f762206638a34b --route-table-id rtb-02764c54f3e3c886f

以下のJSONが出力されました。

{
    "AssociationId": "rtbassoc-0c95861b03611fb26",
    "AssociationState": {
        "State": "associated"
    }
}

マネジメントコンソールから確認するとインターネットゲートウェイにサブネットが関連づけられていました。 f:id:JunpeiNakasone:20201216070218p:plain

次の記事でEC2を立ち上げてアクセスするところまでやってみます。