「NATゲートウェイ」をAWSマネジメントコンソールから構築すると何が起きるか

NATゲートウェイ

概要

NAT GatewayAWS のフルマネージド NAT(ネットワークアドレス変換)サービスである。自前でNATインスタンスをオモリする必要がないのがウリ。控えめに言えば、最高である。詳細は、公式ドキュメントを参照する。

構築手順

おおまかに3つのリソースの作成・変更が必要である。

  1. EIPの作成
  2. NATゲートウェイの作成
  3. ルートテーブルの変更

AWSマネジメントコンソールによる構築

まずは手動で作ってみる。なお、インターネットゲートウェイやパブリックサブネット・プライベートサブネットなどのネットワーク系リソースは、事前に構築済みである。

EIPとNATゲートウェイの作成

NATゲートウェイのページを開く。

「NATゲートウェイの作成」ボタンをクリック。

f:id:tmknom:20180825161628p:plain

サブネットとEIPのIDをセット。サブネットは、パブリックなサブネットを指定する。なお、このときはEIPがなかったので「新しいEIPの作成」ボタンをクリックして、EIPを新規に払い出した。

f:id:tmknom:20180825161759p:plain

EIPが正常に作成されたので、「NATゲートウェイの作成」ボタンをクリック。

f:id:tmknom:20180825161815p:plain

NATゲートウェイが作成された。次に「ルートテーブルの編集」ボタンをクリック。

f:id:tmknom:20180825161829p:plain

ルートテーブルの設定変更

NAT対象のプライベートネットワークのルートテーブルを選択。そして、ページ下部の「ルート」タブの「編集」ボタンをクリック。

f:id:tmknom:20180825161849p:plain

送信先「0.0.0.0/0」を指定。ターゲットに先ほど作成したNATゲートウェイのIDを指定。「保存」ボタンをクリックで完了。

f:id:tmknom:20180825161901p:plain

何が起きたか?

AWS内で何が起きているかを調べてみよう。CloudTrailで発生したイベントを見てみると、以下のイベントが発生していた。

  • AllocateAddress
  • CreateNatGateway
  • CreateRoute

それぞれ、APIのリクエスト・レスポンス部分だけ、CloudTrailから抜粋してみよう。

AllocateAddress

リクエストパラメータでは、domain属性にvpcをセットしている。

{
    "eventSource": "ec2.amazonaws.com",
    "eventName": "AllocateAddress",
    "requestParameters": {
        "domain": "vpc"
    },
    "responseElements": {
        "requestId": "12905ee6-e2b8-431f-830a-91fa56fecdf8",
        "publicIp": "18.179.187.7",
        "domain": "vpc",
        "allocationId": "eipalloc-00193009c987fb95d"
    }
}

CreateNatGateway

リクエストパラメータには、EIPのIDに相当するAllocationIdと、NATゲートウェイが所属するSubnetIdが指定されている。

{
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateNatGateway",
    "requestParameters": {
        "CreateNatGatewayRequest": {
            "AllocationId": "eipalloc-00193009c987fb95d",
            "SubnetId": "subnet-092019c5e4555ed2f"
        }
    },
    "responseElements": {
        "CreateNatGatewayResponse": {
            "xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/",
            "natGateway": {
                "subnetId": "subnet-092019c5e4555ed2f",
                "natGatewayAddressSet": {
                    "item": {
                        "allocationId": "eipalloc-00193009c987fb95d"
                    }
                },
                "createTime": "2018-08-14T10:53:23.000Z",
                "vpcId": "vpc-0e1e183f9542f4968",
                "natGatewayId": "nat-0f3ec2f6511d46717",
                "state": "pending"
            },
            "requestId": "1943d7f8-72c9-4c5d-aea6-04ef74b57c4e"
        }
    }
}

CreateRoute

リクエストパラメータには、destinationCidrBlock属性に0.0.0.0/0を指定している。

また、手前で作成したNATゲートウェイnatGatewayId、および、事前作成済みのルートテーブルのrouteTableIdが指定されている。

{
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateRoute",
    "requestParameters": {
        "routeTableId": "rtb-0b7429a0222c83e81",
        "destinationCidrBlock": "0.0.0.0/0",
        "natGatewayId": "nat-0f3ec2f6511d46717"
    },
    "responseElements": {
        "requestId": "3194a62e-dd89-42ac-a278-f5e97288657c",
        "_return": true
    }
}

AWS CLIによる確認

最後に、AWS CLIでどういう状態になったか確認してみよう。

describe-addresses

シレッと、NetworkInterfaceIdPrivateIpAddressが設定されている。ちゃんと調べてないが、たぶん、NATゲートウェイに紐付いているENIだろう。

$ aws ec2 describe-addresses
{
    "Addresses": [
        {
            "Domain": "vpc",
            "NetworkInterfaceId": "eni-0caa6797fb65ee7e5",
            "AssociationId": "eipassoc-b202ca68",
            "NetworkInterfaceOwnerId": "123456789012",
            "PublicIp": "18.179.187.7",
            "AllocationId": "eipalloc-00193009c987fb95d",
            "PrivateIpAddress": "10.255.1.161"
        }
    ]
}

describe-nat-gateways

Stateavailableになってるぐらいで、あとはCloudTrailで見た内容と同様。

$ aws ec2 describe-nat-gateways
{
    "NatGateways": [
        {
            "NatGatewayAddresses": [
                {
                    "PublicIp": "18.179.187.7",
                    "NetworkInterfaceId": "eni-0caa6797fb65ee7e5",
                    "AllocationId": "eipalloc-00193009c987fb95d",
                    "PrivateIp": "10.255.1.161"
                }
            ],
            "VpcId": "vpc-0e1e183f9542f4968",
            "Tags": [],
            "State": "available",
            "NatGatewayId": "nat-0f3ec2f6511d46717",
            "SubnetId": "subnet-092019c5e4555ed2f",
            "CreateTime": "2018-08-14T10:53:23.000Z"
        }
    ]
}

describe-route-tables

ルートテーブル全体しかdescribeできなかったのでゴチャゴチャしているが、Routesの部分でNatGatewayIdが設定されている。

$ aws ec2 describe-route-tables --route-table-ids rtb-0b7429a0222c83e81
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "SubnetId": "subnet-0d135b050c38a67f0",
                    "RouteTableAssociationId": "rtbassoc-0fd198332279dcf7f",
                    "Main": false,
                    "RouteTableId": "rtb-0b7429a0222c83e81"
                },
                {
                    "SubnetId": "subnet-0ee87bf60caaf3d92",
                    "RouteTableAssociationId": "rtbassoc-05b7ec6918f7fe7ea",
                    "Main": false,
                    "RouteTableId": "rtb-0b7429a0222c83e81"
                }
            ],
            "RouteTableId": "rtb-0b7429a0222c83e81",
            "VpcId": "vpc-0e1e183f9542f4968",
            "PropagatingVgws": [],
            "Tags": [
                {
                    "Value": "prod-private-application",
                    "Key": "Name"
                }
            ],
            "Routes": [
                {
                    "GatewayId": "local",
                    "DestinationCidrBlock": "10.255.0.0/16",
                    "State": "active",
                    "Origin": "CreateRouteTable"
                },
                {
                    "Origin": "CreateRoute",
                    "DestinationCidrBlock": "0.0.0.0/0",
                    "NatGatewayId": "nat-0f3ec2f6511d46717",
                    "State": "active"
                }
            ]
        }
    ]
}

まとめ

非常に簡単にNATゲートウェイを構築することができた。リクエストパラメータもシンプルで、ほとんど迷うことなくNATをゲットだぜ!

参考