🗂
TerraformでVPCを作成してCloud RunとCloud SQLを接続した
新しく簡単な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