Neste módulo, você vai dividir o aplicativo node.js em vários serviços interconectados e enviar cada imagem do serviço a um repositório do Amazon ECR. Comece a compilar

A arquitetura final do aplicativo usa o Amazon Elastic Container Service e o Application Load Balancer. 

visão geral da arquitetura

a. Cliente
O cliente faz solicitações de tráfego na porta 80.

b. Load Balancer
O Application Load Balancer (ALB) direciona o tráfego externo ao serviço correto. O ALB inspeciona a solicitação do cliente e usa as regras de roteamento para direcionar a solicitação para uma instância e uma porta para o grupo-alvo que corresponde à regra.

c. Grupos-alvo
Cada serviço tem um grupo-alvo que mantém o controle das instâncias e portas de cada contêiner em execução para esse serviço.

d. Serviços conteinerizados
O Amazon Elastic Container Service (Amazon ECS) implanta cada serviço em um contêiner em todo um cluster do EC2. Cada contêiner trata apenas de um único recurso.

Isolamento de falhas
Mesmo as melhores organizações de engenharia podem ter e têm falhas fatais na produção. Além de seguir todas as melhores práticas padrão para lidar com falhas, a compilação em microsserviços se apresenta como uma abordagem que pode limitar o impacto de tais falhas. Uma boa arquitetura de microsserviço significa que, se uma pequena parte do seu serviço falhar, então aquela será a única parte a cair. O resto do seu serviço pode continuar a trabalhar adequadamente.

Isolamento para segurança
Em um aplicativo monolítico se um recurso do aplicativo tem uma violação de segurança, por exemplo, uma vulnerabilidade que permite a execução remota de código, então você deve assumir que um invasor pode ter obtido acesso a todos os outros recursos do sistema. Isso pode ser perigoso se, por exemplo, seu recurso de upload de avatar tiver um problema de segurança que acabe comprometendo seu banco de dados com senhas de usuários. A separação de recursos em microsserviços usando o Amazon ECS permite acesso seguro a recursos da AWS, dando a cada serviço sua própria função no IAM. Quando as melhores práticas do microsserviço são seguidas, o resultado é que, se um invasor comprometer um serviço, ele só obtém acesso aos recursos desse determinado serviço e não pode acessar horizontalmente outros recursos de outros serviços sem invadir esses serviços também.

Escalabilidade independente
Quando os recursos são divididos em microsserviços, a quantidade de infraestrutura e o número de instâncias usadas por cada classe de microsserviço pode ser escalada para cima e para baixo de forma independente. Isso torna mais fácil medir o custo de determinado recurso, identificar recursos que podem precisar ser otimizados primeiro, bem como manter o desempenho confiável para outros recursos, se um determinado recurso estiver fora de controle.

Velocidade de desenvolvimento
Microsserviços reduzem os riscos em desenvolvimento, o que pode habilitar uma equipe para compilar mais rapidamente. Em um monólito, adicionar um novo recurso pode afetar todos os outros recursos que o monólito contém. Os desenvolvedores devem considerar o impacto de qualquer código que adicionam e garantir que eles não corrompem nada. Por outro lado, uma arquitetura de microsserviço adequada tem um novo código para um novo recurso que vai para um novo serviço. Desenvolvedores podem ter certeza de que qualquer código que eles escrevam realmente não poderá impactar o código existente, a menos que eles explicitamente escrevam uma conexão entre dois microsserviços.

Tempo para conclusão: 20 minutos

Serviços usados:


Siga as instruções abaixo para dividir o monólito. Clique em cada número de etapa para expandir a seção.

break-the-monolith
  • Etapa 1. Provisione o repositório ECR

    Nas duas etapas anteriores, você implantou seu aplicativo como um monólito usando um único serviço e um único repositório de imagens de contêiner. Para implantar o aplicativo como três microsserviços, é necessário provisionar três repositórios (um para cada serviço) no Amazon ECR.

    Nossos três serviços são:

    1. usuários
    2. threads
    3. publicações


    Crie o repositório:

    • Navegue até o console do Amazon ECR.
    • Selecione Create Repository
    • Nome do repositório:
      • usuários
      • threads
      • publicações
    • Registre a informação dos repositórios: [account-id].dkr.ecr.[region].amazonaws.com/[service-name]

    Repita essas etapas para cada microsserviço.

    Agora você deve ter quatro repositórios no Amazon ECR.

    repositórios
  • Etapa 2. Autentique o Docker com a AWS (opcional)

    Você pode ignorar esta etapa se você recentemente concluiu o Módulo 1 deste workshop.

    • Execute o comando aws ecr get-login --no-include-email --region [region]
      Exemplo: aws ecr get-login --no-include-email --region us-west-2
    • Você terá uma enorme saída começando com docker login -u AWS -p ... Copie esta saída inteira, cole e execute-a no terminal.

    • Você deve ver o Login realizado com sucesso

      ⚐ OBSERVAÇÃO: se o login não for bem-sucedido, pode ser porque você tem uma versão mais recente do Docker que depreciou o sinalizador -e none. Para corrigir isso, cole a saída em seu editor de texto, remova -e none do final da saída e execute a saída atualizada no terminal.

  • Etapa 3. Compile e envie imagens para cada serviço

    Na pasta do projeto amazon-ecs-nodejs-microservices/3-microservices/services, você terá pastas com arquivos para cada serviço. Observe como cada microsserviço é, basicamente, um clone do serviço monolítico anterior.

    Você pode ver como cada serviço agora é especializado ao comparar o arquivo db.json em cada serviço e no serviço monolítico API. Anteriormente, publicações, threads e usuários eram todos armazenados em um único arquivo de banco de dados. Agora, cada um é armazenado em um arquivo de banco de dados para o respectivo serviço.

    Abra o terminal e defina o caminho para a seção 3-microservices/services do código do GitHub. ~/amazon-ecs-nodejs-microservices/3-microservices/services

    Compile e marque cada imagem

    • No terminal, execute docker build -t [service-name] ./[service-name] Exemplo: docker build -t posts ./posts
    • Após a compilação estar concluída, marque a imagem para que você possa enviá-la ao repositório: docker tag [service-name]:latest [account-id].dkr.ecr.[region].amazonaws.com/[service-name]:v1 exemplo: docker tag posts:latest [account-id].dkr.ecr.us-west-2.amazonaws.com/posts:v1
    • Execute o docker push para enviar sua imagem para ECR: docker push [account-id].dkr.ecr.[region].amazonaws.com/[service-name]:v1

    Se você navegar para o seu repositório ECR, deve ver as suas imagens com a tag v1. 

    ♻ Repita essas etapas para cada imagem de microsserviço.  

    ⚐ OBSERVAÇÃO: certifique-se de compilar e marcar as três imagens.