-
Notifications
You must be signed in to change notification settings - Fork 368
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Terraform: faz infraestrutura ser gerenciada por código #208
Conversation
This pull request is being automatically deployed with Vercel (learn more). 🔍 Inspect: https://vercel.com/tabnews/tabnews/45LQn8K3iH5z8gpNSr8JA6mLxSaF |
Estou agradavelmente surpreendido pelo código que vi, parabéns 👏 Tenho 2 perguntas:
Nota final: não trabalho com AWS há alguns anos, não tenho as boas práticas tão presentes, vou deixar alguém comentar sobre isso |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey @filipedeschamps ficou bem legal a estrutura. Divisão por ambiente e recursos.
Eu estou aprovando, eu consegui rodar o terraform init e terraform plan.
Não dei o apply, pq não queria gastar umas doletas...sorry
Requisitos
Configurar AWS CLI
Rodar terraform
Resultado
|
@tcarreira e @huogerac que honra meus caros, muuuito obrigado por comentar nesse PR 🤝 👍
Repasso os créditos para as toneladas de artigos e documentação que li, principalmente documentação no final para fazer tudo na v4 do Terraform. Outra pessoa que foi muito legal trocar ideia foi o @hposca e o maior desafio não foi o Terraform em sí, e mais entender as peças que a AWS fornece para você trabalhar. Para resolver isso eu primeiro usei o Terraform (com state local) para criar o bucket, e depois configurei o backend nele e repassei o state para o bucket.
Bom ponto! Não sei se estou errado, mas esses recursos não tem
De qualquer forma, as duas infras já estão deployadas, segue a de produção: https://www.tabnews.com.br/api/v1/status As migrations não foram rodadas ainda, devo fazer hoje ainda e daí já vai dar para criar contas 👍 Então vou fazer merge nesse PR e vamos continuar a evoluir! E @huogerac muito obrigado pelo teste meu caro!!!! 🎉 👍 🤝 |
Sensacional essa feature, aqui na empresa nós tambem usamos terraform mas confesso que não sei nada sobre isso. Onde foi que você "aprendeu" tão rápido? Me ensina |
@liverday o ponto inicial foi esse vídeo aqui: https://youtu.be/SLB_c_ayRMo Depois fui pesquisando artigos sobre boas práticas e ficando aflito porque todos eles estavam na versão 3 😂 e toda vez que o Terraform me dava uma rasteira eu chorava com o @hposca e ao explicar o que tava acontecendo, automaticamente me ajudava a entender melhor alguns detalhes que eu não percebia. E o mais importante é encarar de fato o Terraform como código e abstrações assim como estamos fazendo no código do TabNews. Então eu primeiro criei toda a infra num arquivo só todo maluco pra conseguir ver e sentir o que precisava ser abstraído e onde. Daí aprendi sobre módulos (que são basicamente funções) e ficou fácil abstrair tudo que precisava no Eu também acho que aprendi rápido, mas isso tá longe de ser experiência. Com certeza essa rapidez vai me picar a bunda logo logo por falta de experiência 😂 vamos torcer para que os próximos PRs aqui serem revisados por pessoas mais experientes e para o ambiente de Staging segurar erros da vida real 🤝 👍 |
eu ignorei no início, mas quando vc fala em v4 do Terraform, eu acho que vc quer dizer v4 do provider da AWS, certo 😄 ? O terraform está na versão 1.1.7 😛
Mas então porque o bucket tem um valor random?
Acho que todos os recursos que este código tem estão já salvaguardados de alguma forma (eg: o Mas o que estou mencionando, é alguma operação que faz vc trancar a porta com a chave dentro. Alguma operação que faz o terraform deixar de ter acessos, por exemplo. Pode ocorrer em situações em que vc acha que ele vai fazer alguma alteração in-place, mas que remove para voltar a criar depois. Eu acho seguro o código como está. |
😂 correto 👍
Excelente pergunta: como o arquivo .tf está sendo commitado aqui e vai ficar público, eu não queria que ninguém soubesse qual o caminho correto das coisas. Isso começou com o banco de dados (que precisa ser público atualmente por conta da Vercel) e todos os dados deles são randomizados na hora da criação. O nome do bucket que guarda state seguiu o mesmo raciocínio, onde apesar dele ter os acessos públicos desabilitados, optei por randomizar o nome dele para evitar que as pessoas saibam o caminho exato do bucket e fiquem testando e aguardando por algum descuido de política de acesso aos arquivos. Tanto que na hora de declarar o backend no arquivo raiz de cada ambiente, eu não especifico o nome dele propositalmente. Ele é fornecido uma única vez no prompt que aparece ao fazer o
Ahh entendi perfeitamente! Faz sentido situações 👍 nesse caso, por enquanto estou usando o acesso root da conta. Mais pra frente seria legal definir e usar acessos menos privilegiados. |
nesse caso, sugiro adicionar uma variable no código do deploy, como vc faz com
aí, na hora de rodar o plan/apply vc declara qual o valor do bucket (com |
Show! Mas please me ajuda a clarear algumas coisas: O valor default ali não poderia estar preenchido, correto? Para não commitar ele e revelar o bucket. |
O valor é isso mesmo, um default, tal como chamar uma função com parâmetros default 😉 . E vc pode continuar a usar o mesmo código, mas na hora de rodar contra o ambiente real, basta sobrescrever a variável.
No futuro, se vc tiver mais variáveis que vc não quer commitar, vc pode até manter um arquivo
Isto até permite configurar um passo ContinuousIntegration (eg: com o github actions) e botar o valor nos secrets do projeto. Aí o código vai rodar com o valor certo, mesmo usando o código que não tem o valor real. Ficou mais claro? Se não ficou, é só falar 😉 |
Depois quero fazer um vídeo ou escrever no diário de desenvolvimento sobre a abordagem de usar o Terraform para ter os ambientes de Staging e Production similares (e não idênticos, porque terá diferenças como tamanho do banco, retenção de backups e várias outras características dos recursos). Mas, a topologia se mantém a mesma, o que é muito massa 👍
[edit] como eu altero o
.env
na parte dos dados default para criação do banco local, após o merge desse PR você precisará deletar o container e o estado do banco no seu Docker 🤝