先日、GCPでNATインスタンスを構築する記事 を書いたばかりですが、なんとマネージドNATサービス Cloud NATがベータ版でリリースされました。
リリースされたのでドキュメントを読んで気にあるポイントを整理 & 実際に試してみました。
- GCP Cloud NATがアツい理由
- NATに設定するIPアドレスについて
- ポート数と接続数の制限
- タイムアウト
- 帯域幅
- Googleサービスへのアクセスについて
- 価格
- Cloud NATを使ってみる
- Cloud NAT経由でGCEインスタンスを利用する。
- 参考URL
GCP Cloud NATがアツい理由
マネージドNATサービスは他のクラウドサービスでもリリースされているかと思いますが、GCP Cloud NATの特徴として、Andromeda というSDNがNATを担う点です。
従来だとNATプロキシインスタンスが間に入るため、このインスタンスが帯域にボトルネックになったりとスループットに性能差がでてしまっていましたが、Cloud NATはNATプロキシインスタンス(チョークポイント)がないため、レイテンシやスループットが安定しているとのことです。
https://cloud.google.com/nat/docs/overview#under_the_hood
NATに設定するIPアドレスについて
Cloud NATに割り当てるグローバルIPアドレスを自動か手動で設定ができます。このグローバルIPアドレスはVPC内部からWANに出た際のアクセス元IPアドレスとなります。
自動割り当て
自動的にグローバルIPアドレスを取得しCloud NATに割り当ててくれます。使用VM数やポート数に応じて自動的にスケールしてくれる(=グローバルIPアドレス数が増減する)ので管理コストが下がるため、ドキュメントではこちらの方法が推奨されています。
しかし、割り当てられるグローバルIPアドレスがブラウザコンソール上から確認できず、どのグローバルIPアドレスが降られるかわかりません。また、割り当て & 開放の度にIPアドレスがコロコロ変わるため、アクセス元を制限するホワイトリスト方式では不向きです。
手動割り当て
静的IPアドレスを取得し、Cloud NATに割り当てる方法です。自動割り当てと異なり、IPアドレスが勝手に割り当てや開放されないためホワイトリスト方式に向いています。
しかし、グローバルIPアドレス一つあたりに使用できるVM数とポート数に制限がある(後述)ため、使用状況をみて余裕をもってIPアドレスを割り当てて必要があります。
ドキュメントによると、IPアドレス数が偶数個であることが推奨されています。
ポート数と接続数の制限
Cloud NATに割り当てるIPアドレス一つにつき、TCP、UDPともに 65,536 個のポートがあります。そのうち、1024 までのウェルノウンポートは使用できないため、64,512 個のポートが使えることになります。
デフォルトでは、一つのVMにつき64ポート(TCP 64個、UDP 64個)を取得します。したがって、一つのNAT IPアドレスにつき、最大で1,008個のVMインスタンスまでNAT経由で使用可能になります。
一つのVMあたりが取得するポート数は変更可能ですが、多くすればするだけ一つのNAT IPアドレスでまかなえるVMインスタンス数は減ります。また、一度増やしたら減らすことができず、その場合はCloud NATを再作成する必要があります。 *1
タイムアウト
デフォルト値は以下の通りです。設定で変更可能です。
- UDPマッピングアイドルタイムアウト:30秒
- ICMPマッピングアイドルタイムアウト:30秒
- TCP確立接続アイドルタイムアウト:1200 秒
- TCP一時接続アイドルタイムアウト:30秒
帯域幅
Cloud NAT経由になると、グローバルIPアドレスを付与したVMと同じ程度の帯域幅になるとのことです。
Googleサービスへのアクセスについて
Cloud NATではサポートしていませんが、Cloud NATが有効になっているサブネットは自動的にGoogleプライベートアクセスが有効化されます。
価格
ベータリリース中は無料です。GAになった場合は以下の価格が基準になるとのことです。
東京リージョンだといくらになるかは現時点で分かりません。
- an hourly price for the NAT gateway, starting at $0.045 per NAT gateway hour
- a per/GB cost for ingress and egress traffic processed by the gateway
- egress pricing to send traffic from the VM out of the network remains unchanged
ただし、作成した静的IPアドレスに対する料金は発生するので注意してください。
Cloud NATを使ってみる
おおよそ仕様を確認したところで、実際にCloud NATを作成してみました。
すでにVPCネットワークやサブネットを作成済みであることが前提です。
もし何も作成していない場合は ドキュメント を参考にサンプル用のVPCネットワークとサブネットを作成します。
今回は東京リージョンで作成しました。
Cloud Routerの作成
$ gcloud beta compute routers create nat-router-tokyo \ --network sample-network \ --region asia-northeast1
Cloud NATの作成
最も基本的な作成コマンドはこちらです。
$ gcloud beta compute routers nats create nat-tokyo \ --router-region asia-northeast1 \ --router nat-router-tokyo \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges
--auto-allocate-nat-external-ips
はIPアドレスを自動的に割り当てます--nat-all-subnet-ip-ranges
はVPCネットワーク内のすべてのサブネットに対してCloud NATを有効化します
特定のサブネットだけに限定したい場合
--nat-custom-subnet-ip-ranges
オプションで指定します。
$ gcloud beta compute routers nats create nat-tokyo \ --router-region asia-northeast1 \ --router nat-router-tokyo \ --auto-allocate-nat-external-ips \ --nat-custom-subnet-ip-ranges=subnet-1,subnet-2
静的IPアドレスによる手動割り当てする場合
静的IPアドレスを取得します。ドキュメントにあるとおり、今回は2個取得します。
$ gcloud compute addresses create managed-nat-tokyo-1 --region asia-northeast1 $ gcloud compute addresses create managed-nat-tokyo-2 --region asia-northeast1
--nat-external-ip-pool
オプションで静的IPアドレスを指定します。
$ gcloud beta compute routers nats create nat-tokyo \ --router-region asia-northeast1 \ --router nat-router-tokyo \ --nat-external-ip-pool=managed-nat-tokyo-1,managed-nat-tokyo-2 \ --nat-all-subnet-ip-ranges
作成後、ブラウザコンソール上はこのようになります。
静的IPアドレスの画面です。なぜか使用リソースが空になってますが・・・。
それ以外のオプションはドキュメントをご参照ください。
gcloud beta compute routers nats create | Cloud SDK | Google Cloud
Cloud NAT経由でGCEインスタンスを利用する。
Cloud NATが有効になっているサブネットを指定し、外部IPをなしにして起動するだけです。
参考URL
*1:ベータ版での動作なので今後減らすことは可能になるかもしれません