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 VPCs. O Private Service Connect (PSC) permite que os produtores de serviços exponham os serviços por meio de anexos de serviço. Esses anexos de serviço podem ser usados pelos consumidores para criar endpoints e/ou back-ends do PSC no ambiente e se conectar a esses serviços de produção por um IP particular especificado.

O Cloud SQL tem a capacidade de usar o anexo de serviço do PSC para permitir a conexão particular. 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 a endpoints do PSC com o CloudSQL.

Figura 1.

1893f48fe1298ea2.png

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

Objetivos

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

  • Crie uma instância do CloudSQL com anexo do serviço 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 CloudSQL
  • Verifique o acesso ao banco de dados SQL de uma VM de teste na rede do consumidor pelo 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 do 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 de cima do console, à direita. Verifique se o ID do projeto do banco de dados aparece para o projeto do banco de dados no Cloud Shell. Confirme todos os avisos para permitir o acesso. 4261e776f64ea978.png
  2. Crie uma pasta chamada terraform-db e mova para a pasta
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 as solicitações necessárias para que a interface possa ser carregada.
  2. Depois de carregar, navegue até File > Open Folder e acesse /home/your-user-name/terraform-db e 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 real entre aspas. Substitua o texto your-consumer-project-id-here pelo ID do seu projeto de consumidor real 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 as 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, verifique se você está no diretório cd terraform-db terraform-db e execute os comandos a seguir.

terraform init

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

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 CloudSQL com anexo do PSC (Terraform)

Vamos usar o Terraform para criar uma instância do CloudSQL com a opção PSC para permitir a conectividade. Conclua essa configuração no projeto do 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 verifique 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 CloudSQL com anexo do PSC pode levar mais de 5 minutos.

Verificar o banco de dados

  1. Depois de concluir, acesse SQL no console e selecione a instância de banco de dados psc-sql-db recém-criada.
  2. No lado esquerdo, abra o menu suspenso de opções do SQL e selecione Conexões.
  3. Na guia "Resumo", você pode conferir informações sobre a conexão.
  4. Copie o Endereço do anexo do serviço e salve-o em algum lugar do seu sistema.
  5. Você vai precisar dele para concluir a etapa 8 da tarefa 3.

Cloud SQL com anexo de PSC

  1. No lado esquerdo, abra o menu suspenso de opções do SQL e selecione Usuários.
  2. Um usuário chamado testsql com a senha cloudsql24 (que será usada para acessar o banco de dados mais tarde)

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

No projeto do 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 do ícone do Google Cloud, clique no menu suspenso e selecione a guia todos.

barra de projetobarra de projeto 2

  1. Nos projetos listados, selecione o ID do projeto do consumidor para continuar.
  2. Abra o Cloud Shell, localizado na parte de cima do console, à direita. Verifique se o ID do projeto do consumidor aparece no Cloud Shell e confirme as solicitações para permitir o acesso.
  3. Crie uma pasta chamada terraform-consumer e mova para a pasta
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 as solicitações necessárias para que a interface possa ser carregada.
  2. Depois de carregar, navegue até File > Open Folder e acesse /home/your-user-name/terraform-consumer e 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 seu ID do projeto do consumidor real entre aspas. Substitua o texto your-psc-attachment-id-here pelo endereço de anexo do PSC entre aspas. Este é o ID que você copiou na tarefa 2, seção 2-5 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 as 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 do consumidor e execute os comandos a seguir.

terraform init

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

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: Criar o endpoint do PSC para o anexo do banco de dados SQL no projeto do consumidor e testar a VM (Terraform)

Conclua essa configuração no projeto do consumidor.

  1. Volte para o 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 do consumidor e execute os comandos a seguir.

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 o endpoint estão em regiões diferentes, precisamos ativar o acesso global no endpoint do PSC. Isso é feito pelo console
  3. No console do projeto do 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 Salvar. 7eeb5a4162f5f79d.png
  5. Continuar para a próxima etapa para verificar a conectividade

7. Tarefa 5: Verificar a conectividade do endpoint da VM pelo 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 DB pelo 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 encerrar a conexão.

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

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

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

barra de projetobarra de projeto 2

  1. Nos projetos listados, selecione o ID do projeto do banco de dados 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 do consumidor**.**.

banco de dados do Cloud SQL

9. Limpeza

Conclua isso no projeto do banco de dados

  1. Selecione o ID do projeto do 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 a seguir e digite yes. Todos os recursos que você criou no projeto do banco de dados com o Terraform serão removidos.

Conclua isso no projeto de consumidor

  1. Selecione o ID do projeto do consumidor
  2. Acesse o Cloud Shell e verifique se o ID do projeto do consumidor está disponível.
  3. Acesse o diretório terraform-consumer cd terraform-consumer e execute o comando terraform destroy a seguir e digite yes. Todos os recursos que você criou no projeto do 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 pelo endpoint do PSC.

Saiba mais

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