外部IPをもたないVPC上のVMインスタンスをインターネットにつなげる

2019.12.20 (金)

ちょっと気を抜いていたのですが、こういう事態に気が付かなったです。GCEのVMインスタンスは外部IPアドレスを持たない場合はVPCの中に閉じられた状態になるので、そのまんまだと、外部との通信ができなくなってしまいます。通常のネットワークではデフォルト・ゲートウェイが外向けに設定されているので、LANの中でも普通にインターネットができますが、GCPではそのような仕組みを自分でつくってくださいということになっているので、何らかのかたちで作成しないといけない。
公式ドキュメントでは、VM インスタンスへの安全な接続の中で外部IPをもたないVMインスタンスをどうするか?ということについて、いくつかの方法を載せてあります。どれもこれも一長一短ではありますが、どのような場合にどのような方法がよいのか考えてみます。

 外部IPアドレスを持たないインスタンスへの接続として、GCPは具体的な方法論として以下の5つをあげています。どれも面倒くさい。

  • 踏み台インスタンスと SSH 転送
  • TCP 転送での Cloud IAP
  • VPN
  • 送信用 NAT ゲートウェイ
  • インタラクティブ シリアル コンソール アクセス
  • HTTPS および SSL プロキシ ロードバランサ

 結果からいうと個人的には、「送信用 NATゲートウェイ」をつくるのがベストプラクティスです。

NAT ゲートウェイを使用する下りトラフィック

インスタンスに外部 IP アドレスが割り当てられていない場合、他の GCP サービスを含め、外部サービスに直接接続できません。これらのインスタンスが公共のインターネット上のサービスに到達できるようにするには、ネットワーク上のすべてのインスタンスの代わりにトラフィックをルーティングできる、NAT ゲートウェイ マシンをセットアップして構成できます。単一のインスタンスは可用性が高いとみなすことはできず、複数のインスタンスの高スループットのトラフィックをサポートできないことに注意してください。

 VPCネットワークに紐づく同じリージョンの複数のサブネットに対して、外部に接続するための共通のゲートウェイを作って通信ができる仕組みです。説明を読んでいるとプロキシではないということが強調されているんですが、どうなんでしょうか。。。イメージとしてどうしてもプロキシっぽい感じがしてくるけど、そうでもないようです。このNATの注意点は、

  • 同じリージョンに対してNATが使えるということ。同じリージョンであれば複数のサブネットの紐付けが行えること。逆に別リージョンのサブネットはまた別のNATを作らないとダメってことです。
  • VMインスタンスとKubernetesの両方でネットワークが作れる。(Kubernetesはダメって話になるとちょっと面倒くさい。)
  • 気になる料金は、各NATゲートウェイにつき1時間あたり0.045ドルからで、その他、NATデータ処理費用の従量課金です。よっぽどの転送量が無い限り、月々500円程度という見込み。

Cloud NATゲートウェイ設定方法

  • 名前(Cloud NATゲートウェイの名前): foobar-natgateway
  • リージョン: asia-northeast1 *サブネットが属するリージョンを選びます。
  • VPC ネットワーク: foobar-product-network *上記サブネットが属するネットワークを選択
  • クラウド ルーター: foobar-natgateway-router *わかりやすい任意の名前
  • NAT マッピング: すべてのサブネットのプライマリおよびセカンダリの範囲
  • NAT IPアドレス: 自動(推奨)
  • ロギング、最小ポート、タイムアウト
  • Stackdriver Logging : 変換とエラー
  • VM インスタンスあたりの最小ポート数: 64
  • プロトコル接続のタイムアウト
    • UDP: 30 秒
    • 接続済みの TCP: 1200 秒
    • 接続中の TCP:

 NATマッピングの項目で、「すべてのサブネットのプライマリおよびセカンダリの範囲」を選択しておくと、その中で作成したVMインスタンスは自動的にNATゲートウェイを向いてくれます。VMインスタンス側での設定は何もしなくてよいです。また、この辺りの説明も不親切なのですが、NATを作成すると自動的に静的外部IPアドレスの予約が行われて設定されます。(私の場合は、nat-auto-ip-xxxxxxx-x-xxxxxxxxxxxxという静的外部IPが作成されていました。)各VMインスタンスが外に向かって(インターネットに向かって)アクセスする際は、このGIPを用いてアクセスすることになります。指定のGIPを予約できないかを見てみたのですが、おそらくgcloudコマンドなどではできそうですが、現行ではGUIでの設定はできないっぽいです。
設定後にGIPを持たないVMインスタンスから外部のネットワークにアクセスできるか確認してください。おそらくちゃんと動いていると思います。