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

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

visão geral da arquitetura

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

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

c. Grupos de destino
Cada serviço tem um grupo de destino que monitora as instâncias e portas de cada contêiner em execução para esse serviço.

d. Microsserviços
O Amazon ECS implanta cada serviço em um contêiner em um cluster inteiro do EC2. Cada contêiner lida apenas com um único recurso.

Isolamento de falhas
Mesmo as melhores organizações de engenharia podem ter e têm falhas graves na produção. Além de seguir todas as melhores práticas padrão para lidar com falhas harmoniosamente, uma abordagem que pode limitar o impacto de tais falhas é a criação de microsserviços. Uma boa arquitetura de microsserviço significa que se uma pequena parte do seu serviço falhar, apenas essa parte do seu serviço deixará de funcionar. O resto do serviço poderá continuar a funcionar adequadamente.

Isolamento para segurança
Em um aplicativo monolítico, se um recurso tiver uma violação de segurança, por exemplo, uma vulnerabilidade que permita a execução remota de código, você deverá supor que um invasor pode ter obtido acesso a todos os outros recursos do sistema também. Isso pode ser perigoso se, por exemplo, seu recurso de upload de avatar tiver um problema de segurança que comprometa seu banco de dados com senhas de usuários. Separar recursos em microsserviços usando o Amazon ECS permite que você proteja o acesso a recursos da AWS ao dar a cada serviço sua própria função de AWS Identity and Access Management (IAM). Quando as melhores práticas de microsserviço são seguidas, o resultado é que se um invasor comprometer um serviço, ele só terá acesso aos recursos desse serviço e não poderá 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, o volume de infraestrutura e o número de instâncias usados por cada classe de microsserviço pode ser escalado para mais ou para menos de modo independente. Isso facilita a medição dos custos de um recurso específico e identifica recursos que podem precisar prioritariamente de otimização. Se um recurso específico estiver enfrentando problemas com sua necessidade de reservas, outros recursos não serão impactados e poderão manter sua performance confiável.

Velocidade de desenvolvimento
Microsserviços reduzem os riscos no desenvolvimento, o que pode favorecer uma equipe a criar mais rapidamente. Em um monólito, adicionar um novo recurso pode afetar todos os outros recursos contidos nesse monólito. Os desenvolvedores precisam considerar com cuidado o impacto de qualquer código que eles adicionam e garantir que não corrompam nada. Por outro lado, uma arquitetura adequada de microsserviço tem um novo código para um novo recurso que entra em um novo serviço. Os desenvolvedores podem ter certeza de que qualquer código que eles criem não poderá de fato afetar o código existente, a menos que eles explicitamente criem uma conexão entre dois microsserviços.

Tempo para a conclusão: 20 minutos

Serviços usados:


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

break-the-monolith
  • Etapa 1. Provisionar os repositórios do ECR

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

    Nossos três serviços são:

    1. users
    2. threads
    3. posts

    Crie os três repositórios repetindo as seguintes etapas para cada serviço:

    • Navegue até o console do Amazon ECR.
    • Selecione Criar repositório.
    • Na página Criar repositório, campo Nome do repositório, crie um repositório para o serviço (posts, threads ou users).
      ⚐ Observação: para as opções de Imutabilidade de tag, mantenha as configurações padrão.

    Você deve ter quatro repositórios no Amazon ECR. Registre as informações de repositório para cada microsserviço criado. Essas informações serão necessárias em uma etapa futura. A informação de que você precisa está no seguinte formato:
    [id-da-conta].dkr.ecr.[região].amazonaws.com/[nome-do-serviço]

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

    Você precisará acessar o Docker para criar e enviar imagens para cada serviço. Se estiver trabalhando neste tutorial em diferentes momentos, você talvez tenha se desconectado do Docker. Se esse for o caso, siga as etapas abaixo para se conectar ao Docker novamente.

    • Execute $(aws ecr get-login --no-include-email --region [sua-região])
      Substitua [sua-região], por exemplo: $(aws ecr get-login --no-include-email --region us-west-2)

    Se a autenticação for bem-sucedida, você receberá a mensagem de confirmação: Login bem-sucedido.

  • Etapa 3. Criar e enviar 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. Perceba como cada microsserviço é essencialmente um clone do serviço monolítico anterior.

    Você pode ver como cada serviço é agora especializado comparando o arquivo db.json em cada serviço e no serviço de api monolítico. Posts, threads e users anteriores foram todos armazenados em um único arquivo de banco de dados. Agora, cada um está armazenado no arquivo de banco de dados do respectivo serviço.

    Abra seu terminal e defina o caminho para ~/amazon-ecs-nodejs-microservices/3-microservices/services

    Criar e marcar cada imagem

    • No terminal, execute docker build -t [nome-do-serviço] ./[nome-do-serviço]
      Substitua o [nome-do-serviço], por exemplo: docker build -t posts ./posts

    • Depois que a criação estiver concluída, marque a imagem para que você possa enviá-la para o repositório:
      docker tag [nome-do-serviço]:latest [ID-da-conta].dkr.ecr.[região].amazonaws.com/[nome-do-serviço]:v1
      Substitua [nome-do-serviço], [ID-da-conta] e [região], por exemplo: docker tag posts:latest [id-da-conta].dkr.ecr.us-west-2.amazonaws.com/posts:v1

    • Envie sua imagem para o ECR: docker push [id-da-conta].dkr.ecr.[região].amazonaws.com/[nome-do-serviço]:v1
      Substitua [nome-do-serviço], [ID-da-conta] e [região].

    Se você navegar até seu repositório do ECR, deverá ver suas imagens marcadas com v1. 

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

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