🗂

TerraformでVPCを作成してCloud RunとCloud SQLを接続した

2024/06/27に公開

新しく簡単なREST APIを作る機会があったのでCloud RunとCloud SQLを使って作ってみました
その時にVPCがよくわかってなかったのでそのまとめです

やりたいこと

Cloud RunとCloud SQLをVPCを使って接続する

VPCの作成

VPCとは

インスタンス向けの接続を提供する機能
今回ではCloud RunとCloud SQLを接続するために使用する

作成するリソース

terraformでは以下のリソースを作成します

  • google_compute_network
  • google_vpc_access_connector
  • google_compute_global_address
  • google_service_networking_connection

google_compute_network

GCPが作成するVPCネットワークに接続するためのVPCネットワーク
Cloud SQLはService Provider VPC Networkを自動で作成するので、Service Provider VPC Networkに接続するために必要です

resource "google_compute_network" "vpc_network" {
  name = "${var.vpc_name}-vpc"
}

google_vpc_access_connector

VPC外のCloud RunからVPCにアクセスするためのコネクター
ip_cidr_rangeに何を設定すればいいかわからなかった&IPアドレスについて色々忘れていたのでおさらいしました

プライベートIPについて

特定のネットワーク内で割り当てられるIPアドレスのこと
今回のip_cidr_rangeにはプライベートIPアドレスを記載すれば良さそうです
有効な範囲は公式ドキュメント参照
無難に以下の範囲のどれかを指定するのが良さそうです

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
resource "google_vpc_access_connector" "connector" {
  region        = "asia-northeast1"
  name          = "${var.vpc_name}-connector"
  ip_cidr_range = "10.20.0.0/28"
  network       = google_compute_network.vpc_network.id
}

VPCネットワーク > サーバレスVPCアクセスのページにコネクターが作成されます

google_service_networking_connection

VPCからCloud SQLのService Provider VPC Networkに接続するためのコネクター(VPC Peering)

resource "google_compute_global_address" "private_ip_address" {
  name          = "${var.vpc_name}-private-ip"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  address       = "10.10.0.0"
  prefix_length = 16
  network       = google_compute_network.vpc_network.id
}

resource "google_service_networking_connection" "default" {
  network                 = google_compute_network.vpc_network.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}

Cloud SQLとCloud Runの接続

VPCとコネクターを作成したので、後はCloud SQLでprivate_networkを指定します

resource "google_sql_database_instance" "mysql" {
  (省略)

  settings {
    (省略)

    ip_configuration {
      ipv4_enabled                                  = false
      private_network                               = var.vpc_network_id
      enable_private_path_for_google_cloud_services = false
    }
}
resource "google_cloud_run_v2_service" "cloud_run_service" {
  (省略)

  template {
    (省略)

    vpc_access {
      connector = var.vpc_network_connector_id
      egress    = "PRIVATE_RANGES_ONLY"
    }
  }
}

まとめ

やることはシンプルですが、何が起こっているのかよくわからなかったので改めて調べてみると構造が理解できました

参考

Discussion