「NATゲートウェイ」をAWSマネジメントコンソールから構築すると何が起きるか
NATゲートウェイ
概要
NAT Gateway は AWS のフルマネージド NAT(ネットワークアドレス変換)サービスである。自前でNATインスタンスをオモリする必要がないのがウリ。控えめに言えば、最高である。詳細は、公式ドキュメントを参照する。
構築手順
おおまかに3つのリソースの作成・変更が必要である。
- EIPの作成
- NATゲートウェイの作成
- ルートテーブルの変更
AWSマネジメントコンソールによる構築
まずは手動で作ってみる。なお、インターネットゲートウェイやパブリックサブネット・プライベートサブネットなどのネットワーク系リソースは、事前に構築済みである。
EIPとNATゲートウェイの作成
NATゲートウェイのページを開く。
「NATゲートウェイの作成」ボタンをクリック。
サブネットとEIPのIDをセット。サブネットは、パブリックなサブネットを指定する。なお、このときはEIPがなかったので「新しいEIPの作成」ボタンをクリックして、EIPを新規に払い出した。
EIPが正常に作成されたので、「NATゲートウェイの作成」ボタンをクリック。
NATゲートウェイが作成された。次に「ルートテーブルの編集」ボタンをクリック。
ルートテーブルの設定変更
NAT対象のプライベートネットワークのルートテーブルを選択。そして、ページ下部の「ルート」タブの「編集」ボタンをクリック。
送信先「0.0.0.0/0」を指定。ターゲットに先ほど作成したNATゲートウェイのIDを指定。「保存」ボタンをクリックで完了。
何が起きたか?
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
シレッと、NetworkInterfaceId
やPrivateIpAddress
が設定されている。ちゃんと調べてないが、たぶん、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
State
がavailable
になってるぐらいで、あとは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をゲットだぜ!