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

1. Introdução

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

Pensando na conexão

Existem muitos tipos de aplicativos e frameworks. Neste codelab, vamos abordar a conexão com o Cloud SQL de um aplicativo em execução em uma máquina virtual gerenciada no Google Compute Engine por um endereço IP privado interno usando o Cloud SQL Proxy. Essa é uma maneira incrivelmente segura de executar um aplicativo com estado na nuvem. Você minimiza sua exposição à Internet restringindo o uso apenas de um IP privado e usando o proxy SQL, que processa a conectividade SSL para você.

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

O que você vai criar

Este codelab é muito minimalista. A ideia é mostrar os detalhes da conexão sem pensar muito no aplicativo em si. Em um mundo perfeito, a conexão com o Cloud SQL é como a conexão com qualquer outra instância de um banco de dados SQL. Portanto, você pode usar o que criar neste codelab e aplicar a qualquer aplicativo de produção.

As instruções incluem um tutorial sobre como fazer as coisas no console do GCP, além dos equivalentes de comando da gcloud para uso na CLI ou automação.

As etapas individuais são:

  • Criar uma conta de serviço mínima para ativar a conexão com a instância do Cloud SQL
  • Criar uma VM no Google Compute Engine (GCE)
  • Crie uma instância do Cloud SQL. Este tutorial usa o Postgres, mas funciona de maneira semelhante para o MySQL ou o SQL Server.
  • Fazer o download e executar o Cloud SQL Proxy na instância do GCE

O que é necessário

  • Uma conta do GCP em que você tenha permissões 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. Para este codelab, precisamos de uma permissão para conceder ao proxy do Cloud SQL permissão 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.

Atribua um nome e um 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 não tem papéis/permissões atribuídos. Para atribuir a função adequada, 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 a conta de serviço for chamada de 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 que vai hospedar o aplicativo a que queremos nos conectar. Neste codelab, não vamos criar um aplicativo, mas vamos confirmar a conectividade executando o psql.

No console

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

Há muitas opções aqui. 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 de baixo da página.

Como usar a gcloud

A conta de serviço é o nome completo da conta que você criou antes. Portanto, ela 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, vamos criar um banco de dados do Postgres, mas as instruções são semelhantes para todos os três.

No console

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

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

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

A inicialização da instância geralmente leva alguns minutos.

Como usar a gcloud

Como não temos prompts adequados para ativar APIs aqui, vamos fazer isso manualmente.

gcloud services enable servicenetworking.googleapis.com

Em seguida, precisamos ativar a conectividade de serviço particular na nossa rede VPC padrão. A primeira etapa é 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, atribua 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 só está disponível na versão Beta. A combinação de --no-assign-ip e --network=default permite a conectividade de IP particular. No momento, não é possível ativar o IP privado e o IP público ao mesmo tempo. Portanto, se você precisar de acesso público, edite 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

Depois de nos conectarmos à VM, vamos precisar de uma string de conexão de instância. Primeiro, vamos pegar isso e depois nos conectar à própria VM via SSH. As instruções para essas partes estarão nas respectivas seções para console x gcloud. O restante serão comandos executados no shell da VM em uma seção própria.

No console

Acesse este link e clique no nome da instância do Cloud SQL.

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

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 conferir o restante das instruções, já que elas são as mesmas para os dois casos.

Como usar a gcloud

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

gcloud sql instances describe <INSTANCE NAME> | grep connectionName

Salve o nome da conexão da instância para uso posterior.

Substitua <ZONE> pela zona usada quando você criou a instância. Se você não mudou, ele foi definido como us-central1-b. Substitua <INSTANCE_NAME> pelo que você especificou anteriormente.

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

Depois de se conectar à VM

Primeiro, precisamos fazer o download do proxy. Depende do seu sistema operacional. Se você não mudou o SO na criação da VM, ele será o Linux, e você poderá usar:

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

Se você mudou o sistema operacional, acesse este link para conferir o comando certo e conseguir o proxy para seu SO.

Para executar o proxy, pegue 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 Postgres ou se tiver alterado a porta padrão em que o banco de dados está escutando.

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

6. Testar a conexão e concluir

Como mencionado anteriormente, se você tiver um aplicativo que queira executar na instância do GCE para testar, isso também é possível. Neste codelab, vamos instalar o psql e usar esse cliente para verificar se podemos nos conectar ao nosso banco de dados.

Na sessão SSH da 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ê configurou ao criar a instância do Cloud SQL.

Parabéns! Se tudo deu certo, você vai 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