Uma tradução do artigo foi preparada especificamente para os alunos do curso de Serviços em Nuvem . É interessante desenvolver nessa direção? Assista a uma aula de Egor Zuev (TeamLead no InBit) “Serviço AWS EC2” e entre para o grupo de cursos mais próximo: comece no dia 26 de setembro.

Mais e mais pessoas estão migrando para o AWS Lambda para escalabilidade, desempenho, economia de custos e capacidade de processar milhões ou até trilhões de solicitações por mês. Para fazer isso, você não precisa gerenciar a infraestrutura na qual o serviço trabalha. E o dimensionamento automático permite atender milhares de solicitações simultâneas por segundo. Acho que o AWS Lambda pode ser legitimamente chamado de um dos serviços mais populares da AWS.
AWS Lambda
O AWS Lambda é um serviço de computação sem servidor orientado a eventos que permite executar código sem alocar e administrar servidores e complementar outros serviços da AWS com base na lógica do usuário. O Lambda responde automaticamente a vários eventos (os chamados gatilhos), por exemplo, a solicitações HTTP por meio do Amazon API Gateway, alterações de dados nas cestas do Amazon S3 ou nas tabelas do Amazon DynamoDB; Ou você pode executar seu código por meio de chamadas de API usando o AWS SDK e transições de estado nas AWS Step Functions.
O Lambda executa o código em uma infraestrutura de computação altamente acessível e é totalmente responsável pela administração da plataforma subjacente, incluindo manutenção de servidor e sistema operacional, alocação de recursos, dimensionamento automático, monitoramento de código e registro. Ou seja, você só precisa fazer o upload do seu código e configurar como e quando ele deve ser executado. Por sua vez, o serviço cuidará do seu lançamento e garantirá a alta disponibilidade do seu aplicativo.
Quando atualizar para o Lambda?
O AWS Lambda é uma plataforma de computação conveniente, adequada para muitos cenários de aplicativos, é claro, se o idioma e o tempo de execução do seu código forem suportados pelo serviço. Se você deseja se concentrar no código e na lógica de negócios com manutenção, provisionamento e dimensionamento do servidor para um fornecedor terceirizado por um preço razoável, você definitivamente deve atualizar para o AWS Lambda.
O Lambda é ideal para criar interfaces de software e, se você usar o serviço com o API Gateway, poderá reduzir significativamente os custos e entrar no mercado mais rapidamente. Existem várias maneiras de usar as funções e opções do Lambda para organizar uma arquitetura sem servidor - todos poderão escolher algo adequado com base em seus objetivos.
O Lambda permite que você execute uma ampla variedade de tarefas. Portanto, graças ao suporte do CloudWatch, você pode criar tarefas pendentes e automatizar processos individuais. Não há restrições quanto à natureza e intensidade do uso do serviço (o consumo de memória e o tempo são levados em consideração) e nada impede que você trabalhe sistematicamente em um microsserviço completo baseado no Lambda.
Aqui você pode criar ações orientadas a serviços que não são executadas constantemente. Um exemplo típico é o dimensionamento de imagens. Mesmo no caso de sistemas distribuídos, as funções Lambda não perdem sua relevância.
Portanto, se você não deseja se envolver na alocação e administração de recursos de computação - tente o AWS Lambda; se você não precisar de computação pesada e com muitos recursos, tente também o AWS Lambda; se seu código for executado periodicamente - tudo estiver correto, você deve tentar o AWS Lambda.
Segurança
Até o momento, não há queixas sobre segurança. Por outro lado, como muitos processos internos e recursos de implementação desse modelo estão ocultos do usuário do ambiente de tempo de execução gerenciado do AWS Lambda, algumas regras de segurança em nuvem geralmente aceitas não são mais relevantes.
Como a maioria dos serviços da AWS, o Lambda é fornecido com base na responsabilidade compartilhada entre a AWS e o cliente em relação à segurança e conformidade regulamentar. Esse princípio reduz a carga operacional no cliente, pois a AWS assume as tarefas de manutenção, administração e controle dos componentes do serviço - desde o sistema operacional host e o nível de virtualização até a segurança física dos objetos de infraestrutura.
Falando especificamente sobre o AWS Lambda, a AWS é responsável por gerenciar a infraestrutura subjacente, os serviços subjacentes relacionados, o sistema operacional e a plataforma de aplicativos. Enquanto o cliente é responsável pela segurança de seu código, pelo armazenamento de dados confidenciais, pelo controle de acesso a eles, bem como aos serviços e recursos do Lambda (Gerenciamento de Identidade e Acesso, IAM), inclusive no escopo das funções utilizadas.
O diagrama abaixo mostra o modelo de responsabilidade compartilhada aplicável ao AWS Lambda. A área de responsabilidade da AWS é laranja e a responsabilidade do cliente é azul. Como você pode ver, a AWS assume mais responsabilidade pelos aplicativos implantados no serviço.

Modelo de responsabilidade compartilhada aplicável à AWS Lambda
Tempo de execução Lambda
A principal vantagem do Lambda é que, executando uma função em seu nome, o próprio serviço aloca os recursos necessários. Você pode economizar tempo e esforço na administração do sistema e se concentrar na lógica comercial e na escrita de código.
O serviço Lambda é dividido em dois aviões. O primeiro é o plano de controle. Segundo a Wikipedia, o plano de controle é a parte da rede responsável pela sinalização de tráfego e roteamento. É o principal componente que toma decisões globais sobre a alocação, manutenção e distribuição de cargas de trabalho. Além disso, o plano de controle atua como a topologia de rede do provedor de soluções, responsável pelo roteamento e gerenciamento de tráfego.
O segundo plano é o plano de dados. Como o plano de controle, ele tem suas próprias tarefas. O plano de gerenciamento fornece uma API para gerenciar funções (CreateFunction, UpdateFunctionCode) e controla a interação do Lambda com outros serviços da AWS. O plano de dados é controlado pela API Invoke, que chama as funções Lambda. Após chamar a função, o plano de controle seleciona ou seleciona o tempo de execução existente preparado antecipadamente para esta função e, em seguida, executa o código nela.
O AWS Lambda suporta muitas linguagens de programação, incluindo Java 8, Python 3.7, Go, NodeJS 8, .NET Core 2 e outras, por meio de seus respectivos tempos de execução. A AWS os atualiza regularmente, distribui patches de segurança e executa outras operações de manutenção nesses ambientes. O Lambda permite usar outros idiomas, desde que você mesmo implemente o tempo de execução apropriado. E então você terá que lidar com sua manutenção, incluindo o monitoramento de segurança.
Como tudo funciona e como o serviço executará suas funções?
Cada função funciona em um ou vários ambientes selecionados que existem apenas durante o ciclo de vida dessa função e são destruídos. Em cada ambiente, apenas uma chamada é feita por vez, mas é reutilizada se houver muitas chamadas seriais da mesma função. Todos os tempos de execução são executados em máquinas virtuais com virtualização de hardware - no chamado microVM. Cada microVM é atribuído a uma conta específica da AWS e pode ser reutilizado pelos ambientes para executar várias funções nessa conta. As MicroVMs são empacotadas nos blocos de construção da plataforma de hardware Lambda Worker, que a AWS possui e opera. O mesmo tempo de execução não pode ser usado por diferentes funções, assim como os microVMs são exclusivos para diferentes contas da AWS.

Modelo de isolamento do AWS Lambda
O isolamento do tempo de execução é implementado usando vários mecanismos. No nível mais alto de cada ambiente, há cópias separadas dos seguintes componentes:
- Código de função
- Quaisquer camadas Lambda selecionadas para a função
- Tempo de execução da função
- Espaço mínimo de usuário do Amazon Linux
Os seguintes mecanismos são usados para isolar diferentes ambientes de tempo de execução:
- cgroups - restrição de acesso aos recursos da CPU, memória, largura de banda da unidade e rede para cada ambiente de tempo de execução;
- namespaces - IDs de processo de agrupamento, IDs de usuário, interfaces de rede e outros recursos gerenciados pelo kernel do Linux. Cada tempo de execução é executado em seu próprio espaço para nome;
- seccomp-bpf - restrição de chamadas do sistema que podem ser usadas no ambiente de tempo de execução;
- iptables e tabelas de roteamento - isolamento de ambientes de tempo de execução entre si;
- chroot - fornece acesso limitado ao sistema de arquivos subjacente.
Combinados com a tecnologia de isolamento proprietária da AWS, esses mecanismos garantem uma separação confiável dos ambientes de tempo de execução. A mídia isolada dessa maneira não pode acessar ou modificar dados de outra mídia.
Embora vários tempos de execução da mesma conta da AWS possam ser executados no mesmo microVM, em nenhuma circunstância os microVMs podem ser compartilhados entre diferentes contas da AWS. O AWS Lambda usa apenas dois mecanismos para isolar microVMs: instâncias EC2 e Firecracker. O isolamento de convidados no Lambda com base em instâncias do EC2 está em uso desde 2015. O Firecracker é o novo hipervisor de código aberto projetado especificamente pela AWS para cargas de trabalho sem servidor e lançado em 2018. O equipamento físico no qual os microVMs estão em execução é compartilhado entre as cargas de trabalho de diferentes contas.
Salvando ambientes e estados do processo
Embora os tempos de execução do Lambda sejam exclusivos para diferentes funções, eles podem chamar repetidamente a mesma função, ou seja, o tempo de execução pode durar várias horas antes de ser destruído.
Cada tempo de execução do Lambda também possui um sistema de arquivos com permissão de gravação, acessível através do diretório / tmp. Seu conteúdo não pode ser acessado de outros tempos de execução. Em relação à preservação dos estados do processo, os arquivos gravados em / tmp existem durante todo o ciclo de vida do tempo de execução. Devido a isso, é possível acumular os resultados de várias chamadas, o que é especialmente útil para operações caras, como carregar modelos de aprendizado de máquina.
Transferência de dados de chamada
A API de chamada pode ser usada em dois modos: no modo de evento e no modo de solicitação-resposta. No modo de evento, a chamada é adicionada à fila para execução subsequente. No modo "solicitação-resposta", a função é chamada instantaneamente com a carga útil fornecida, após a qual a resposta é retornada. Nos dois casos, a função é executada no ambiente Lambda, mas com diferentes caminhos de carga útil.
Durante as chamadas solicitação-resposta, a carga útil vem da API de processamento de solicitação (API Caller), como o AWS API Gateway ou o AWS SDK, para o balanceador de carga e, em seguida, para o Lambda Call Execution Service (Serviço de chamada). Este último determina o ambiente apropriado para executar a função e transfere a carga útil para concluir a chamada. O balanceador de carga recebe tráfego com proteção TLS pela Internet. O tráfego no serviço Lambda - após o balanceador de carga - passa pela VPC interna em uma região específica da AWS.

Modelo de processamento de chamadas do AWS Lambda: modo de solicitação-resposta
Chamadas de eventos podem ser feitas imediatamente ou adicionadas à fila. Em alguns casos, a fila é implementada usando o serviço Amazon SQS (Amazon Simple Queue Service), que transfere chamadas para o serviço de execução de chamadas Lambda por meio de um processo interno de pesquisa. O tráfego transmitido é protegido pelo TLS e nenhuma criptografia adicional dos dados armazenados no Amazon SQS é fornecida.
As chamadas de eventos não retornam respostas - o Lambda Worker simplesmente ignora qualquer informação de resposta. As chamadas baseadas no Amazon S3, Amazon SNS, CloudWatch e outras fontes são tratadas pelo Lambda no modo de evento. As chamadas dos fluxos do Amazon Kinesis e DynamoDB, as chamadas das filas SQS, o balanceador de carga do aplicativo e as APIs do Gateway são tratadas no modo de solicitação-resposta.
Monitoramento
Você pode monitorar e auditar as funções do Lambda usando vários mecanismos e serviços da AWS, incluindo o seguinte.
Amazon cloudwatch
Ele coleta várias estatísticas, como o número de solicitações, a duração das solicitações e o número de solicitações que falharam.
Amazon CloudTrail
Permite registrar, monitorar continuamente e salvar as informações de atividade da conta associadas à sua infraestrutura da AWS. Você terá uma cronologia completa das ações executadas usando o AWS Management Console, o AWS SDK, as ferramentas de linha de comando e outros serviços da AWS.
AWS X-Ray
Fornece visibilidade total de todos os estágios do processamento de solicitações em seu aplicativo com base em um mapa de seus componentes internos. Permite analisar aplicativos durante o desenvolvimento e no ambiente de produção.
AWS Config
Você poderá rastrear alterações na configuração das funções do Lambda (incluindo sua remoção) e tempos de execução, tags, nomes de manipuladores, tamanho do código, alocação de memória, configurações de latência e simultaneidade, bem como as ligações de função de tempo de execução, sub-rede e grupo de segurança do IAM do Lambda.
Conclusão
O AWS Lambda oferece um conjunto poderoso de ferramentas para criar aplicativos seguros e escaláveis. Muitos dos métodos de segurança e conformidade regulamentar do AWS Lambda não são diferentes dos usados em outros serviços da AWS, embora haja exceções. Em março de 2019, a Lambda está em conformidade com SOC 1, SOC 2, SOC 3, PCI DSS, Lei de Continuidade e Responsabilidade dos Seguros de Saúde dos EUA (HIPAA) e outros regulamentos. Portanto, quando você pensa em implementar outro aplicativo, considere o serviço AWS Lambda - talvez seja o mais adequado para sua tarefa.