Como Ler Variáveis de Ambiente em Golang para Obter Credenciais do Banco de Dados MySQL
Video Transcript
Olá pessoal, nesta aula nós vamos falar de como fazer a leitura de uma variável de ambiente no Golang.
Eu vou usar variáveis de ambiente para poder armazenar as credenciais para a conexão do banco de dados de MySQL.
Vamos aqui no código.
Voltando aqui no arquivo main.go, na hora de fazer a conexão, na função configurar o banco de dados, linha 235,
nós temos aqui a chamada do Open e temos essa string com a informação da conexão, tem o usuário, a senha, o host, a porta e o banco de dados e tal.
Mas normalmente essas credenciais não devem aparecer no código fonte diretamente.
Por quê?
Porque normalmente o código fonte a gente usa controle de versão como o Get.
E quando a gente faz o commit, todo o código vai aparecer no histórico das mudanças de arquivo.
E as credenciais, coisas que têm risco, por questão de segurança, nunca devemos usar diretamente esses valores no código fonte.
Então, para poder consertar esse problema de segurança aqui, eu vou usar variáveis de um ambiente e em vez de falar o valor aqui diretamente,
vai ser o valor da variável que ele vai obter através do chamado de uma função que está dentro do pacote OS.
Então, deixa eu te mostrar as variáveis aqui.
Note que eu quero definir as seguintes variáveis de um ambiente.
Uma variável vai armazenar o usuário, outra variável vai armazenar a senha, outra vai armazenar o nome do banco de dados e outra vai armazenar o host com a porta.
Volta no main.go, essa parte aqui do usuário vai ser uma variável, essa outra parte vai ser armazenada em outra variável,
a parte do localhost 2.3306 também será outra variável e finalmente a parte do banco de dados também será outra variável.
Você pode definir as variáveis e quebrar ou dividir esses valores da maneira que você quiser, mas escolhi usar esses valores, essas variáveis.
Tá bom? Então, primeiro vamos começar com o usuário.
Vamos substituir esse cara aqui com o valor da variável.
Então, vamos fazer o seguinte, vamos dar uma olhada aqui no packages, no site do colom.
Temos aqui no pacote chamado OS, significa operating system, é o meu sistema operacional.
Vamos no índice, tem a função getEnv, essa que a gente quer.
GetEnv nos permite obter valor de uma certa variável de ambiente, environment variable.
Tem um exemplo aqui, você pode falar OS.getEnv e o nome da variável.
Tá certo?
Bem, vamos voltar aqui. Temos a string como segundo argumento para o open.
Para poder substituir o valor aqui, a gente tem que modificar esse cara aqui e fazer uma certa interpolação, por exemplo.
Tem a maneira de fazer isso usando na ala printf, você pode votar o percentual aqui por 100s e substituir outros valores.
Para isso, a gente vai precisar do fmt.
Então, deixe-me ir lá na documentação do fmt.
A gente vai precisar daquela função para formatar uma string e substituir valores.
Deixe-me procurar aqui.
Mat...
Descrever sprintf.
Vamos ver aqui.
Sprintf.
Cadê?
Deixa eu vou lá no index.
Sprintf.
Vamos ver se sprintf, o exemplo aqui, mostra que nós podemos usar um sprintf para poder formatar uma string e substituir valores.
Da essa maneira, isso que a gente quer.
Vamos lá, vamos fazer aqui.
Vou criar uma variável aqui.
Vamos dizer que isso é...
O string de conexão.
Vai ser do tipo string.
E vai ser igual a chamada do fmt.sprintf.
E a gente vai pegar o valor que tem aqui.
Esse valor a gente vai pegar e pô aqui.
Deixe-me...
É melhor para ver.
Aí você pega o nome da variável e põe aqui no lugar.
Agora, na hora de dizer o usuário, por exemplo, eu vou botar %aus.
E...
Vindo aqui, depois, como segundo argumento, vai ser o valor correspondente àquele primeiro %aus.
Que vai ser do valor da variável.
A gente vai usar o os.getenv.
E o nome da variável que eu vou chamar de dbusuário.
Vamos lá aqui de volta nesse arquivo.
Então, o dbusuário será aquele mesmo que eu digitei lá e removi.
Então, se eu te mostrar isso aqui na hora de rodar o comando, vamos ver se funciona.
Se eu salvar dessa maneira, vamos aqui no terminal.
Eu vou... Primeiramente, temos que consertar esse problema, né?
Undefined os.
Porque eu não importei o pacote os.
Vamos ver aqui.
Import...
Vou botar aqui de baixo os.
Sem problemas, mas o usuário está errado porque não tem nada no valor da variável, né?
Então, se eu for aqui...
E ele quando ler essa variável aqui, não tem nada, está vazio.
Então, eu deixo como exercício para eu fazer uma espécie de check para ver se todos esses valores estão definidos.
Se não, você tem que abordar, né?
Terminar o servidor para que o administrador conserte isso.
Mas eu deixo como exercício, tá?
Então, vou matar o servidor e antes de rodar aqui o comando,
eu, como eu estou usando o terminal aqui do Mac, que também é parecido com o Linux,
eu posso botar a variável aqui antes do rodar o comando e ele vai setar a variável na hora de rodar o programa, tá?
Se você pôs o nome da variável igual ao valor,
antes do comando, ele vai setar e usar essa variável aqui de ambiente no próprio programa.
Por isso que funcionou direito e se eu dar uma olhada lá no teste da API,
está funcionando sem problemas, ele pode ter os dados que conectou anteriormente.
Então, vamos fazer a mesma coisa para os outros valores.
Então, vou fazer o percentual S aqui para a senha e vou botar o valor correspondente como terceiro argumento
ao printf e vai ser o os.getenvdb.scor senha.
Salva isso, ele vai dar erro.
Vamos matar o servidor e adicionar.
Eu vou pegar aqui o valor da senha, qual era que tinha que eu esqueci?
Deixa eu voltar aqui só um pouquinho, vou copiar esse valor.
Vou colar e vou copiar aqui.
No terminal, eu vou adicionar mais uma variável com espaço entre elas.
Depois de db usuário igual ao valor espaço, nome da variável,
igual ao valor espaço e comando.
Com isso funciona sem problemas, tudo ok.
Vamos fazer a mesma coisa para os outros.
Agora vai ser o localhost 3306%S no lugar como quarto argumento, adiciona os.getenvdb.scor.
Vou pegar aqui e colar aqui no meu arquivo aqui
e vou copiar e matar o servidor.
E faz a mesma coisa, só colar como terceiro, valor lá antes do comando.
Deu certo, sem problemas.
E repete, vamos fazer finalmente o dohost com porta.
Desculpa não, banco de dados, o nome do banco de dados aqui, %s,
.getenvdb.scor.ddados.
Vou colar aqui valor e vou copiar essa variável,
mata o servidor e adiciona o valor.
Funcionou sem problemas.
Vamos aqui testar, não deu problema quando eu testei o get para livros.
Então, voltando aqui no main.go, eu esqueci de salvar.
Deixa eu testar novamente.
Dei o erro aqui, desculpe.
Eu acho que eu inverti.
O banco de dados é o último, né?
Deixa eu ter um erro aqui.
O problema é que eu tinha colocado o valor das variáveis, tinha trocado.
O host com porta é esse e o banco de dados é esse.
Vou salvar, na verdade eu quero consertar aqui que eu troquei os valores.
Deixa eu remover aqui.
Banco de dados é crude simples e o host com porta está errado.
É esse aqui.
Pronto, sem problemas, vamos testar novamente.
Tudo certo.
Voltando no main.go, então é isso.
Se você quiser quebrar essa linha aqui, que está meio muito grande, também pode.
Vamos ver se não dá problema de sintaxe.
Dá problema que esse último tem que estar com a vírgula ou com o fechamento lá no final.
Então, adicionei a vírgula.
Pronto, então.
Então, se você não quiser sempre digitar aqui essas variáveis, né?
Você sempre adiciona esses exports e o nome da variável é igual ao valor.
Se fosse o sistema de Unix, Linux ou Mac, você pode copiar esse pô no arquivo de perfil do seu terminal.
No meu caso, do Mac, eu uso o bash.
Então, eu posso usar o ponto bash profile que está dentro da minha pasta pessoal.
E eu posso adicionar aqui os exports para poder setar essas variáveis na hora que eu abri o novo terminal.
Com isso, eu posso dar o src aqui para não abrir terminal.
Tilda, ponto bash profile.
E eu posso agora rodar o meu comando sem ter que especificar essas variáveis.
Pronto, rodou certo.
E testei sem problemas.
Tá bom?
E com isso, você não precisa, não vai expor as credenciais da sua API do seu programa.
Dá o código, a versão, controle de versão do código, né? Como o Get.
Então, eu posso dar o meu...
Se eu for aqui...
Eu posso dar o meu GetAdd, o meu arquivo aqui.
E eu posso ver aqui, né?
E ele não vai mais ter usuário sem, e tal, e tal.
No histórico, né?
Mas é claro que você não pode ter esses valores primeiramente, né?
É claro que vai estar no histórico.
Mas sempre que você começa a fazer os commits pela primeira vez, nunca ponha esses valores, tá?
Então, com isso, eu posso dar esse commit.
Le...
Credenciais acuditados...
As variáveis de ambiente.
Pronto.
Tá bom? Então, você faz a mesma coisa para aquele outro arquivo que tínhamos criado a tabela, né?
Esse arquivo criar tabela na pasta com fe que a gente tinha começado.
Se você ainda quiser esse arquivo e você quiser adicionar ao controle de versão como Get,
eu recomendo também fazer a mesma coisa, porque você não quer fazer o commit das credenciais, nunca, né?
É um problema de segurança.
Então, aqui, da mesma maneira, eu posso pegar a mesma coisa, estremar de conexão,
vou só copiar e colar aqui, e em vez de fazer o literal, eu ponho a variável aqui e você importa lá em cima o OS.
Vamos...
Então, vai dar tudo assim, tá?
E então, eu posso testar, mas sem criar tabela.
Então, tudo que tiver depois do Open, no caso, é ADBExec, eu não quero criar tabela.
Então, eu vou comentar tudo isso abaixo, só para testar, para ele não executar isso.
Deixa eu dar o CD para config, vou para CD config, go run, criar tabela.go.
Está abrindo conexão, ele funcionou sem nenhum erro.
Certo.
Então, eu vou reverter a minha mudança e salvar, e eu posso fazer o meu commit.
Ler credenciais do banco de dados das variáveis de ambiente na hora de criar a tabela.
Pronto.
Então, por essa só, usamos as variáveis de ambiente, fizemos a leitura com o pacote OS, a função é o .getenv, e você põe o nome da variável.
Você pode pôr os variáveis no arquivo de perfil do seu terminal, ou você pode definir as chave valores antes na hora de rodar o comando,
mas você só escrever antes do próprio comando, os pares de variáveis.
Muito obrigado por assistir e até a próxima.