É aquela época do ano novamente! Esta postagem faz parte de nosso Rumo ao AWS re:Invent 2017 série de blogs. Nas semanas que antecedem o AWS re:Invent, em Las Vegas, em novembro, postaremos sobre vários tópicos relacionados à execução do MongoDB na nuvem pública. Veja todas as postagens aqui.


Em minha última postagemcomeçamos a preparar um aplicativo baseado em Node.js e MongoDB Atlas para operações CRUD simples. Concluímos a configuração inicial do código e agora estamos prontos para colocá-lo em produção.

Conforme mencionado na primeira parte, quero minimizar a manutenção de longo prazo do ambiente de hospedagem desse aplicativo. Da mesma forma que usamos o MongoDB Atlas para transferir muitas das responsabilidades operacionais do nosso banco de dados, podemos usar o Amazon EC2 Container Service para implementar nossos aplicativos Docker no AWS. Ao reduzir a quantidade de patches, a manutenção de sistemas e as preocupações de segurança de longo prazo tanto para o nosso banco de dados quanto para o front-end do aplicativo, podemos dedicar mais tempo ao desenvolvimento do aplicativo.

Preparar o Docker e o coldbrew-cli para implantação


O Docker e o coldbrew-cli têm arquivos de configuração simples que analisaremos e escreveremos no diretório raiz do nosso repositório.

Docker


Vamos dar uma olhada no Dockerfile:












DE node:boron

CORRER mkdir -p /usr/src/app

WORKDIR /usr/src/app

CÓPIA . /usr/src/app

EXPOSE 3000

CMD [“npm”, “start”]


Esse arquivo dirá ao Docker para seguir as instruções para usar a versão “boron” LTS do Node.js, o que significa que não precisaremos instalá-lo manualmente para trabalhar com nosso aplicativo. Depois de estabelecer a versão apropriada do Node.js a ser usada, criaremos um diretório de trabalho no contêiner informando onde o aplicativo ficará. O aplicativo será copiado para o diretório de trabalho, "/usr/src/app"e, finalmente, será iniciado usando o comando npm start indicado em nosso package.json .

Coloque o conteúdo do Dockerfile na raiz do repositório de código e salve-o.

echo "FROM node:boron
>
> RUN mkdir -p /usr/src/app
>WORKDIR /usr/src/app
>
>COPY . /usr/src/app
>
>EXPOSE 3000
>
>CMD ["npm", "start"]" > Dockerfile


Em seguida, começaremos a trabalhar com o coldbrew-cli. Assim como no Docker, criaremos um arquivo de configuração de texto simples que conterá instruções básicas sobre como configurar nossa infraestrutura para nosso aplicativo.

coldbrew-cli


Vamos criar um arquivo chamado coldbrew.conf na raiz do diretório do nosso repositório e armazenar o seguinte conteúdo nele:

touch coldbrew.conf















nome: mern-demo

cluster: mern-demo

port: 3000

unidades: 2

cpu: 1.0

memória: 500m

load_balancer:

habilitado: true

health_check:

path: /

status: 200


Para obter uma análise completa de todos os termos deste arquivo, dê uma olhada no documentação do coldbrew-cli. Forneci um arquivo de configuração simples que configurará nosso balanceamento de carga elástica (ELB) com uma instância de computação para nosso contêiner e 500 MB de memória disponível por aplicativo. Podemos até configurar uma verificação de integridade simples para nosso ELB para garantir que nossas instâncias estejam on-line.

Agora podemos criar nosso ambiente com o coldbrew-cli. Para fins deste passo a passo, digamos que queremos implantar nosso cluster ECS na região us-east-2 e que não precisamos acessar nossos nós via SSH; podemos iniciar usando o seguinte comando:

$ coldbrew --aws-region="us-east-2" cluster-create mern-demo --disable-keypair

Depois de executar isso, será exibida uma lista de recursos que serão criados:

Determining AWS resources to create...
  ECS Cluster: coldbrew-mern-demo
  IAM Role for ECS Services: coldbrew-mern-demo-ecs-service-role
  EC2 Launch Configuration for ECS Container Instances: coldbrew-mern-demo-lc
  EC2 Auto Scaling Group for ECS Container Instances: coldbrew-mern-demo-asg
  IAM Instance Profile for ECS Container Instances: coldbrew-mern-demo-instance-profile
  EC2 Security Group for ECS Container Instances: coldbrew-mern-demo-instance-sg

Do you want to create these resources? [y/N]:


Responda “Yes”, e seus recursos começarão a ser criados em segundo plano.

[+] Creating IAM Instance Profile [coldbrew-mern-demo-instance-profile]...
[+] Creating EC2 Security Group [coldbrew-mern-demo-instance-sg]...
[*] Adding inbound rule [tcp:22:0.0.0.0/0] to EC2 Security Group [coldbrew-mern-demo-instance-sg]...
[+] Creating EC2 Launch Configuration [coldbrew-mern-demo-lc]... (this may take long)
[+] Creating EC2 Auto Scaling Group [coldbrew-mern-demo-asg]... (this may take long)
[+] Creating ECS Cluster [coldbrew-mern-demo]...
[+] Creating IAM Role [coldbrew-mern-demo-ecs-service-role]...


Podemos consultar o status com o seguinte comando:

$ coldbrew --aws-region="us-east-2" cluster-status mern-demo

Aqui está a saída do comando semelhante ao que obteríamos:

Cluster
  Name: mern-demo
AWS
  Region: us-east-2
  VPC: vpc-7935db10
  Subnets: subnet-70f0df3a subnet-58e01531 subnet-49d4db31
ECS
  ECS Cluster: coldbrew-mern-demo
  IAM Role for ECS Services: coldbrew-mern-demo-ecs-service-role
  ECS Services: 0
  ECS Tasks (running/pending): 0/0
  ECS Container Instances: 1
Auto Scaling
  EC2 Launch Configuration: coldbrew-mern-demo-lc
    IAM Instance Profile: coldbrew-mern-demo-instance-profile
    Instance Type: t2.micro
    Image ID: ami-bd3e64d8
    Key Pair:
    Security Groups: coldbrew-mern-demo-instance-sg
  EC2 Auto Scaling Group: coldbrew-mern-demo-asg
    Instances (current/desired/min/max): 1/1/0/1
ECS Container Instance
  ID: a56d40d1-7095-45a0-af81-5f309bbbd728
  Status: ACTIVE
  Tasks (running/pending): 0/0
  CPU (remaining/registered): 1.00/1.00
  Memory (remaining/registered): 995M/995M,
  EC2 Instance ID: i-03fdc038f3d1c71c8
    Private IP: 172.31.44.140
    Public IP: 18.221.72.130


Uau, isso é muito trabalho poupado. Tudo, desde a nossa VPC até o ELB, foi criado para nós. Está vendo o IP público da nossa instância de computação? Vamos nos certificar de que ele esteja na lista de permissões do nosso cluster do Atlas para que nossos dados possam ser salvos.


Se o senhor substituísse o cluster gratuito M0 por um dos clusters dedicados do Atlas, teria acesso ao nosso módulo de peering VPC para AWS, o que lhe daria a capacidade de colocar na lista de permissões toda a gama de servidores host por meio de uma entrada de grupo de segurança na lista de permissões.

Agora é hora de criar nossa imagem do Docker com o coldbrew-cli e implementar nosso aplicativo.

Primeiro, uma imagem do Docker é criada e salva:



$ coldbrew --aws-region="us-east-2" deploy


[*] Checking cluster availability [mern-demo]...
[+] Creating ECR Repository [coldbrew/mern-demo]...
[*] Building Docker image [722245653955.dkr.ecr.us-east-2.amazonaws.com/coldbrew/mern-demo:latest]... (this may take long)

> docker build -t 722245653955.dkr.ecr.us-east-2.amazonaws.com/coldbrew/mern-demo:latest -f /Users/jaygordon/work/mern-crud/Dockerfile /Users/jaygordon/work/mern-crud


Em seguida, a imagem é enviada para os nós apropriados no cluster:



[*] Pushing Docker image [722245653955.dkr.ecr.us-east-2.amazonaws.com/coldbrew/mern-demo:latest]... (this may take long)

> docker push 722245653955.dkr.ecr.us-east-2.amazonaws.com/coldbrew/mern-demo:latest
The push refers to a repository [722245653955.dkr.ecr.us-east-2.amazonaws.com/coldbrew/mern-demo]
a791685d46cb: Pushed
e71eccb6eee4: Pushed
b7f1d9d858aa: Pushed
246ae56dbdbd: Pushed
e271ac6d0c18: Pushed
682e7cee9d37: Pushed
d359ab38b013: Pushed
latest: digest: sha256:c58153d1fe62dacb1644966ffe4acca6b76cb383aee1f76e0efd97ceaa1a306e size: 2425

[*] Updating ECS Task Definition [mern-demo]...
[+] Creating ELB Target Group [mern-demo-elb-tg]...
[+] Creating EC2 Security Group [mern-demo-elb-sg]...
[*] Adding inbound rule [tcp:80:0.0.0.0/0] to EC2 Security Group [mern-demo-elb-sg]...
[*] Adding inbound rule [tcp:0:sg-f8ab7190] to EC2 Security Group [coldbrew-mern-demo-instance-sg]...
[+] Creating ELB Load Balancer [mern-demo-elb]...
[+] Adding listener (HTTP) for ELB Load Balancer [mern-demo-elb]...
[+] Creating ECS Service [mern-demo]...

Application deployment completed.


Nosso aplicativo agora está implantado. Vamos obter o ELB e verificar:

coldbrew --aws-region="us-east-2" status |egrep elb

ELB Target Group: mern-demo-elb-tg
  ELB Load Balancer: mern-demo-elb
    Endpoint: http://mern-demo-elb-2131866240.us-east-2.elb.amazonaws.com:80


O ELB agora nos fornece um endpoint http para acessar nosso aplicativo. Não há necessidade de usar o nginx ou qualquer outro servidor http para fazer proxy reverso da porta do Node.js. O processo de implantação do coldbrew-cli configurará o encaminhamento de porta com base nas informações do arquivo coldbrew.conf. A criação e a implantação do cluster levam cerca de cinco minutos. Para testar se estamos on-line e em funcionamento, basta acessar o URL fornecido pelo coldbrew e adicionar um registro ao nosso aplicativo (o primeiro carregamento pode levar um minuto):

Parabéns, agora temos todas as ferramentas para criar e configurar nosso próprio cluster ECS usando o MongoDB Atlas! Destruir o aplicativo também é bastante simples – basta executar esses dois comandos para encerrar todos os recursos associados ao ECS.

$ coldbrew --aws-region="us-east-2" delete
Determining AWS resources that need to be deleted...
  ECS Service: mern-demo
  ECR Repository: coldbrew/mern-demo
  ELB Target Group: mern-demo-elb-tg
  ELB Load Balancer: mern-demo-elb
  EC2 Security Group for ELB Load Balancer: mern-demo-elb-sg
> Do you want to delete these resources? [y/N]: y


Depois que respondermos “sim”, os recursos criados começarão a ser encerrados:

[*] Updating ECS Service to stop all tasks [mern-demo]...
[-] Deleting ELB Load Balancer [mern-demo-elb]...
[-] Deleting ELB Target Group [mern-demo-elb-tg]... (this may take long)
[-] Removing inbound rule [tcp:0:sg-f8ab7190] from EC2 Security Group [coldbrew-mern-demo-instance-sg]...
[-] Deleting EC2 Security Group for ELB Load Balancer [mern-demo-elb-sg]... (this may take long)
[-] Deleting ECR Repository [coldbrew/mern-demo]...
[-] Deleting (and draining) ECS Service [mern-demo]... (this may take long)


E agora exclua os elementos restantes do cluster:

$ coldbrew --aws-region="us-east-2" cluster-delete mern-demo

Determining AWS resources that need to be deleted...
  ECS Cluster: coldbrew-mern-demo
  IAM Role for ECS Services: coldbrew-mern-demo-ecs-service-role
  EC2 Launch Configuration for ECS Container Instances: coldbrew-mern-demo-lc
  EC2 Auto Scaling Group for ECS Container Instances: coldbrew-mern-demo-asg
  IAM Instance Profile for ECS Container Instances: coldbrew-mern-demo-instance-profile
  EC2 Security Group for ECS Container Instances: coldbrew-mern-demo-instance-sg

> Do you want to delete these resources? [y/N]: y


Responda “yes” e veremos os elementos restantes do cluster de computação serem encerrados:

[*] Terminating instances in EC2 Auto Scaling Group [coldbrew-mern-demo-asg]... (this may take long)
[-] Deleting EC2 Auto Scaling Group [coldbrew-mern-demo-asg]... (this may take long)
[-] Deleting EC2 Launch Configuration [coldbrew-mern-demo-lc]... 
[-] Deleting IAM Instance Profile [coldbrew-mern-demo-instance-profile]... 
[-] Deleting EC2 Security Group [coldbrew-mern-demo-instance-sg]... 
[-] Deleting ECS Cluster [coldbrew-mern-demo]... 
[-] Deleting IAM Role [coldbrew-mern-demo-ecs-service-role]... 


O que vem a seguir?


Experimente esse processo com seu próprio aplicativo ou até mesmo com um cluster dedicado do MongoDB Atlas para habilitar o emparelhamento VPC. O senhor pode obter um tutorial completo sobre como configurar o emparelhamento VPC no MongoDB Atlas, visualizando o “Emparelhando seu cluster do MongoDB Atlas com o AWS” vídeo. O senhor poderá usar uma implementação totalmente baseada em serviços do seu aplicativo que não exige o gerenciamento de sistemas operacionais, a atualização de kernels e menos trabalho manual geral.

Se quiser se inscrever para um cluster gratuito do MongoDB Atlas, consulte nossa página de inscrição aqui!

Jay Gordon

Sobre Jay Gordon

Jay Gordon é um defensor do desenvolvedor no MongoDB, focado em fornecer aos usuários uma ótima experiência com produtos em nuvem. Ele entrou para a MongoDB em 2016, depois de muitos anos trabalhando como administrador de sistemas e profissional de DevOps.