Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

[Bug] Não consigo conectar ao banco de dados

Mesmo após fazer as alterações propostas na aula continuo sem conseguir acessar remotamente a aplicação. Nos logs do GitHub Actions mostra que esta tudo ok e tudo foi executado corretamente, porém o navegador ainda exibe a mensagem de que a conexão foi recusada. Ao acessar a máquina no EC2 e dar uma olhada no arquivo nohup.err verifiquei que o erro é de que o sistema não consegue se conectar com o Banco de dados. Já verifiquei as regras de segurança, redefini as credenciais de acesso ao banco e atualizei os secrets do GitHub, e mesmo assim o problema persiste.

Arquivo nohup.err Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Log GIthub Actions Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Regras de entrada do Banco de dados Insira aqui a descrição dessa imagem para ajudar na acessibilidade

8 respostas

Alguém sabe o que pode estar ocorrendo? Já redefini a senha do banco de dados e atualizei os secrets do GitHub Actions e revisei as regras de segurança de entrada e saída de ambas as instâncias do EC2 e do RDS. Também confirmei que tudo está na mesma VPC, mas continuo tendo esse erro de conexão, e por conta disso a aplicação não sobe.

Olá, Raphael.

Tudo bem?

Pelo que você descreveu e pelas imagens que você compartilhou, parece que o problema está relacionado à conexão com o banco de dados(O ruim dessa mensagem é que ela não fornece detalhes específicos sobre o que causou o erro, geralmente é credenciais). Aqui estão algumas sugestões para tentar solucionar o problema:

  1. Verifique as Credenciais do Banco de Dados:

    • Certifique-se de que as credenciais (usuário, senha, host, nome do banco, porta) estão corretas e que foram configuradas corretamente nos secrets do GitHub Actions.
  2. Verifique as Regras de Segurança do Banco de Dados:

    • As regras de entrada do seu banco de dados estão configuradas para permitir conexões na porta 5432 (PostgreSQL). Certifique-se de que o IP da sua instância EC2 está permitido nessas regras. Se estiver usando um banco de dados gerenciado, verifique se há alguma configuração adicional de firewall.
  3. Verifique a Conexão Localmente:

    • Acesse sua instância EC2 via SSH e tente conectar ao banco de dados manualmente usando as credenciais fornecidas. Você pode usar um cliente de banco de dados como psql para testar a conexão:
      psql -h <DBHOST> -U <DBUSER> -d <DBNAME> -p <DBPORT>
      
    • Isso ajudará a confirmar se o problema é específico da aplicação ou se é um problema geral de conexão.
  4. Verifique as Configurações de Rede:

    • Certifique-se de que a instância EC2 e o banco de dados estão na mesma VPC (Virtual Private Cloud) ou que há rotas configuradas corretamente entre eles.
  5. Logs e Mensagens de Erro:

    • Analise novamente os logs (nohup.err) para qualquer mensagem de erro específica que possa dar mais detalhes sobre o problema.
  6. Configuração do Arquivo EC2.yml:

    • Certifique-se de que o arquivo EC2.yml está configurado corretamente para exportar todas as variáveis de ambiente necessárias para a conexão com o banco de dados. Verifique se todas as variáveis estão sendo exportadas corretamente e se não há nenhum erro de digitação.

Aqui está um exemplo de como a configuração deve estar no seu arquivo EC2.yml:

script: |
    export HOST=${{ secrets.DBHOST }}
    export USER=${{ secrets.DBUSER }}
    export PASSWORD=${{ secrets.DBPASSWORD }}
    export DBNAME=${{ secrets.DBNAME }}
    export DBPORT=${{ secrets.DBPORT }}
    export PORT=8000
    chmod +x main
    nohup ./main > nohup.out 2> nohup.err < /dev/null &

Espero que essas sugestões ajudem a resolver o problema. Bons estudos!

Consegui me conectar com o banco de dados pelo EC2 e revisei os secrets do Actions e as regras de segurança na AWS, porém o problema persiste. Realizei um teste local e também obtive o mesmo erro de falha na conexão com o banco de dados. Nesse caso acredito que seria um erro na aplicação, especificamente um dos imports do arquivo Main.go. Acredito que esteja utilizando um módulo remoto para se conectar ao banco de dados e por isso está dando problema, porém não consegui substituir pelo arquivo local. Como faço para corrigir esse erro e conseguir continuar? Conexão com RDS a partir do psqlArquivo main.go

Também não estou conseguindo conectar no banco de dados. Quando tento me conectar localmente via ssh, da um erro como se o postgres nem estivesse instalado. O EC2 e o RDS estão no mesmo VPC e as regras foram configuradas corretamente.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeUma coisa que eu percebi é que o RDS está com a zona de disponibilidade us-east-2a e o EC2 está us-east-2b, será que é esse problema?

Iago no seu caso eu tive um erro semelhante, mas não é por conta da zona de disponibilidade. O Postgres não vem instalado por padrão na instância do EC2 que usamos no curso, então precisa fazer a instalação antes pra conseguir conectar. Vou deixar aqui o link do tutorial que segui para poder fazer a instalação. Nesse tutorial ele faz o processo completo, desde a criação da máquina no EC2 até a configuração de um banco de dados de teste, então é bom dar uma lida nos passos pra não repetir procedimentos desnecessários.

https://hbayraktar.medium.com/how-to-install-postgresql-15-on-amazon-linux-2023-a-step-by-step-guide-57eebb7ad9fc

Após instalar o Postgres localmente você deve conseguir se conectar com o Banco do RDS. A meu ver aparenta ser um erro a nível de aplicação, mas como não há nenhum retorno dos instrutores sobre esse problema vou pesquisar algumas aplicações open source e tentar fazer o Host. Bem triste pagarmos um valor alto à plataforma e não termos esse suporte.

Tudo bem Raphael?

A sua intuição sobre ser os imports estava correta, vou pedir depois para subirem uma atualização da aplicação, mas enquanto isso você pode corrigir o problema trocando o repositório dos módulos dos arquivos GO, de guilhermeonrails/api-go-gin para alura-cursos/Curso_CI , e como eles estão muitos dispersos por todos os arquivos eu sugiro executar no seu repositório os seguintes comandos:

find ./ -type f -exec sed -i 's/guilhermeonrails/alura-cursos/g' {} \;
find ./ -type f -exec sed -i 's/api-go-gin/Curso_CI/g' {} \;

com isso ele vai achar todos os arquivos e executar o sed dentro deles, possibilitando a substituição de guilhermeonrails para alura-cursos e depois de api-go-gin para Curso_CI , você também pode substituir o alura-cursos pelo seu nome de usuário do GitHub e Curso_CI pelo nome do seu repositório (lembrando que ele deve estar como publico).

O ideal é executar esses comandos apenas uma vez e ser feito o push com a atualização, resolvendo o problema, mas também é possível adiciona-los a pipeline.

Espero que isso resolva o problema

Boa tarde!

Vou executar os comandos aqui sim, mas também descobri outro problema referente à essa conexão, e que acredito que deveria ser adicionada no curso. Após muita investigação descobri que existe um problema de autenticação do serviço RDS com aplicações externas. Ao criar uma instância do banco de dados do Postgres, a AWS automaticamente seleciona um grupo de parâmetros default para o banco. Nesse grupo de parâmetros, é exigido uma chave SSL de autenticação para realizar a conexão com a aplicação. Sem isso, mesmo configurando os grupos de segurança, a aplicação não conseguirá se conectar. Nesse caso temos duas opções: Ou criar um novo grupo de parâmetros em que "rds.force_ssl" seja permitido (mudando o valor padrão de 1 para 0) ou atualizar a string de conexão do banco de dados para realizar a autenticação SSL, provendo os bundles de autenticação por região que a AWS fornece.

As soluções nesse link dão um pouco mais de detalhes, mas efetivamente faltou realizar uma configuração no RDS para que a aplicação consiga se conectar ao banco corretamente

solução!

Obrigado pela dica, não tinha reparado nesse campo quando montei o curso, mas é bom saber para não ter problemas nos próximos.

E para esse curso, temos que o "rds.force_ssl" foi implementado a partir do Postgresql 15 na AWS, ou seja, na época em que o curso foi preparado essa opção não era a padrão, como pode ser visto na documentação.

"The rds.force_ssl parameter default value is 1 (on) for RDS for PostgreSQL version 15 and later. For all other RDS for PostgreSQL major versions 14 and older, the default value of this parameter is 0 (off)."

Para evitar esses problemas é sugerido que se mantenha a versão do descrita no curso, e essa é mais um dos motivos que temos que tomar cuidado com as atualizações de provedores de cloud, ja que eles podem rapidamente alterar coisas e não temos como responder a todas as mudanças.

Mesmo assim, obrigado pelo aviso.