Cloud SQLのインスタンスはデフォルトでパブリックIPも持った状態で立ち上がりますが、プライベートIPを割り当てるように設定することもできます。
しかし、ドキュメントのチュートリアルに従ってコマンドを実行したり、GUIからぽちぽちすると気づいたらプライベートIPがランダムに割り振られて起動していることもあります。
GCPのみを利用する場合はこれでも問題なることは少ないですが、オンプレやawsとの間でVPNで接続する場合にはCIDRの重複を起こす恐れがあります。
この記事では、インスタンスのCIDRを予め指定する方法を紹介します。
プライベートIPを持たせる仕組み
こちらのドキュメントのネットワーク図にあるように、実はプライベートIPをもったインスタンスは自分たちのプロジェクトのVPC内には存在しません。
Googleによって管理されているVPC内にインスタンスが存在し、そのVPCとの間でVPC Peeringが設定されています。
では、このGoogle管理のVPC内のサブネットのCIDRはどのようにして決まるのでしょうか?
それを理解するためにはPrivate services accessの仕組みを理解する必要があります。
Private service accessは本来ならパブリックIPのみを持つGCPのリソースに対してプライベートIPを割り当て、VPC内からプライベートIPで接続できるようにするサービスです。
Cloud SQLのプライベートIP機能はこの機能の上に成り立っています。
また、Cloud SQLの他にMemoryStoreなどのプライベートIP機能もこの仕組を使っています。
そして、このPrivate service accessはGoogle管理のVPCに対して割り当てるCIDRを予め決める機能があります。
それがallocated IP address ranges機能です。
https://cloud.google.com/vpc/docs/configure-private-services-access
この機能でGoogle側に割り当てたCIDRは予約されたCIDRとなり、それに被るようなサブネットを作成することが不可能になります。
以下のresource定義で 192.168.0.0/20
のCIDRを予約します。
resource "google_compute_global_address" "private_ip_alloc_google_managed_service" {
name = "google-managed-services-<VPCの名前>"
network = google_compute_network.hoge_network.id
purpose = "VPC_PEERING"
address_type = "INTERNAL"
address = "192.168.0.0"
prefix_length = 20
}
そして、予約したCIDRをGoogleに割り当てます。
resource "google_service_networking_connection" "private_service_connection_google_managed_service" {
network = google_compute_network.hoge_network.id
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [google_compute_global_address.private_ip_alloc_google_managed_service.name]
}
Googleはこの割当てられたCIDRの中からサブネットを切り出し、その中にインスタンスを配置していきます。
割り当てるCIDRの広さには十分に気を使う必要があります。
例えばCloud SQLを使用する際にはリージョン毎に /24
のCIDRのサブネットを切り出すため、マルチリージョン構成を取る場合は広めに割り当てるのが良いです。
また、将来的に他のネットワークとの接続をしない場合でも、CIDRを予約してから割り当てたほうが無難です。
以下に書かれているように、Dockerがネットワークをブリッジするために 172.17.0.0/16
をCloud SQLのために使うことはできません。
The IP range 172.17.0.0/16 is reserved for the Docker bridge network. Any Cloud SQL instances created with an IP in that range will be unreachable. Connections from any IP within that range to Cloud SQL instances using private IP will fail.
一方で、Private service access機能によって自動的に作られるサブネットはランダムであるため、運悪くこのCIDRになる可能性もあります。
予めCIDRを予約し、それをGoogle側に割り当てることでこの悲劇を防ぐことができます。