Este tutorial explica o processo de execução de uma base de dados MySQL numa rede privada no Google Cloud para permitir o acesso remoto seguro à base de dados através do Compute Engine.
Use este tutorial se quiser instalar a sua própria base de dados MySQL no Compute Engine, mas quiser restringir o acesso apenas a clientes MySQL autorizados que também estejam a ser executados no Compute Engine. Pode querer gerir a sua própria instância do MySQL em vez de usar o serviço gerido, devido a instâncias entre regiões, utilização avançada de parâmetros e necessidades de desempenho específicas.
Este tutorial descreve como configurar a sua app de servidor MySQL para aceitar tráfego remoto de um cliente MySQL instalado numa instância do Compute Engine na mesma rede privada.
Para obter informações sobre como escolher a opção de implementação do MySQL certa, consulte o artigo Como instalar o MySQL no Compute Engine.
Este tutorial pressupõe que conhece o seguinte:
- Comandos básicos do Linux
- Ubuntu-server 18.04
- MySQL 5.7
- Compute Engine
Arquitetura
Neste tutorial, implementa duas instâncias do Compute Engine. Uma instância é o servidor e a outra instância é o cliente, conforme representado no seguinte diagrama:

Criar instâncias do Compute Engine
Crie duas instâncias para o MySQL: uma instância de cliente e uma instância de servidor.
Crie uma instância de cliente do Compute Engine
-
Name the instance
my-client. -
Defina a flag
--zonepara a zona na qual quer criar a sua instância. -
Defina a flag
--image-projectcomoubuntu-os-cloud. -
Defina a flag
--image-familycomoubuntu-1804-lts. -
Defina a flag
--scopescomohttps://www.googleapis.com/auth/cloud-platform. -
Create a Compute Engine instance. Configure the instance as follows:
-
Name the instance
my-server. -
Defina a flag
--zonepara a zona na qual quer criar a sua instância. -
Defina a flag
--image-projectcomoubuntu-os-cloud. -
Defina a flag
--image-familycomoubuntu-1804-lts. -
Defina a flag
--scopescomohttps://www.googleapis.com/auth/cloud-platform. - Para se ligar à instância
my-client, use o comandossh. - Atualize o gestor de pacotes
apt-get.sudo apt-get update
- Instale o pacote do cliente MySQL.
sudo apt-get -y install mysql-client-5.7
- Para se ligar à instância
my-server, use o comandossh. - Atualize o gestor de pacotes
apt-get.sudo apt-get update
- Instale o pacote do servidor MySQL.
sudo apt-get -y install mysql-server-5.7
Na sessão SSH para a sua instância do
my-server, use o seguinte comando para melhorar a segurança da sua instalação do MySQL.sudo mysql_secure_installationPrima
enterpara ignorar a configuração do pluginVALIDATE PASSWORD.Introduza uma nova palavra-passe de raiz duas vezes.
Para remover utilizadores anónimos, introduza
Ye primaenter.Para impedir o início de sessão de raiz remoto, introduza
Ye primaenter.Para remover a base de dados de teste, introduza
Ye primaenter.Para recarregar as tabelas de privilégios, introduza
Ye primaenter.No Cloud Shell, use SSH para estabelecer ligação à instância
my-server.Atualize o ficheiro de configuração
/etc/mysql/mysql.conf.d/mysqld.cnfcom as seguintes informações:LOCAL_IP=$(curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \ -H "Metadata-Flavor: Google") sudo sed -i "s|bind-address.*|bind-address = $LOCAL_IP|" /etc/mysql/mysql.conf.d/mysqld.cnfReinicie o serviço MySQL para aplicar as alterações ao servidor em execução.
sudo service mysql restartVerifique se o servidor está a ser executado localmente. Substitua
[ROOT_PASSWORD]pela palavra-passe de raiz do servidor MySQL que estabeleceu num passo anterior.sudo mysql --user=root -p[ROOT_PASSWORD] -e "show databases"O resultado é semelhante ao seguinte:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
No Cloud Shell, crie uma variável de ambiente para o
my-clientendereço IP interno.CLIENT_IP=$(gcloud compute instances describe my-client \ --zone=ZONE \ --format='value(networkInterfaces[0].networkIP)')Crie um novo utilizador do MySQL com uma palavra-passe. Substitua
[MY_PASSWORD]pela sua palavra-passe e[ROOT_PASSWORD]pela palavra-passe do utilizador root do MySQL.sudo mysql -uroot -p[ROOT_PASSWORD] \ -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"Conceda ao novo utilizador do MySQL autorização para iniciar sessão no servidor a partir do endereço IP interno do
my-client.sudo mysql -uroot -p[ROOT_PASSWORD] -e \ "GRANT ALL PRIVILEGES ON *.* TO 'TESTUSER'@'${CLIENT_IP}' \ IDENTIFIED BY '[MY_PASSWORD]';"Para remover o endereço IP externo, atualize as definições de configuração no Cloud Shell. Substitua
[ZONE]pela sua Google Cloud zona.gcloud compute instances delete-access-config my-server \ --access-config-name "external-nat" \ --zone="ZONE"- No Cloud Shell, use SSH para estabelecer ligação à instância
my-client. Teste a sua ligação listando as bases de dados.
sudo mysql --host=my-server --user=TESTUSER \ --password=[MY_PASSWORD] -e "SHOW DATABASES;"O resultado é semelhante ao seguinte:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
No Cloud Shell, crie uma regra de firewall para permitir comunicações de
mysql-clientparamysql-server.gcloud compute firewall-rules create "mysql-remote-access" \ --allow tcp:3306 --source-tags "mysql-client" \ --target-tags "mysql-server"- Adicione um endereço IP externo a
my-serverpara permitir a conetividade externa. - Adicione o endereço IP de origem do seu cliente externo às regras de firewall.
- Modifique a conta
TESTUSERou crie uma conta de utilizador associada ao endereço IP de origem do seu cliente externo.
gcloud compute instances create my-server --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform
Instalar o cliente MySQL
Os passos seguintes descrevem como instalar o MySQL numa instância do Compute Engine.
Instalar o servidor MySQL
Os passos seguintes descrevem como instalar o MySQL numa instância do Compute Engine.
Melhore a segurança da instalação do MySQL
Tem de estabelecer uma palavra-passe de raiz para o MySQL e realizar a manutenção de segurança básica na configuração do servidor MySQL. Para mais informações, consulte a documentação do MySQL para
mysql_secure_installation.Configurar o servidor MySQL
Antes de poder estabelecer ligação remotamente ao servidor MySQL, tem de o configurar para ouvir no respetivo endereço IP interno. Em seguida, cria uma conta de utilizador não raiz para o cliente MySQL se ligar ao servidor.
Todos os comandos do cliente MySQL têm de incluir determinados sinalizadores da linha de comandos (por exemplo, para autenticar). Os comandos MySQL nesta secção incluem as seguintes flags:
--userpara o nome de utilizador,-ppara a palavra-passe e-epara executar a declaração fornecida e sair imediatamente. Para mais informações, consulte a referência das opções de comando do MySQL 5.7.Crie um utilizador do MySQL
A ligação remota como utilizador root foi desativada com o comando
mysql_secure_installationanterior. Tem de criar um novo utilizador com as autorizações necessárias para permitir ligações remotas.Remova o endereço IP externo de
my-serverA instância
my-servernão precisa de um endereço IP externo porque o cliente pode aceder amy-serveratravés de um endereço IP interno.Validar o acesso remoto do cliente à instância do servidor
Os passos seguintes descrevem como estabelecer ligação ao servidor MySQL em
my-servera partir da sua instância domy-client.Estes passos validam se o seu cliente MySQL consegue estabelecer ligação com êxito ao servidor MySQL através do endereço IP interno.
Considerações sobre a firewall em ambientes de produção
A configuração de rede predefinida Google Cloud inclui uma regra de firewall
default-allow-internalque permite o tráfego interno entre instâncias do Compute Engine numa vasta gama de portas, incluindo a porta do MySQL, a porta3306. Em ambientes não predefinidos com uma pegada de segurança estabelecida, pode ter de criar uma regra de firewall para permitir que a sua instânciamy-clientcomunique com a sua instânciamy-serveratravés da rede. Caso contrário, as duas instâncias não podem comunicar entre si.Pode basear as regras de firewall em intervalos de endereços IP ou etiquetas. Os intervalos de endereços IP são úteis se quiser conceder acesso a um vasto intervalo de endereços IP internos. Em alternativa, se quiser conceder acesso a instâncias específicas na sua rede, as etiquetas oferecem uma solução mais flexível. As etiquetas facilitam a adição de novos clientes sem conceder acesso a uma vasta gama de endereços IP. Só tem de atribuir a etiqueta adequada à nova instância do cliente MySQL. Por exemplo, pode criar uma nova regra de firewall que permita o tráfego de todas as instâncias de cliente etiquetadas com
mysql-client.Para suportar regras de firewall com etiquetas, pode atribuir as etiquetas adequadas às VMs
my-clientemy-serverno Cloud Shell.gcloud compute instances add-tags my-client --tags mysql-client --zone=ZONE gcloud compute instances add-tags my-server --tags mysql-server --zone=ZONEAdicione uma nova regra de firewall
Os passos seguintes descrevem como criar uma nova regra de firewall para permitir que as instâncias com a etiqueta
my-clientcomuniquem com as instâncias que têm a etiquetamy-serveratravés da porta3306.Já pode estabelecer ligação ao MySQL a partir do
my-client.Considerações de acesso de clientes externos
Este tutorial aborda o acesso de clientes MySQL a servidores MySQL executados no Compute Engine. Permitir o acesso a partir de um cliente que não esteja em execução no Compute Engine está fora do âmbito deste tutorial. Se precisar de permitir o acesso que não seja do Compute Engine, modifique o seguinte:
-
Name the instance
gcloud compute instances create my-client --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform