Como se conectar ao Cloud SQL: Compute Engine, IP privado e Cloud SQL Proxy

1. Introdução

Última atualização:06/05/2021

Pensar na conexão

Existem muitos tipos de aplicativos e frameworks por aí. Neste codelab, você vai aprender a se conectar ao Cloud SQL por um aplicativo que está sendo executado em uma máquina virtual gerenciada no Google Compute Engine por um endereço IP privado interno usando o proxy do Cloud SQL. Essa é uma maneira incrivelmente segura de executar um aplicativo com estado na nuvem. Você está minimizando sua exposição à Internet restringindo o uso apenas de um IP privado e usando o SQL Proxy, que lida com a conectividade SSL para você.

Um caso de uso comum para isso seria, por exemplo, um aplicativo no local que foi alterado para ser executado na nuvem em vez de localmente.

O que você vai criar

Este codelab é muito minimalista. A ideia é orientar você sobre os fundamentos da peça de conexão, sem se preocupar muito com o aplicativo em si. Em um mundo perfeito, conectar-se ao Cloud SQL é como se conectar a qualquer outra instância de um banco de dados SQL. Você deve conseguir aplicar o que criar neste codelab a qualquer aplicativo de produção.

As instruções incluem um tutorial sobre como usar o console do GCP e os comandos gcloud equivalentes para usar na CLI ou na automação.

As etapas individuais são:

  • Criar uma conta de serviço mínima para permitir a conexão com a instância do Cloud SQL
  • Criar uma VM no Google Compute Engine (GCE)
  • Criar uma instância do Cloud SQL (este tutorial usa Postgres, mas funciona de forma semelhante para MySQL ou SQL Server)
  • Faça o download e execute o Cloud SQL Proxy na instância do GCE

O que é necessário

  • Uma conta do GCP em que você tem permissão para ativar APIs e criar serviços

2. Criar uma conta de serviço

As contas de serviço são usadas para conceder permissões de uso de serviços diferentes no projeto do GCP. Neste codelab, precisamos de um código para conceder a permissão do Cloud SQL Proxy para se conectar à nossa instância do Cloud SQL.

No console

Acesse a página de contas de serviço do IAM e clique no botão f8393a08b37a422c.png na parte superior da página.

Dê um nome e ID exclusivos à sua conta de serviço e clique em CRIAR.

Na próxima página, clique na lista suspensa "Selecionar um papel". Filtre por "Cloud SQL" e selecione o papel de cliente do Cloud SQL. Clique em "CONTINUE".

Clique em CONCLUÍDO.

Como usar a gcloud

Crie a conta de serviço:

gcloud iam service-accounts create <SERVICE_ACCOUNT_NAME> --display-name "<SERVICE_ACCOUNT_NAME> service account"

Isso cria a conta de serviço, mas ela ainda não tem papéis/permissões atribuídos. Para atribuir o papel apropriado, execute:

gcloud projects add-iam-policy-binding <GCP PROJECT ID> --member serviceAccount:<SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com --role roles/cloudsql.client

Por exemplo: Se o nome da conta de serviço for sa-test quando você a criou e o projeto for my-project-test, o comando será:

gcloud projects add-iam-policy-binding my-project-test --member serviceAccount:sa-test@my-project-test.iam.gserviceaccount.com --role roles/cloudsql.client
gcloud iam service-accounts keys create service-account.json --iam-account <SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com

3. Como criar a VM do Compute Engine

O Google Compute Engine é o serviço gerenciado em que a máquina virtual será executada e vai manter o aplicativo do qual queremos nos conectar. Neste codelab, não estamos criando um aplicativo, mas vamos confirmar a conectividade executando psql.

No console

Acesse a página do Google Compute Engine e clique no botão 77c46cd1f51bed5c.png.

Há muitas opções aqui, e você só precisa fazer o seguinte:

  1. Dê um nome à instância
  2. Mude Machine type para f1-micro.
  3. Em "Identidade e acesso à API", mude o menu suspenso de Service account de Default compute service account para o que você criou na etapa anterior.
  4. Clique em "Criar" na parte inferior da página

Como usar a gcloud

A conta de serviço é o nome completo da conta de serviço que você criou anteriormente, por isso estará no formato: <NAME>@<PROJECT>.iam.gserviceaccount.com.

gcloud compute instances create <INSTANCE NAME> --machine-type=f1-micro --zone=us-central1-b --service-account=<SERVICE ACCOUNT FULL NAME>
gcloud compute zones list

4. Como criar a instância do Cloud SQL

O Cloud SQL é nossa oferta de bancos de dados relacionais gerenciados. Ele é compatível com MySQL, PostgreSQL e SQL Server. Neste codelab, criaremos um banco de dados do Postgres, mas as instruções são semelhantes para os três.

No console

Acesse a página do Cloud SQL e clique no botão 241836b315e11bf5.png.

Como mencionei, a maior parte deste codelab é genérica para qualquer variação de SQL, mas, para este codelab, escolha o PostgreSQL.

  1. Dê um ID à sua instância
  2. Digite uma senha para o usuário padrão (o nome de usuário será o padrão para o banco de dados selecionado, por exemplo, root para MySQL ou postgres para PostgreSQL)
  3. Se você alterou a região da sua instância do Compute, altere também essa região aqui.
  4. Role para baixo e clique no show configuration options
  5. Abrir a seção Connectivity
  6. Desmarque a opção Public IP e marque a caixa de seleção Private IP.
  7. Verifique se a opção default está selecionada no menu suspenso que aparece quando o IP privado é verificado
  8. Role para baixo e clique em "Criar".

Geralmente, a instância leva alguns minutos para ser iniciada.

Como usar a gcloud

Como não temos solicitações para ativar APIs aqui, é preciso fazer isso manualmente.

gcloud services enable servicenetworking.googleapis.com

Em seguida, precisamos ativar a conectividade de serviço particular na rede VPC padrão. O primeiro passo é alocar um intervalo nomeado de endereços IP para usar na instância.

gcloud compute addresses create sql-codelab-allocation --global --purpose=VPC_PEERING --prefix-length=24 --network=default

Em seguida, vamos atribuir esse intervalo de IPs aos nossos serviços internos (isso leva cerca de um minuto).

gcloud services vpc-peerings update --service=servicenetworking.googleapis.com  --network=default     --project=<PROJECT ID> --ranges=sql-codelab-allocation --force

Por fim, a criação da instância em si só está disponível no momento na versão Beta. A combinação de --no-assign-ip e --network=default é o que permite a conectividade de IP particular. No momento, não é possível ativar o IP privado e o público ao mesmo tempo. Portanto, se você precisar de acesso público, será necessário editar a instância após a criação. Esse processo leva alguns minutos para ser concluído.

gcloud beta sql instances create test-sql-codelab-00 --no-assign-ip --database-version=POSTGRES_11 --tier=db-f1-micro --region=us-central1 --network=default --root-password=<PASSWORD>

5. Configurar e executar o Cloud SQL Proxy

Quando a conexão com a VM estiver pronta, vamos precisar de uma string de conexão da instância. Primeiro, vamos nos conectar à VM via SSH. As instruções para essas partes estão nas respectivas seções do console e da gcloud. O restante são comandos executados a partir do shell na VM, na própria seção.

No console

Clique aqui no nome da instância do Cloud SQL.

Role um pouco para baixo e copie o Connection name para usar mais tarde.

Acesse a página da lista de instâncias do Google Compute Engine e encontre a linha com sua VM.

Na coluna Connect, clique no botão SSH para abrir uma janela separada que se conecta com segurança à máquina virtual.

Pule a seção Using gcloud para o restante das instruções, porque as duas são as mesmas.

Como usar a gcloud

Substitua <INSTANCE NAME> pelo nome da sua instância do Cloud SQL:

gcloud sql instances describe <INSTANCE NAME> | grep connectionName

Salve o nome da conexão da instância para usar mais tarde.

Substitua <ZONE> pela zona que foi usada quando você criou a instância. Se você não mudou, ela foi definida como us-central1-b. E substitua <INSTANCE_NAME> com o que foi especificado anteriormente.

gcloud compute ssh --zone <ZONE> <INSTANCE_NAME>

Após a conexão com a VM

Primeiro, precisamos baixar o proxy. Depende do seu sistema operacional. Se você não alterou o SO na criação da VM, então ele será o Linux e é possível usar:

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy

Se você trocou o sistema operacional, clique aqui e confira o comando correto para acessar o proxy do seu SO.

Para executar o proxy, use o nome da conexão da instância que você copiou dos detalhes da instância do Cloud SQL para substituir <INSTANCE_CONNECTION_NAME>. Além disso, o número da porta TCP pode mudar se você não estiver usando um banco de dados do Postgres ou se tiver alterado a porta padrão que o banco de dados está escutando.

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

6. Teste a conexão e o encerramento

Como mencionado anteriormente, se você quiser colocar um aplicativo na instância do GCE para testar, não tem problema. Neste codelab, vamos instalar o psql e usar esse cliente para verificar se podemos fazer conexão com o banco de dados.

Na sessão SSH na VM:

sudo apt-get install postgresql-client
psql "host=127.0.0.1 port=5432 sslmode=disable user=postgres"

Em seguida, especifique a senha do usuário padrão que você definiu ao criar a instância do Cloud SQL.

Parabéns! Se tudo tiver corrido bem, você terá o prompt do Postgres e poderá executar comandos no seu banco de dados.

Qual é a próxima etapa?

Confira alguns destes codelabs:

Documentos de referência