O Docker é uma tecnologia de código aberto que permite criar, executar, testar e implantar aplicações distribuídas dentro de contêineres de software.
Ele permite que você empacote um software em uma unidade padronizada para o desenvolvimento de software, contendo todo o necessário para a execução: código, runtime, ferramentas do sistema, bibliotecas do sistema etc.
O Docker permite que você implante aplicações rapidamente, de modo confiável e estável, em qualquer ambiente.
A execução do Docker na AWS viabiliza de modo altamente confiável e de baixo custo a criação, a execução, o teste e a implantação de aplicações distribuídas em qualquer escala.
(fonte: aws)
Então, mãos a obra!
Primeiro, vamos criar uma aplicação realmente simples que seja capaz de seguir o seguinte fluxo:
Primeiramente, vamos criar uma lista de e-mails dos destinatários.
Para tal lista (super fake) podemos utilizar dois aceleradores:
- http://www.nomesdefantasia.com/
- http://www.yopmail.com/es/email-generator.php
emaildestinatarios.json
[
{
"Nome": "Edward",
"Email": "edwardmartinsjr@gmail.com"
},
{
"Nome": "Nascia",
"Email": "makarozyfa-9743@yopmail.com"
},
{
"Nome": "Ehew",
"Email": "jecitappa-6363@yopmail.com"
},
{
"Nome": "Dratho",
"Email": "vemmijyqev-1988@yopmail.com"
},
{
"Nome": "Kehew",
"Email": "qacetyllu-4863@yopmail.com"
},
{
"Nome": "Regin",
"Email": "icawoxaj-4110@yopmail.com"
},
{
"Nome": "Fortinto",
"Email": "ollibagaff-6669@yopmail.com"
},
{
"Nome": "Helmnath",
"Email": "hivubasup-3780@yopmail.com"
},
{
"Nome": "Fridmax",
"Email": "ozozuxe-0415@yopmail.com"
},
{
"Nome": "Wisefortin",
"Email": "mottallesse-6173@yopmail.com"
}
]
Para armazenar este json, precisamos da seguinte struct:
//EmailDestinatarios : Lista de e-mails dos destinatários
type EmailDestinatarios struct {
Nome string
Email string
}
Agora, iremos criar uma função para leitura deste arquivo json.
func getEmailDestinatarios(file string) []EmailDestinatarios {
//Realiza a leitura do arquivo json
raw, err := ioutil.ReadFile(file)
//Tratamento de erros padrão.
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
var emailDestinatarios []EmailDestinatarios
//Unmarshal do conteúdo do arquivo json para um tipo struct EmailDestinatarios
json.Unmarshal(raw, &emailDestinatarios)
return emailDestinatarios
}
Com a ajuda do pacote “net/smtp”, depois de armazenarmos na nossa slice, todos os nomes e e-mails dos destinatários do arquivo json, vamos criar uma função para enviar a cada um deles um e-mail, conforme o fluxo que definimos.
func disparaEmailDestinatario(emailDestinatario EmailDestinatarios) {
//Realiza o setup da autorização do servidor de SMTP. Não se esqueça de configurar seu Gmail SMTP server...
//https://support.google.com/a/answer/176600?hl=en
//https://support.google.com/accounts/answer/6010255?hl=en
hostname := "smtp.gmail.com"
auth := smtp.PlainAuth("", "seuemail@gmail.com", "suasenhagmail", hostname)
//Criamos um slice do tipo string do tamanho máximo de 1 para receber nosso e-mail destinatário.
recipients := make([]string, 1)
recipients[0] = emailDestinatario.Email
//Veja mais em: https://golang.org/pkg/net/smtp/#SendMail
err := smtp.SendMail(
hostname+":25",
auth, "seuemail@gmail.com",
recipients,
/*Mensagem no RFC 822-style*/
[]byte("Subject:Olá!\n\n Olá "+emailDestinatario.Nome+". Tudo de bom com Go!"))
if err != nil {
log.Fatal(err)
}
}
Por fim, depois de construirmos os métodos de suporte, o programa principal deve ficar assim:
func main() {
//Carrega os destinatários em uma slice
var emailDestinatarios = getEmailDestinatarios("./emaildestinatarios.json")
for _, item := range emailDestinatarios {
//dispara um e-mail para cada um dos destinatários
disparaEmailDestinatario(item)
}
}
Ok, executando nosso programa devemos identificar na caixa de saída e na caixa de entrada do Gmail, configurado na função disparaEmailDestinatario algo parecido com isso:
Caixa de entrada (*considerando que você tenha colocado seu e-mail como um dos destinatários no arquivo json):
Caixa de saída:
Ótimo, agora que nosso programa está funcionando adequadamente, vamos empacotar ele em uma estrutura muito simples de docker.
Vamos criar um arquivo com o nome “Dockerfile.local” e nele o seguinte conteúdo:
Dockerfile.local
FROM google/golang-runtime
Legal, agora vamos criar um arquivo .zip(application source bundle) com a seguinte estrutura de arquivos:
- local
- json
- go
Coloquemos um nome adequado a este arquivo compactado.
Ex.: “v201702191610.zip”
Agora, considerando que você já tenha uma conta AWS validada, vamos seguir com o deploy do nosso container.
Passo 1, criando uma instância elástica:
- Faça o login e siga até Elastic Beanstalk -> Create New Application;
- Preencha “Application name” e “Description” – seja criativo;
- Next;
- Em New Environment, escolha “Web Server Environment” -> “Create web server”;
- Em Environment Type, na lista Predefined configuration, escolha “Preconfigured – Docker -> Go”:
- Na lista Environment type, escolha “Single Instance”, ao menos para este nosso teste, afinal de contas, a vantagem de se utilizar uma instância elástica é ter um processamento escalonado conforme a necessidade de processamento da sua aplicação;
- Next.
Passo 2, realizando o upload da aplicação:
- Em Application Version, escolha “Upload your own” e escolha o zip(application source bundle) que criarmos:
- Next;
- Environment Information, Next;
- Additional Resources, Next;
- Configuration Details, Next;
- Environment Tags, escolha qualquer chave e valor que lhe agrade – seja criativo;
- Next;
- Permissions, Next;
- Review & Launch.
Se tudo der certo, você deverá ver algo neste sentido:
E depois de um tempo, deve mudar para isso:
Você pode realizar quantos uploads achar necessário, através do botão “Upload and Deploy”:
Importante: mais uma daquelas “Siga por sua conta e risco…”
Eventualmente, o Gmail irá impedir que você dispare um e-mail á partir de uma máquina desconhecida, mesmo você tendo configurado o Gmail SMTP server corretamente.
Esta ação faz que o upload da sua aplicação falhe de forma catastrófica resultando em um status degraded/red.
Se isto acontecer, cheque na sua caixa de e-mail, pois você receberá um e-mail do tipo:
Apenas confira em algum serviço de whois se o ip do device apresentado pertence á AWS:
Se estiver seguro de que é o ip de saída da sua instância, libere-o e faça um novo upload da aplicação com um nome de versão diferente.
Pronto, depois destes passos, a aplicação deverá ir para o status running/green. Cheque seu e-mail e verifique se foram disparados os e-mails aos destinatários conforme seu arquivo json.
Após você rodar sua aplicação, é recomendável que você finalize o processamento desta instância, simplesmente terminando ela.
Clique em Actions -> Terminate Environement:
E pronto! Taxímetro desligado…
Conclusão, Go é muito divertido e Go distribuído é mais divertido ainda!
Git:https://github.com/edwardmartinsjr/iMasters-Go/tree/master/emailsender















