本日も乙

ただの自己満足な備忘録。

マネージドNATサービス GCP Cloud NAT がリリースされました

先日、GCPでNATインスタンスを構築する記事 を書いたばかりですが、なんとマネージドNATサービス Cloud NATがベータ版でリリースされました。

cloud.google.com

リリースされたのでドキュメントを読んで気にあるポイントを整理 & 実際に試してみました。

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

作成後、ブラウザコンソール上はこのようになります。

gcloud-nat

静的IPアドレスの画面です。なぜか使用リソースが空になってますが・・・。

gcloud-nat

それ以外のオプションはドキュメントをご参照ください。
gcloud beta compute routers nats create  |  Cloud SDK  |  Google Cloud

Cloud NAT経由でGCEインスタンスを利用する。

Cloud NATが有効になっているサブネットを指定し、外部IPをなしにして起動するだけです。

gcloud-nat

参考URL

*1:ベータ版での動作なので今後減らすことは可能になるかもしれません