Mysql: Google Cloud SQL no App Engine - String de conexão desatualizada?

Criado em 25 set. 2016  ·  35Comentários  ·  Fonte: go-sql-driver/mysql

Descrição do problema

No leia-me deste driver, a string de conexão para conectar-se ao Google Cloud SQL no App Engine é fornecida como:

user@cloudsql(project-id:instance-name)/dbname

Embora a documentação do pacote cloudsql do Google também afirme isso para o seu driver, existem postagens no Stack Overflow, como esta, que afirmam que é necessário usar projectid:regionname:instancename em vez de projectid:instancename .

Qual é a string de conexão correta? Nenhum destes está funcionando atualmente.

Código de exemplo

Uma postagem mais detalhada pode ser encontrada aqui: http://stackoverflow.com/questions/39668672/trouble-connecting-to-google-cloud-sql-server-from-deployed-app

Registro de erros

Meu servidor está retornando uma resposta 500 sempre que faço uma chamada para um endpoint que usa o banco de dados Cloud SQL. A conexão de banco de dados funciona bem quando estou me conectando ao servidor de uma versão servida localmente do meu aplicativo.

Eu tentei várias strings de conexão e aqui estão alguns erros que foram registrados no Google Cloud Console:

5447 [Warning] 'user' entry 'root<strong i="21">@localhost</strong>' ignored in --skip-name-resolve mode.

5447 [Warning] entry 'root'@'localhost' in mysql.user is ignored because it duplicates entry in mysql.system_user

14409 [Note] Aborted connection 14409 to db: 'User' user: 'root' host: 'xxx.xxx.xxx.xxx' (Got an error reading communication packets)

(Nenhuma senha foi especificada na string de conexão porque a documentação não especifica a necessidade de uma senha. Esta postagem menciona que a senha de conexão deve ser nula quando o aplicativo tenta se conectar ao servidor usando root@localhost .)

6170 [Note] Access denied for user 'root'@'cloudsqlproxy~xx.xxx.xxx.xx' (using password: NO) 

Eu também tentei conectar com um usuário diferente do usuário root (username: newuser):

5447 [Warning] 'user' entry 'newuser<strong i="30">@localhost</strong>' ignored in --skip-name-resolve mode.

Configuração

_Versão do driver (ou git SHA):_ https://github.com/go-sql-driver/mysql/tree/3654d25ec346ee8ce71a68431025458d52a38ac0

_Go version:_ go versão go1.6.2 linux/amd64

_Versão do servidor:_ A instância do Google Cloud SQL está executando o MySQL 5.7

_Server OS:_ Na guia Compute Engine, parece que o servidor que hospeda a versão mais recente do meu aplicativo está executando o Debian 7.11 (Wheezy)

documentation

Comentários muito úteis

@bagatelli Para esclarecer, verifique se você está usando o formato de string de conexão mencionado neste comentário: http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error- with-google-cloud-sql-2nd#comment65140499_38890022

Desculpe a brevidade anterior. Estamos usando a 2ª geração em produção do Go no App Engine sem problemas. Apenas deixe de fora o parâmetro "tlsConfigName", pois o proxy SQL adicionará isso, mas de qualquer forma eles relatam que o TLS agora é suportado de qualquer maneira.

Todos 35 comentários

user@cloudsql (id do projeto:nome da instância)/dbname
É o antigo. Ele ainda funciona porque eu ainda o uso.

Recentemente, o gae começou a categorizar o banco de dados em regiões também, daí o novo formato. Se seu cloudsql estiver categorizado em uma região, você precisará usar o novo formato

Talvez este driver não analise corretamente o novo formato. Essa pode ser a questão

No seu caso, você está executando um servidor Cloud SQL de segunda geração?

Sem primeira geração

Eu suspeito que o driver não está analisando o novo formato. O código pode precisar ser alterado para que leve o conteúdo antes dos primeiros dois pontos e o conteúdo após os primeiros dois pontos, independentemente dos novos dois pontos presentes

Há um pull request atualmente atualizando leia-me

Obrigado pela atenção. Acabei de deixar um comentário sobre esse PR.
Como solução temporária, configurarei um servidor de primeira geração até que o problema do driver seja corrigido.

Atualização: parece que há um problema com o driver quando um aplicativo do Google App Engine implantado tenta se conectar a um Google Cloud SQL Server de segunda geração.

Criei um Cloud SQL Server de primeira geração e consegui me conectar com sucesso ao servidor usando um aplicativo do Google App Engine implantado com esta string de conexão:

user@cloudsql(project-id:instance-name)/dbname

Nenhum nome de região foi necessário.

A análise não deve ser um problema, o driver leva tudo entre os parênteses: https://github.com/go-sql-driver/mysql/blob/master/dsn.go#L282
É usado apenas em https://github.com/go-sql-driver/mysql/blob/master/driver.go#L65

Alguém com uma conta cloudsql pode baixar o driver, editar https://github.com/go-sql-driver/mysql/blob/master/appengine.go#L14 e substituir "appengine/cloudsql" por "google.golang.org/appengine/cloudsql" , tente com a versão antiga e nova com e sem a região e relate o que funciona? Obrigado!

_Pessoal, para referência: _
A solução fornecida pelo Google para conectar-se à 2ª geração está aqui:
http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error-with-google-cloud-sql-2nd

A documentação postada do Google estava (e talvez ainda esteja) errada , mas a solução correta está postada lá. Estamos usando o Cloud SQL de segunda geração em produção sem problemas.

Existe uma solução para isso? Definitivamente não está funcionando com o CloudSQL Segunda Geração.

@bagatelli veja meu comentário acima do seu

@benguild Eu vi seu comentário em vários lugares. No entanto, você está assumindo que todos estão usando SSL em suas conexões, o que não é o caso de todos. Certamente não é meu. A mensagem de erro que estou recebendo é "Driver: Bad Connection". O banco de dados nem é alcançado porque o driver não consegue identificar os parâmetros de conexão corretamente. Estou pensando que o problema está em algum lugar na bagunça que existe com os pacotes "novo appengine" e "antigo appengine" que está causando muitas falhas e o Google não está se preocupando em documentar essa alteração corretamente.

@bagatelli Para esclarecer, verifique se você está usando o formato de string de conexão mencionado neste comentário: http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error- with-google-cloud-sql-2nd#comment65140499_38890022

Desculpe a brevidade anterior. Estamos usando a 2ª geração em produção do Go no App Engine sem problemas. Apenas deixe de fora o parâmetro "tlsConfigName", pois o proxy SQL adicionará isso, mas de qualquer forma eles relatam que o TLS agora é suportado de qualquer maneira.

@benguild . Obrigado por todo o seu esforço em me ajudar em todas essas questões.
Você está usando o "novo appengine" ou o "antigo appengine"? Acabei de passar o dia convertendo todo o meu código para esse novo pesadelo que são os novos pacotes do appengine e como você deve saber pelo meu outro post não consigo mais implantar meu código e, portanto, não posso testar adequadamente o que você sugeriu acima . Tentarei novamente assim que encontrar uma solução para implantar meu aplicativo.
Obrigado!

@bagatelli Se estiver com problemas na implantação, tente puxar seu código para uma VM ou use o Google Cloud Console.

@bagatelli O que eu estava dizendo era ... experimentá-lo em uma máquina nova ou usar o console da nuvem (que já possui as ferramentas de desenvolvimento) antes de descartar o fato de que definitivamente não é relacionado ao ambiente.

Atualmente, não posso implantar usando o macOS Sierra devido a um bug de 4 meses, mas podemos implantar bem a partir de uma VM.

Tenho certeza de que é mais trabalhoso para você se afastar completamente do ambiente, então eu pelo menos descartaria isso antes de desistir completamente.

@pjebs . Não tenho certeza de onde você tirou essa suposição, mas não estou usando um ambiente flexível.

@pjebs Isso está incorreto. Atualmente, é assim que você implanta no padrão.

@pjebs appcfg.py update também funciona.

@bagatelli Eu ouço você - geralmente costumo minimizar minhas dependências de terceiros e também dependências de API, pois o que você está dizendo é verdade ... O Google não é obrigado a fornecer suporte, embora arrisque sua reputação de outra forma.

Não sei exatamente qual é o problema para você no momento (além de usar APIs antigas, eu acho?), mas todos os softwares que desenvolvi para o App Engine também desenvolvi com a intenção de sair do App Engine se e quando necessário. Por exemplo, para cada API do Google com a qual faço interface, escrevo um "auxiliar" para que realmente chame os métodos e forneça seus próprios para o restante do aplicativo para que e somente isso precise ser ajustado a um novo ambiente quando necessário e [ esperançosamente] sem quebrar o resto do aplicativo.

Para mim, o App Engine é mais uma conveniência, pois é um ambiente que requer pouca configuração, além de dimensionamento e preferências, e fornece ótimas APIs. É irritante quando algo dá errado, mas eles oferecem suporte premium se você tiver problemas como o que está falando?

@pjebs. Tanto quanto eu entendo, goapp é apenas um wrapper para appcfg.py. Ele vai acabar chamando appcfg.py em algum momento.

@bagatelli Claro, me envie um e-mail. Sem problemas

@benguild . Finalmente consegui implantar meu aplicativo, mas ainda não consegui conectar ao CloudSQL.
Atualizei meu aplicativo inteiro para usar os pacotes "new appengine", bem como definir a importação de clousql para google.golang.org/appengine/clousql em "appengine.go" no pacote mysql-driver.
Em seguida, criei um certificado de cliente no Painel de controle do CloudSQL e atualizei meu código de acordo usando RegisterTLSConfig, conforme descrito na documentação dos drivers, fornecendo a configuração tls como um parâmetro, conforme declarado em suas postagens no stackoverflow. Minha conexão de url está assim:

root:password@cloudsql (instance-connection-name-copied-from-cloud-console)/myDatabase?tls=customTls

Ainda sem sorte. Erro:

Driver: Conexão ruim

@arnehormann . Isso responde à sua pergunta do seu post acima.

@bagatelli Experimente sem TLS.

@benguild . Tentei sem tls. Sem sorte.

Driver: Conexão ruim

@pjebs . Não tenho certeza se você entendeu completamente o problema aqui. O driver nem está alcançando o banco de dados. Eu entendo que o que você mencionou acima pode ser verdade em um ambiente de produção, mas não consigo estabelecer uma única conexão com o banco de dados, portanto, no meu caso, o acima não se aplica.

@bagatelli O que eu faria é postar no Stack Overflow como fiz e marcar com: google-cloud-sql ... Alguém do Google deveria responder, espero.

Se você está tendo esse problema, eles gostariam de indexá-lo para outras pessoas que têm o mesmo problema. Responda aqui com um link para a pergunta depois de resolvida.

Provavelmente ainda tem a ver com sua implementação porque como eu disse as pessoas estão usando a 2ª geração em produção e está fora do beta.

@bagatelli Você se lembrou de desativar a configuração "TLS obrigatório" para a instância no Console do Cloud?

Obrigado @benguild e @pjebs . Vou postar no SO e darei uma atualização aqui se eu encontrar a causa.

@benguild . Não consigo ver nenhuma menção ao TLS no Console do Cloud

Eu acho que você quer dizer "Permitir apenas conexão SSL". Se é disso que você está falando, então sim, está desligado.

Bom pessoal, encontrei o problema. E não foi nem o driver, meu aplicativo ou CloudSQL. O projeto no qual estou implantando o aplicativo foi criado há muitos anos por meio do antigo console de desenvolvedores.
Na guia Controle de acesso no Console do Cloud, há um rótulo dizendo "Apps neste projeto: todos autorizados". e quando um projeto é criado, ele também cria as contas padrão do appengine e do compute engine. O problema é que esse projeto em particular não tinha as duas contas padrão e com certeza esse é o problema. O que provavelmente aconteceu é que o Google não criou essas contas quando migrou o appengine para o console da nuvem que usa IAM e Admin para gerenciar contas de acesso.
Estou assumindo isso porque quando notei que as contas padrão estavam faltando, criei um novo projeto e um novo banco de dados sql na nuvem e implantei exatamente o mesmo código nesse novo projeto e _voila_... Tudo está funcionando bem.
@benguild @pjebs Agradeço muito todo o seu esforço em me ajudar a resolver esse problema.
@benguild Excluí todos os comentários não relacionados de nossa conversa anterior, pois acho que estamos na mesma página em relação ao AppEngine/Google. Irá enviar-lhe um e-mail sobre isso mais tarde.
Publiquei esta pergunta no StackOverflow e a responderei com esta descoberta para que outras pessoas com o mesmo problema possam se beneficiar.
http://stackoverflow.com/questions/40020782/connect-to-google-sql-cloud-2nd-generation-with-go-on-appengine

Obrigado novamente!

Sim, se o App Engine não tiver acesso à instância SQL, você terá um problema. 👍🏻

Corrigido por #485

Tudo o que posso dizer é obrigado @benguild ! Você me ajudou a parar de bater minha cabeça no teclado depois de 500 abas cromadas abertas e 5 horas pesquisando no Google! Aleluia!!!

Esta página foi útil?
0 / 5 - 0 avaliações