プライベートIPアドレスを割り当てたGoogle Cloud SQLのインスタンスに,Google Cloud Runなどのサーバーレス環境からアクセスする方法を紹介します.
方法
Terraformのgoogle_sql_database_instance
,google_compute_network
,google_compute_global_address
,google_service_networking_connection
を使います.
resource "google_compute_network" "private_network" { name = "private-network" } resource "google_compute_global_address" "private_ip_address" { 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" { network = google_compute_network.private_network.id service = "servicenetworking.googleapis.com" reserved_peering_ranges = [google_compute_global_address.private_ip_address.name] } resource "google_sql_database_instance" "instance" { name = "private-instance" depends_on = [google_service_networking_connection.private_vpc_connection] settings { tier = "db-f1-micro" ip_configuration { ipv4_enabled = false private_network = google_compute_network.private_network.id } } }
depends_on
を明記しないとエラーになります.
Cloud Runからアクセスするには以下のようにgoogle_vpc_access_connector
*1を追加した上で,run.googleapis.com/vpc-access-connector
を設定します.
resource "google_vpc_access_connector" "vpc_connector" { name = "vpc-connector" ip_cidr_range = "10.14.0.0/28" network = google_compute_network.private_network.name } resource "google_cloud_run_service" "service" { name = "service" template { } metadata { annotations = { "run.googleapis.com/vpc-access-connector" = google_vpc_access_connector.sql_connector.name "run.googleapis.com/vpc-access-egress" = "private-ranges-only" } } }
トラブルシューティング
Google Cloud PlatformのWebページでSQL > Connections > Networking > Private IP に,Private service connection required というエラーが出て,Cloud Runからデータベースにアクセスできないことがあります.
これはgoogle_service_networking_connection
が正しく設定されていないことが原因ですので,上記の如くTerraformで作成するか,VPC netoworks > VPC network details > PRIVATE SERVICE CONNECTION tab > PRIVATE CONNECTIONS TO SERVICES tab > Create Connection より作成します.
正しく作成されると,このようになります.
VPC Access Connectorの料金
サーバーレス環境からCloud SQLにアクセスするために必要なVPC Access Connectorを実行するための料金が追加で必要となります.
サーバーレス VPC コネクタに自動的にプロビジョニングされたスループットに対して、100 Mbps あたり 1 e2-micro インスタンスとして課金されます。
Google Cloud SQLにGlobal IPを割り当てるならばその限りではありませんが,設定を間違えると全世界からデータベースにアクセスできてしまうかもしれません.セキュリティを向上させるために,なるべくならばプライベートネットワークでデータベースを扱うよう工夫するべきだと思います.
Cloud RunからプライベートIPを割り当てたCloud SQLインスタンスにアクセスできるようになったのはありがたいです*2が,いろいろなリソースを作成して関連付けないといけないので,少しハードルが高いと感じました.もう少し気軽に扱えるようになれば便利だと思います.