Como se conectar ao CloudSQL pelo Private Service Connect (Terraform)

1. Visão geral

Há várias opções para se conectar a uma instância privada do Cloud SQL de outro projeto ou VPC. O Private Service Connect (PSC) permite que os produtores de serviços exponham os serviços deles por anexos de serviço. Os consumidores podem usar esses anexos de serviço para criar endpoints e/ou back-ends do PSC no ambiente deles e se conectar aos serviços do produtor por um IP particular especificado.

O Cloud SQL pode usar o anexo de serviço do PSC para permitir conexões particulares. Neste laboratório, você pode configurar e testar a opção.

Neste laboratório, você vai criar uma arquitetura simples que ilustra o uso do acesso ao endpoint da PSC com o Cloud SQL.

Figura 1.

1893f48fe1298ea2.png

Para este laboratório, você vai precisar de dois projetos ou VPCs separadas no mesmo projeto.

Objetivos

Neste laboratório, você vai aprender a fazer o seguinte:

  • Crie uma instância do Cloud SQL com um anexo de serviço do PSC.
  • Criar um endereço IP estático
  • Crie um endpoint do PSC na VPC do consumidor para se conectar ao banco de dados do Cloud SQL.
  • Verifique o acesso ao banco de dados SQL de uma VM de teste na rede do consumidor usando o IP do endpoint do PSC.

2. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google e pode ser atualizada quando você quiser.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não vai ser muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Inicie o Cloud Shell

Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.

No Console do Google Cloud, clique no ícone do Cloud Shell na barra de ferramentas superior à direita:

55efc1aaa7a4d3ad.png

O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:

7ffe5cbb04455448.png

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Neste codelab, todo o trabalho pode ser feito com um navegador. Você não precisa instalar nada.

3. Tarefa 1: Configurar o ambiente para o projeto de banco de dados com o Terraform

No projeto de banco de dados,vamos criar uma VPC personalizada com regras de firewall e sub-rede. Abra o console do Cloud e selecione o projeto que você vai usar para o banco de dados.

  1. Abra o Cloud Shell, localizado na parte superior direita do console. Verifique se o ID do projeto do banco de dados aparece no projeto do banco de dados no Cloud Shell e confirme todas as solicitações para permitir o acesso. 4261e776f64ea978.png
  2. Crie uma pasta chamada terraform-db e mova para ela
mkdir terraform-db  && cd terraform-db
  1. Crie um arquivo main.tf, variable.tf e database.tf.
touch main.tf variable.tf database.tf 
  1. Mude para a visualização do editor do Cloud Shell. Selecione editor e permita todos os comandos necessários para que a interface possa ser carregada.
  2. Depois de carregado, navegue até Arquivo > Abrir pasta e acesse /home/your-user-name/terraform-db. Selecione Ok para abrir a pasta no editor. 78f5eb9f2f82f1b0.png
  3. Selecione o arquivo variable.tf e adicione o seguinte. Substitua o texto your-database-project-id-here pelo ID do seu projeto de banco de dados entre aspas. Substitua o texto your-consumer-project-id-here pelo ID do seu projeto de consumidor entre aspas.
variable "project_id" {
  type = string
  default = "your-database-project-id-here"
}

variable "project_id_consumer" {
  type = set(string)
  default = ["your-consumer-project-id-here"]
}

variable "network_id" {
  type = string
  default = "database-net"
}

variable "region_id" {
  type = string
  default = "us-east1"
}

variable "db_password" {
  type = string
  default = "cloudsql24"
}
  1. Em seguida, abra o arquivo main.tf. Vamos adicionar um código do Terraform para realizar várias ações, conforme explicado abaixo.

Ativar APIs

resource "google_project_service" "default"

Criar VPC

resource "google_compute_network" "default"

Adicionar regras de firewall

resource "google_compute_firewall" "allow_icmp"

  1. Copie e cole o seguinte no arquivo main .tf.
resource "google_project_service" "default" {
  for_each = toset([
    "compute.googleapis.com",
    "sqladmin.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = true
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-icmp"]
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}

resource "google_compute_firewall" "allow_sql" {
  name    = "allow-sql-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["3306"]
  }

  source_ranges = ["0.0.0.0/0"]
 }

resource "google_compute_firewall" "allow_internal" {
  name    = "allow-internal-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
    }


  allow {
    protocol = "tcp"
    ports    = ["0-65535"]
  }
  allow {
    protocol = "udp"
    ports    = ["0-65535"]
  }

  source_ranges = ["10.128.0.0/9"]
 }
  1. Volte para o terminal do Cloud Shell, confira se você está no diretório terraform-db cd terraform-db e execute os comandos a seguir:

terraform init

Inicializa o diretório de trabalho. Essa etapa faz o download dos provedores necessários para a configuração especificada.

terraform plan

Gera um plano de execução, mostrando quais ações o Terraform vai realizar para implantar sua infraestrutura.

  1. Agora, para criar os recursos, execute o comando terraform apply e digite yes para executar.

4. Tarefa 2: Criar uma instância do Cloud SQL com anexo do PSC (Terraform)

Vamos usar o Terraform para criar uma instância do Cloud SQL com a opção PSC para permitir a conectividade. Conclua essa configuração no projeto de banco de dados.

  1. Mude para a visualização do editor do Cloud Shell. Verifique se você está na pasta terraform-db. Selecione o arquivo database.tf e adicione o seguinte.
resource "google_sql_database_instance" "default" {
  name             = "psc-sql-db"
  region           = var.region_id
  database_version = "MYSQL_8_0"
  settings {
    tier              = "db-f1-micro"
    availability_type = "REGIONAL"
    backup_configuration {
      enabled            = true
      binary_log_enabled = true
    }
    ip_configuration {
      psc_config {
        psc_enabled               = true
        allowed_consumer_projects = var.project_id_consumer
      }
      ipv4_enabled = false
    }
  }
  deletion_protection = false 
}

resource "google_sql_user" "users" {
  name     = "testsql"
  instance = google_sql_database_instance.default.name
  password = var.db_password 
}
  1. Volte para o terminal do Cloud Shell e confira se você está no diretório terraform-db. Agora, para criar os recursos, execute o comando terraform apply e digite yes para executar. A criação da instância do Cloud SQL com o anexo do PSC pode levar mais de cinco minutos.

Verificar banco de dados

  1. Depois da conclusão, acesse SQL no console e selecione a instância de banco de dados psc-sql-db recém-criada.
  2. À esquerda, expanda o painel de opções do SQL e selecione Conexões.
  3. Na guia "Resumo", você encontra informações sobre a conexão.
  4. Copie o Endereço de vinculação de serviço e salve em algum lugar no seu sistema.
  5. Você vai precisar disso para concluir a etapa 8 da tarefa 3.

Cloud SQL com anexo de PSC

  1. À esquerda, abra o painel lateral de opções do SQL e selecione Usuários.
  2. Você vai encontrar um usuário chamado testsql com a senha cloudsql24 (será usada para acessar o banco de dados mais tarde)

5. Tarefa 3: Configurar o ambiente para o projeto do consumidor (Terraform)

No projeto consumidor,vamos criar uma VPC personalizada com regras de firewall e sub-rede. Abra o console do Cloud e selecione o projeto que você vai usar.

  1. Na parte de cima do console, à direita, ao lado do ícone do Google Cloud, clique no menu suspenso e selecione a guia all.

barra de projetobarra de projeto 2

  1. Na lista de projetos, selecione o ID do seu projeto consumidor para continuar.
  2. Abra o Cloud Shell, localizado na parte superior direita do console. Verifique se o ID do projeto do consumidor aparece no Cloud Shell e confirme todas as solicitações para permitir o acesso.
  3. Crie uma pasta chamada terraform-consumer e mova para ela.
mkdir terraform-consumer  && cd terraform-consumer
  1. Crie um arquivo main.tf, variable.tf e psc.tf.
touch main.tf variable.tf psc.tf 
  1. Mude para a visualização do editor do Cloud Shell para o ID do projeto do consumidor. Selecione editor e permita todos os comandos necessários para que a interface possa ser carregada.
  2. Depois de carregado, navegue até Arquivo > Abrir pasta e acesse /home/your-user-name/terraform-consumer. Selecione Ok para abrir a pasta no editor. 78f5eb9f2f82f1b0.png
  3. Selecione o arquivo variable.tf e adicione o seguinte. Substitua o texto your-consumer-project-id-here pelo ID do projeto do consumidor entre aspas. Substitua o texto your-psc-attachment-id-here pelo endereço do anexo do PSC entre aspas. Esse é o ID que você copiou na seção 2-5 da tarefa 2 d7ac9629a59abfc6.png
variable "project_id" {
  type = string
  default = "your-consumer-project-id-here"
}

variable "psc_attachment_id" {
  type = string
  default = "your-psc-attachment-id-here"
}

variable "network_id" {
  type = string
  default = "psc-endpoint-net"
}

variable "region_id" {
  type = string
  default = "us-east1"
}

variable "region_id2" {
  type = string
  default = "us-central1"
}
  1. Em seguida, abra o arquivo main.tf. Vamos adicionar um código do Terraform para realizar várias ações, conforme explicado abaixo.

Ativar APIs

resource "google_project_service"

Criar VPC

resource "google_compute_network"

Criar gateway NAT

resource "google_compute_router"
resource "google_compute_router_nat"

Adicionar regras de firewall

resource "google_compute_firewall"

  1. Copie e cole o seguinte no arquivo main .tf.
resource "google_project_service" "default" {
  for_each = toset([
    "compute.googleapis.com",
    "cloudresourcemanager.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = false
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_subnetwork" "vm_subnet" {
  name          = "vm-subnet"
  ip_cidr_range = "192.168.50.0/24"
  region        = var.region_id2
  network       = google_compute_network.default.name
  project       = var.project_id
}

resource "google_compute_subnetwork" "psc_subnet" {
  name          = "psc-subnet"
  ip_cidr_range = "192.168.90.0/24"
  region        = var.region_id
  network       = google_compute_network.default.name
  project       = var.project_id
}

resource "google_compute_router" "default" {
  name    = "outbound-nat"
  region  = var.region_id2
  network = google_compute_network.default.id

 bgp {
  asn = 64514
  }
}

resource "google_compute_router_nat" "default" {
  name = "outbound-nat-gw"
  router = google_compute_router.default.name
  region = google_compute_router.default.region
  nat_ip_allocate_option = "AUTO_ONLY"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"

  log_config {
    enable = true
    filter = "ERRORS_ONLY"
  }
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}


resource "google_compute_firewall" "allow_internal" {
  name    = "allow-internal-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
    }


  allow {
    protocol = "tcp"
    ports    = ["0-65535"]
  }
  allow {
    protocol = "udp"
    ports    = ["0-65535"]
  }

  source_ranges = ["192.168.0.0/16"]
 }
  1. Volte para o terminal do Cloud Shell, verifique se você está no diretório terraform-consumer cd terraform-consumer no projeto consumidor e execute os seguintes comandos:

terraform init

Inicializa o diretório de trabalho. Essa etapa faz o download dos provedores necessários para a configuração especificada.

terraform plan

Gera um plano de execução, mostrando quais ações o Terraform vai realizar para implantar sua infraestrutura.

  1. Agora, para criar os recursos, execute o comando terraform apply e digite yes para executar.

6. Tarefa 4: Crie o endpoint do PSC para o anexo do banco de dados SQL no projeto do consumidor e teste a VM (Terraform)

Conclua essa configuração no projeto do consumidor.

  1. Volte ao editor do Cloud Shell, abra o diretório terraform-consumer e selecione o arquivo psc.tf. Adicione o seguinte código do Terraform ao arquivo. Isso cria um IP interno estático, um endpoint do PSC e uma VM de teste com o Maria DB instalado.
resource "google_compute_address" "default" {
  name = "psc-ip"
  region = var.region_id
  address_type = "INTERNAL"
  subnetwork = google_compute_subnetwork.psc_subnet.name
  address = "192.168.90.100" 
}

resource "google_compute_forwarding_rule" "default" {
  name = "psc-sql-endpoint"
  region = var.region_id
  network = google_compute_network.default.name
  ip_address = google_compute_address.default.self_link
  load_balancing_scheme = ""
  target = var.psc_attachment_id
}


resource "google_compute_instance" "sql_test_vm" {
  name         = "sql-test-vm"
  machine_type = "e2-medium"
  zone         = "${var.region_id2}-b"
  project      = var.project_id

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  network_interface {
    subnetwork = google_compute_subnetwork.vm_subnet.name
  }

  # No external IP address
  network_performance_config {
    total_egress_bandwidth_tier = "DEFAULT"
  }

  tags = ["allow-icmp", "allow-ssh", "allow-internal", "allow-health-check"]

  # Install MariaDB at startup
  metadata_startup_script = <<EOF
#!/bin/bash
apt-get update
apt-get install -y mariadb-server
systemctl enable mariadb
EOF
}
  1. Volte para o terminal do Cloud Shell, verifique se você está no diretório terraform-consumer cd terraform-consumer no projeto consumidor e execute os seguintes comandos:

terraform plan

Gera um plano de execução, mostrando quais ações o Terraform vai realizar para implantar sua infraestrutura.

  1. Agora, para criar os recursos, execute o comando terraform apply e digite yes para executar.
  2. Como nossa VM e nosso endpoint estão em regiões diferentes, precisamos ativar o acesso global no endpoint do PSC. Isso é feito no console.
  3. No console do projeto consumidor, acesse Private Service Connect. Na guia Endpoint conectado, procure a seção "Endpoint" e selecione psc-sql-endpoint.
  4. Agora selecione EDITAR e clique na caixa de seleção ao lado de Ativar acesso global e na opção Salvar. 7eeb5a4162f5f79d.png
  5. Continue para a próxima etapa e verifique a conectividade

7. Tarefa 5: Verificar a conectividade do endpoint da VM usando o endereço IP do PSC

Conclua isso no projeto do consumidor

  1. Acesse Instância de VM. Selecione sql-test-vm.
  2. Selecione a opção SSH para se conectar à VM.
  3. Conecte-se ao banco de dados via endpoint com o seguinte:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. Quando a conexão for estabelecida, crie um banco de dados com o seguinte psc-sql-db.
CREATE DATABASE remotesqldb;
  1. Quando terminar, digite "exit" para sair da conexão.

8. Tarefa 6: Verificar a entrada do banco de dados

Conclua essa verificação no projeto do banco de dados.

  1. Na parte de cima do console, à direita, ao lado do ícone do Google Cloud, clique no menu suspenso e selecione a guia all.

barra de projetobarra de projeto 2

  1. Selecione o ID do projeto do banco de dados na lista para continuar.
  2. Navegue até SQL, selecione o banco de dados psc-sql-db, expanda as opções de SQL e selecione Bancos de dados. O banco de dados que você acabou de criar chamado remotesqldb vai aparecer na VM do projeto consumidor**.**

banco de dados do Cloud SQL

9. Limpeza

Conclua isso no projeto do banco de dados

  1. Selecione o ID do projeto de banco de dados
  2. Acesse o Cloud Shell e verifique se o ID do projeto do banco de dados aparece.
  3. Acesse o diretório terraform-db cd terraform-db e execute o comando terraform destroy. Digite yes. Todos os recursos criados no projeto de banco de dados com o Terraform serão removidos.

Conclua isso no projeto do consumidor

  1. Selecione o ID do projeto do consumidor
  2. Acesse o Cloud Shell e verifique se o ID do projeto consumidor aparece.
  3. Acesse o diretório terraform-consumer cd terraform-consumer e execute o comando terraform destroy. Digite yes. Todos os recursos criados no projeto de banco de dados com o Terraform serão removidos.

10. Parabéns

Parabéns! Você configurou uma instância do Cloud SQL com anexo do PSC e criou um endpoint do Private Service Connect em outra VPC. Você conseguiu se conectar de uma VM remota ao banco de dados usando o endpoint do PSC.

Saiba mais

Leia mais sobre o Private Service Connect e o Cloud SQL.