O serviço de migração de bases de dados usa o Private Service Connect para se ligar à sua instância do Cloud SQL de destino através de um endereço IP privado. Com o Private Service Connect, pode expor a sua base de dados de destino a ligações seguras recebidas e controlar quem pode aceder à base de dados.
A configuração da arquitetura de rede para o Private Service Connect difere consoante use uma instância do Cloud SQL com ou sem o PSC ativado.
Para mais informações sobre os métodos de conetividade de destino, consulte o artigo Vista geral dos métodos de conetividade da base de dados de destino.
Private Service Connect para instâncias do Cloud SQL com PSC ativado
Para usar a conetividade privada com destinos do Cloud SQL para PostgreSQL ativados para o PSC, siga estes passos:
- Quando criar e configurar a instância de destino, certifique-se de que a cria como uma instância ativada para o PSC com um IP privado. Não pode modificar uma instância do Cloud SQL existente para que fique ativada para o Private Service Connect.
- Numa fase posterior, quando
criar o perfil de associação de destino, na secção
Definir método de conetividade, selecione IP privado.
O campo Nome da associação de serviço é preenchido automaticamente com a associação de serviço criada para a instância de destino.
Private Service Connect para instâncias do Cloud SQL não ativadas para o PSC
Para usar a conetividade de IP privado para destinos do Cloud SQL para PostgreSQL que não são criados com o Private Service Connect ativado, tem de criar componentes de rede adicionais para encaminhar tráfego entre o Database Migration Service e o seu destino. Para mais informações, consulte o artigo Conetividade de destino de IP privado para instâncias do Cloud SQL que não usam o PSC.
Se uma máquina virtual (VM) bastion não for suficiente para as suas necessidades de rede, configure um grupo de instâncias para a configuração do produtor de rede. Para mais informações, consulte o artigo Conetividade de rede em serviços geridos.
Para criar a configuração do produtor do Private Service Connect necessária, recomendamos que use a CLI Google Cloud ou scripts de automatização do Terraform. Antes de usar qualquer um dos dados de comandos, faça as seguintes substituições:
- PROJECT_ID com o projeto no qual cria a configuração do produtor do Private Service Connect.
- REGION com a região na qual cria a configuração do produtor do Private Service Connect.
- ZONE com a zona em que REGION cria todos os recursos zonais (por exemplo, a VM bastion).
- BASTION com a VM bastion a criar.
- DB_SUBNETWORK com a sub-rede para a qual o tráfego vai ser encaminhado. A sub-rede tem de ter acesso à instância do Cloud SQL.
- DB_SUBNETWORK_GATEWAY com a gateway IPv4 da sub-rede.
- CLOUD_SQL_INSTANCE_CONNECTION_NAME
com o nome de ligação da instância do Cloud SQL
(formatado como
project:region:name
). - PORT com a porta que o bastion vai usar para expor a base de dados subjacente.
- CLOUD_SQL_INSTANCE_PRIVATE_IP com o endereço IP privado da instância do Cloud SQL de destino.
gcloud
O seguinte script bash usa a CLI do Google Cloud para criar a configuração do produtor do Private Service Connect para a base de dados de destino. Tenha em atenção que algumas predefinições podem ter de ser ajustadas; por exemplo, os intervalos CIDR da sub-rede do Private Service Connect.
#!/bin/bash
# Create the VPC network for the Database Migration Service Private Service Connect.
gcloud compute networks create dms-psc-vpc \
--project=PROJECT_ID \
--subnet-mode=custom
# Create a subnet for the Database Migration Service Private Service Connect.
gcloud compute networks subnets create dms-psc-REGION \
--project=PROJECT_ID \
--range=10.0.0.0/16 --network=dms-psc-vpc \
--region=REGION
# Create a router required for the bastion to be able to install external
# packages (for example, Dante SOCKS server):
gcloud compute routers create ex-router-REGION \
--network dms-psc-vpc \
--project=PROJECT_ID \
--region=REGION
gcloud compute routers nats create ex-nat-REGION \
--router=ex-router-REGION \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--enable-logging \
--project=PROJECT_ID \
--region=REGION
# Create the bastion VM.
gcloud compute instances create BASTION \
--project=PROJECT_ID \
--zone=ZONE \
--image-family=debian-11 \
--image-project=debian-cloud \
--network-interface subnet=dms-psc-REGION,no-address \
--network-interface subnet=DB_SUBNETWORK,no-address \
--metadata=startup-script='#!/bin/bash
# Route the private IP address using the gateway of the database subnetwork.
# Find the gateway for the relevant subnetwork on the VPC network page
# in the Google Cloud console. Click VPC networks and select the database VPC
# to see the details.
ip route add CLOUD_SQL_INSTANCE_PRIVATE_IP via DB_SUBNETWORK_GATEWAY
# Install Dante SOCKS server.
apt-get install -y dante-server
# Create the Dante configuration file.
touch /etc/danted.conf
# Create a proxy.log file.
touch proxy.log
# Add the following configuration for Dante:
cat > /etc/danted.conf << EOF
logoutput: /proxy.log
user.privileged: proxy
user.unprivileged: nobody
internal: 0.0.0.0 port = PORT
external: ens5
clientmethod: none
socksmethod: none
client pass {
from: 0.0.0.0/0
to: 0.0.0.0/0
log: connect error disconnect
}
client block {
from: 0.0.0.0/0
to: 0.0.0.0/0
log: connect error
}
socks pass {
from: 0.0.0.0/0
to: CLOUD_SQL_INSTANCE_PRIVATE_IP/32
protocol: tcp
log: connect error disconnect
}
socks block {
from: 0.0.0.0/0
to: 0.0.0.0/0
log: connect error
}
EOF
# Start the Dante server.
systemctl restart danted
tail -f proxy.log'
# Create the target instance from the created bastion VM.
gcloud compute target-instances create bastion-ti-REGION \
--instance=BASTION \
--project=PROJECT_ID \
--instance-zone=ZONE \
--network=dms-psc-vpc
# Create a forwarding rule for the backend service.
gcloud compute forwarding-rules create dms-psc-forwarder-REGION \
--project=PROJECT_ID \
--region=REGION \
--load-balancing-scheme=internal \
--network=dms-psc-vpc \
--subnet=dms-psc-REGION \
--ip-protocol=TCP \
--ports=all \
--target-instance=bastion-ti-REGION \
--target-instance-zone=ZONE
# Create a TCP NAT subnet.
gcloud compute networks subnets create dms-psc-nat-REGION-tcp \
--network=dms-psc-vpc \
--project=PROJECT_ID \
--region=REGION \
--range=10.1.0.0/16 \
--purpose=private-service-connect
# Create a service attachment.
gcloud compute service-attachments create dms-psc-svc-att-REGION \
--project=PROJECT_ID \
--region=REGION \
--producer-forwarding-rule=dms-psc-forwarder-REGION \
--connection-preference=ACCEPT_MANUAL \
--nat-subnets=dms-psc-nat-REGION-tcp
# Create a firewall rule allowing the Private Service Connect NAT subnet.
# access the Private Service Connect subnet
gcloud compute \
--project=PROJECT_ID firewall-rules create dms-allow-psc-tcp \
--direction=INGRESS \
--priority=1000 \
--network=dms-psc-vpc \
--action=ALLOW \
--rules=all \
--source-ranges=10.1.0.0/16 \
--enable-logging
# Print out the created service attachment.
gcloud compute service-attachments describe dms-psc-svc-att-REGION \
--project=PROJECT_ID \
--region=REGION
Terraform
O seguinte script bash usa a CLI do Google Cloud para criar a configuração do produtor do Private Service Connect para a base de dados de destino. Tenha em atenção que algumas predefinições podem ter de ser ajustadas; por exemplo, os intervalos CIDR da sub-rede do Private Service Connect.
variables.tf
:
variable "project_id" {
type = string
description = <<DESC
The Google Cloud project in which the setup is created. This should be the same project as
the one that the Cloud SQL instance belongs to.
DESC
}
variable "region" {
type = string
description = "The Google Cloud region in which you create the Private Service Connect
regional resources."
}
variable "zone" {
type = string
description = <<DESC
The Google Cloud zone in which you create the Private Service Connect zonal resources
(should be in the same region as the one specified in the "region" variable).
DESC
}
variable "cloud_sql_instance_name" {
type = string
description = "The Cloud SQL instance name."
}
variable "port" {
type = string
description = "The port that the bastion will use to expose the underlying database."
default = "5432"
}
variable "cloud_sql_instance_network" {
type = string
description = <<DESC
The VPC to which the Cloud SQL instance is peered. This is where the bastion will
forward connections to (the destination database needs to be accessible in this VPC).
DESC
}
main.tf
:
/* To execute the call:
terraform apply
-var="project_id=PROJECT_ID"
-var="region=REGION"
-var="zone=ZONE"
-var="cloud_sql_instance_name=CLOUD_SQL_INSTANCE_NAME"
-var="port=PORT"
-var="cloud_sql_instance_network=CLOUD_SQL_INSTANCE_NETWORK" */
locals {
cloud_sql_instance_connection_name = "${var.project_id}:${var.region}:${var.cloud_sql_instance_name}"
}
# Needed for getting the private IP address of the Cloud SQL instance.
data "google_sql_database_instance" "csql_instance" {
name = var.cloud_sql_instance_name
project = var.project_id
}
# Needed for getting the IPv4 gateway of the subnetwork for the database.
data "google_compute_subnetwork" "db_network_subnet" {
name = var.cloud_sql_instance_network
project = var.project_id
region = var.region
}
resource "google_compute_network" "psc_sp_network" {
name = "dms-psc-network"
project = var.project_id
auto_create_subnetworks = false
}
resource "google_compute_subnetwork" "psc_sp_subnetwork" {
name = "dms-psc-subnet"
region = var.region
project = var.project_id
network = google_compute_network.psc_sp_network.id
# CIDR range can be lower.
ip_cidr_range = "10.0.0.0/16"
}
resource "google_compute_subnetwork" "psc_sp_nat" {
provider = google-beta
name = "dms-psc-nat"
region = var.region
project = var.project_id
network = google_compute_network.psc_sp_network.id
purpose = "PRIVATE_SERVICE_CONNECT"
# CIDR range can be lower.
ip_cidr_range = "10.1.0.0/16"
}
resource "google_compute_service_attachment" "psc_sp_service_attachment" {
provider = google-beta
name = "dms-psc-svc-att"
region = var.region
project = var.project_id
enable_proxy_protocol = false
connection_preference = "ACCEPT_MANUAL"
nat_subnets = [google_compute_subnetwork.psc_sp_nat.id]
target_service = google_compute_forwarding_rule.psc_sp_target_direct_rule.id
}
resource "google_compute_forwarding_rule" "psc_sp_target_direct_rule" {
name = "dms-psc-fr"
region = var.region
project = var.project_id
network = google_compute_network.psc_sp_network.id
subnetwork = google_compute_subnetwork.psc_sp_subnetwork.id
load_balancing_scheme = "INTERNAL"
ip_protocol = "TCP"
all_ports = true
target = google_compute_target_instance.psc_sp_target.id
}
resource "google_compute_target_instance" "psc_sp_target" {
provider = google-beta
name = "dms-psc-fr-target"
zone = var.zone
instance = google_compute_instance.psc_sp_bastion.id
network = google_compute_network.psc_sp_network.id
}
resource "google_compute_instance" "psc_sp_bastion" {
name = "dms-psc-cloud-sql-bastion"
project = var.project_id
machine_type = "e2-medium"
zone = var.zone
can_ip_forward = true
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
# The incoming NIC defines the default gateway which must be the Private Service Connect subnet.
network_interface {
network = google_compute_network.psc_sp_network.id
subnetwork = google_compute_subnetwork.psc_sp_subnetwork.id
}
# The outgoing NIC which is on the same network as the Cloud SQL instance.
network_interface {
network = data.google_compute_subnetwork.db_network_subnet.network
}
metadata_startup_script = <<SCRIPT
#!/bin/bash
# Route the private IP address of the database using the gateway of the database subnetwork.
# To find the gateway for the relevant subnetwork, go to the VPC network page
# in the Google Cloud console. Click VPC networks, and select the database VPC
# to see the details.
ip route add ${data.google_sql_database_instance.csql_instance.private_ip_address} \
via ${data.google_compute_subnetwork.db_network_subnet.gateway_address}
# Install Dante SOCKS server.
apt-get install -y dante-server
# Create the Dante configuration file.
touch /etc/danted.conf
# Create a proxy.log file.
touch proxy.log
# Add the following configuration for Dante:
cat > /etc/danted.conf << EOF
logoutput: /proxy.log
user.privileged: proxy
user.unprivileged: nobody
internal: 0.0.0.0 port = ${var.port}
external: ens5
clientmethod: none
socksmethod: none
client pass {
from: 0.0.0.0/0
to: 0.0.0.0/0
log: connect error disconnect
}
client block {
from: 0.0.0.0/0
to: 0.0.0.0/0
log: connect error
}
socks pass {
from: 0.0.0.0/0
to: ${data.google_sql_database_instance.csql_instance.private_ip_address}/32
protocol: tcp
log: connect error disconnect
}
socks block {
from: 0.0.0.0/0
to: 0.0.0.0/0
log: connect error
}
EOF
# Start the Dante server.
systemctl restart danted
tail -f proxy.log
SCRIPT
}
# Required firewall rules:
/* Firewall rule allowing the Private Service Connect NAT subnet to access
the Private Service Connect subnet. */
resource "google_compute_firewall" "psc_sp_in_fw" {
name = "dms-psc-ingress-nat-fw"
project = var.project_id
network = google_compute_network.psc_sp_network.id
log_config {
metadata = "INCLUDE_ALL_METADATA"
}
allow {
protocol = "all"
}
priority = 1000
direction = "INGRESS"
source_ranges = [google_compute_subnetwork.psc_sp_nat.ip_cidr_range]
}
/* The router that the bastion VM uses to install external packages
(for example, Dante SOCKS server). */
resource "google_compute_router" "psc_sp_ex_router" {
name = "dms-psc-external-router"
project = var.project_id
region = var.region
network = google_compute_network.psc_sp_network.id
}
resource "google_compute_router_nat" "psc_sp_ex_router_nat" {
name = "dms-psc-external-router-nat"
project = var.project_id
region = var.region
router = google_compute_router.psc_sp_ex_router.name
nat_ip_allocate_option = "AUTO_ONLY"
source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
log_config {
enable = true
filter = "ERRORS_ONLY"
}
}
outputs.tf
:
# The Private Service Connect service attachment.
output "service_attachment" {
value = google_compute_service_attachment.psc_sp_service_attachment.id
}
Numa fase posterior, quando criar o perfil de associação de destino, faça o seguinte:
- Na secção Definir método de conetividade, selecione IP privado.
- No menu pendente Nome do anexo do serviço, selecione dms-psc-svc-att-REGION.