top of page
  • Foto do escritorRan Isenberg

Crie um aplicativo Web sem servidor no Fargate ECS com AWS CDK

Foto de Rodrigo Santos: https://www.pexels.com/photo/opened-program-for-working-online-on-laptop-3888149/
Foto de Rodrigo Santos: https://www.pexels.com/photo/opened-program-for-working-online-on-laptop-3888149/

Os contêineres também podem ser serverless, pelo menos até certo ponto. Decidi experimentar o Fargate e ver como é fácil implementar um aplicativo da web enquanto aprendo sobre suas vantagens e experiência de desenvolvedor.


Nesta publicação, você aprenderá como construir um cluster Fargate ECS com um balanceador de carga de aplicativo e um aplicativo da web usando o código Python CDK. Construiremos um cluster de nível de produção e seguro que passa por ferramentas de varredura de segurança como CDK-nag e hospeda um aplicativo da web ChatBot que se conecta ao OpenAI.


Você pode encontrar o repositório GitHub implantável completo aqui .

*Se você encontrar alguma configuração incorreta ou erro, me avise .

 

Índice

 

Introdução rápida ao AWS Fargate

Você pode criar um aplicativo web em Lambda, App Runner, EC2, ECS ou EKS. Neste post, vamos focar em ECS e aplicativos web em contêineres.

Para implantar um aplicativo web em contêiner, você precisa de um cluster ECS e um balanceador de carga de aplicativo que roteie o tráfego para ele.

O AWS Fargate é um serviço que leva serviços de conteinerização, seja ECS ou EKS, para o próximo nível. Ele adiciona outra camada de abstração bem-vinda e facilidade de gerenciamento.

AWS Fargate é uma tecnologia que você pode usar com o Amazon ECS para executar contêineres sem precisar gerenciar servidores ou clusters de instâncias do Amazon EC2. Com o AWS Fargate, você não precisa mais provisionar, configurar ou dimensionar clusters de máquinas virtuais para executar contêineres. - Documentação da AWS

Você não precisa pensar sobre os tipos de máquinas EC2, gerenciá-los, instalar atualizações de segurança ou gerenciar seu dimensionamento para cima ou para baixo; tudo é feito para você. A AWS afirma que é um serviço sem servidor; no entanto, no meu livro, é "quase" sem servidor, pois, como você verá nos exemplos de código, ainda precisamos criar VPCs e pagamos pelo serviço mesmo quando ele está ocioso e nenhum cliente está acessando nosso cluster. No entanto, ainda é uma abstração abençoada, e eu concordo com a seguinte declaração da AWS:

Com o AWS Fargate, você pode se concentrar na construção de aplicativos. Você gerencia menos - documentação da AWS

Você gerencia menos, mas paga mais, então tenha isso em mente. Se você estiver bem com o gerenciamento da infraestrutura e das máquinas EC2 sob o capô, você pode usar clusters ECS sem Fargate, o que custará tempo da equipe DevOps/infra.

 

Construindo um aplicativo web de chatbot sem servidor no Fargate

Escreveremos uma construção de CDK que implantará um cluster ECS gerenciado pelo Fargate que executa um aplicativo da web com um Application load balancer roteando tráfego para ele. Comprei um domínio personalizado e criei um certificado, mas não é obrigatório.

Toda a solução será segura e auditada com configurações de nível de produção. Usei o CDK-nag para escanear a saída do CloudFormation do meu CDK e garantir que não faltasse nenhuma configuração importante de auditoria ou segurança.

O aplicativo da web será um chatbot simples (sim, um desses) que capacita o OpenAI. O chatbot é um contêiner de tarefas ECS executando um aplicativo Streamlit baseado em Python.

Streamlit , uma ferramenta de código aberto, me permitiu criar uma interface de chatbot com menos de 10 linhas de código. Ela foi projetada para lidar com sessões e respostas de usuários no backend, ao mesmo tempo em que fornece uma interface de usuário frontend atraente.

Como observação, o código CDK pode implantar qualquer aplicativo da web, não apenas um chatbot.

 

Arquitetura de Alto Nível

Vamos revisar a arquitetura da nossa solução Fargate abaixo.

Diagrama de Arquitetura
Diagrama de Arquitetura

O AWS Fargate gerenciará o Application load balancer e um cluster ECS. O cluster ECS é implantado em uma VPC em duas AZs e cria contêineres de tarefas ECS (o contêiner do aplicativo da Web) com seus grupos de segurança. A imagem do contêiner é carregada no ECR .

O Fargate também cria um balanceador de carga. Ele tem o AWS WAF para protegê-lo com um bucket S3 que registra dados de tráfego e outro bucket que rastreia o acesso ao primeiro bucket S3.

Também criamos um domínio personalizado Route53 e registros DNS que apontam para o endereço público ALB.


Vamos revisar o código do CDK e o código do aplicativo web.

 

Código CDK

Há muito código, então siga meus comentários.


Na linha 19, obtemos um objeto WAF (veja sua definição aqui ) e ativos de rede. Os ativos de rede são o domínio personalizado e seu certificado. Esteja ciente de que eles são opcionais. A definição deles está aqui .

Nas linhas 25-31, construímos a imagem docker ECR para nossa imagem de contêiner de aplicativo web. O CDK executará o Docker e esperará um Dockerfile no diretório que fornecemos. Mais sobre isso depois.


Nas linhas 34-78, definimos uma VPC para nosso cluster ECS. O Fargate não é "verdadeiramente" serverless; ainda precisamos usar VPCs como ECS regular. Também habilitamos fluxos de VPC e todas as permissões necessárias (sim, é muito código só para logs!).


Na linha 81, definimos o cluster ECS e habilitamos o container insights . Há muitas partes móveis aqui, então devemos habilitar o máximo de logs e métricas possível para depurar problemas.

Nas linhas 35-51, definimos a definição da tarefa Fargate. Observe que não selecionamos os tipos de máquina EC2. Em vez disso, definimos a quantidade de memória e CPUs virtuais que precisamos. O Fargate encontrará os tipos de máquina apropriados de acordo com suas estratégias de custo-eficiência (você pode controlá-los e adicionar o Spot instances capacity provider também). Na linha 42, selecionamos a plataforma ARM64, pois uso um laptop baseado em ARM para construir a imagem Docker.

Nas linhas 84-103, definimos o contêiner usado na tarefa ECS. Definimos a imagem Docker e habilitamos o registro para o contêiner. Novamente, outro tipo de registro que devemos habilitar para ajudar a depurar o aplicativo da web.

Na linha 103, definimos a porta aberta do contêiner como 8501, que é o padrão para o Streamlit como nosso aplicativo web.


Vamos passar para o ALB e outras configurações de prontidão para produção.

Nas linhas 105-129, criamos os buckets S3 para ALB e logs de acesso ao bucket; habilitamos as configurações recomendadas pela segurança.


Nas linhas 132-163, definimos a tarefa Fargate ALB. Ela cria um serviço ECS com nossa definição de tarefa (e contêiner) e configura um ALB que manipula o roteamento para esses contêineres. Nós fornecemos a ele o certificado e a zona hospedada criada na construção de ativos de rede. Não definimos um IP público; habilitamos o redirecionamento HTTP para HTTPS. Recursos avançados, como disjuntores, são recomendados para detectar falhas durante a implantação e iniciar uma reversão para um estado estável anterior.

Nas linhas 154-160, adicionamos permissões do IAM ao processo em execução no contêiner. No nosso caso, precisamos acessar o secrets manager para buscar a chave da OpenAI API que estava armazenada lá.


Na linha 166, habilitamos o WAF ACL em nosso ALB para segurança extra.

Nas linhas 172-182, dizemos ao Fargate como e quando escalar seu serviço. Fornecemos limites de CPU e memória.

Por fim, a linha 184 habilita verificações de saúde em nosso aplicativo da web. O Streamlit fornece suporte de endpoint de verificações de saúde no caminho '/healthz'.



Você pode encontrar o arquivo completo neste repositório .

 

Código do aplicativo da Web e Dockerfile

Vamos começar com o Dockerfile.

Quando você executa o CDK deploy, ele eventualmente usará esse Dockerfile para criar e carregar uma imagem ECR. Ele requer que um arquivo requirements.txt resida na mesma pasta. Também exigimos o app.py do nosso aplicativo web.

Eu o criei automaticamente executando o seguinte comando:

poetry export --without=dev --format=requirements.txt > cdk/service/docker/requirements.txt

Vamos revisar o arquivo abaixo:


Quanto ao código do aplicativo web, ele se baseia principalmente neste exemplo com código adicionado que busca o segredo da chave da API OpenAI do Secrets Manager.

Se você olhar atentamente para a linha 21, verá que eu fiz uma "engenharia de prompt" simples e pedi ao bot para responder a cada pergunta com algum contexto predefinido. Obviamente, este não é um bot de bate-papo otimizado ou bom, mas apenas um POC. A ideia principal era aprender como implementar um aplicativo web Fargate.



Vamos implantar o código e vê-lo em ação.


 

Resultado da Implantação

Após a implantação, você acessará a URL e será recebido por esta interface de chatbot.

Perguntei a ele se Ran, o construtor, prefere K8s ou serverless e obtive uma resposta bem razoável.

Sem servidor vs. K8S
Sem servidor vs. K8S
 

Resumo

Neste post, aprendemos um pouco sobre o Fargate. Criamos um Chatbot no Fargate ECS e melhoramos suas melhores práticas de segurança e auditoria usando o CDK. Você pode usar este código como um modelo e implementar qualquer aplicativo da web.

Por favor, revise este código - verifique se há configurações incorretas e problemas de segurança. Além disso, certifique-se de adicionar painéis e alertas do CloudWatch da mesma maneira que fiz para meu serviço sem servidor (veja esta postagem ).

Se você encontrar algum problema de segurança, entre em contato comigo.

Kommentare


bottom of page