🤖

VPC内でCloud SQL通信する

2024/04/15に公開

初めに

GCP環境のセキュリティを向上させるために Security Command Center を導入しチェックしたところ Cloud SQL にてパブリックIPを使われていることが検出されたため、プライベートIPを使った通信に切り替えるべく、その時の作業を忘備録的に残します。

設定箇所

Cloud SQLをVPC内で通信させるには以下の設定が必要です。

  • Cloud SQL
  • VPCネットワーク
  • サブネット
  • VPCネットワークピアリング
  • プライベートサービスアクセス

また、Cloud RunやCloud Functionなどサーバレスな環境から接続する場合はそれらがVPC経由でプライベートアクセスできるようにするために、サーバレスVPCアクセスの設定も必要となります。
今回はその部分の設定は除きます。

設定

設定は今回はTerrafromから設定を行いました。リソースごとにTerraformのコードを書いておきます。

今回の設定は、VPCネットワークピアリングの設定で servicenetworking というCloudSQLなどのマネージドサービスのためのVPCを用意してGCEがある既存のVPCとのルートを作り、プライベートサービスアクセスでVPCピアリングで用意したVPCにサブネットを作りCloudSQLにプライベートIPを割り当てる形になります。

※各APIを有効にしておくこと

VPC

resource "google_compute_network" "private_network" {
  provider = google-beta
  name = "private-network"
  auto_create_subnetworks = false
}

サブネットワーク

resource "google_compute_subnetwork" "subnetwork" {
  name          = "test-subnetwork"
  ip_cidr_range = "10.2.0.0/16"
  region        = "us-central1"
  network       = google_compute_network.private_network.id
}

VPCネットワークピアリング

resource "google_compute_global_address" "private_ip_address" {
  provider = google-beta

  name          = "private-ip-address"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16
  network       = google_compute_network.private_network.id
}

プライベートサービスアクセス

resource "google_service_networking_connection" "private_vpc_connection" {
  provider = google-beta

  network                 = google_compute_network.private_network.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}

Cloud SQL

resource "google_sql_database_instance" "instance" {
  provider = google-beta

  name   = "private-instance"
  database_version = "POSTGRES_15"
  region = "us-central1"

  // Terraformでdestroyするときにエラーが出るので削除プロテクションは無効にする
  deletion_protection  = "false"

  // プライベートサービスアクセスの作成に時間が掛かるので依存関係に含める
  depends_on = [google_service_networking_connection.private_vpc_connection]

  settings {
    tier = "db-f1-micro"
    ip_configuration {
      ipv4_enabled    = false // プライベートIP
      private_network = google_compute_network.private_network.id
      require_ssl= false
      ssl_mode = "ALLOW_UNENCRYPTED_AND_ENCRYPTED"
    }
  }
}

まとめ

簡単ですが上記の設定でVPC経由でCloudSQLにアクセスできるようになります。
CloudSQL以外にもプライベートアクセスをサポートするサービスは複数あります。
サポート対象のサービス
またサーバレスのサービスの場合は上記にもあるように別の設定サーバレスVPCアクセスが必要となります。
使用するサービスで使い分けてください。

以上、皆さんの役立てれば幸いです。

レスキューナウテックブログ

Discussion