As camadas do AWS Lambda foram um divisor de águas para mim. Quando usadas corretamente, elas podem reduzir o tempo de implantação drasticamente e, por sua vez, reduzir o tempo de produção em serviços Serverless com múltiplas funções do AWS Lambda.
No entanto, muitas vezes é um recurso mal compreendido e, eventualmente, não utilizado.
Esta postagem do blog aborda os conceitos básicos das camadas do AWS Lambda e como criá-las com Docker e AWS CDK em Python.
Um código completo e funcional pode ser encontrado no meu projeto de modelo de código aberto: https://github.com/ran-isenberg/aws-lambda-handler-cookbook
O que é uma camada Lambda
As camadas do AWS Lambda fornecem uma maneira conveniente de empacotar bibliotecas e outras dependências que você pode usar com diversas funções do Lambda.
Uma camada é um arquivo .zip que pode conter código ou dados adicionais. Uma camada pode conter bibliotecas, um tempo de execução personalizado , dados ou arquivos de configuração. As camadas promovem o compartilhamento de código e a separação de responsabilidades para que você possa iterar mais rápido na escrita de lógica de negócios -AWS
Crie uma camada com AWS CDK e Docker em Python com Poetry
Vamos supor que nosso projeto de serviço Serverless use 'poetry' para gerenciamento de dependências e que o arquivo pyproject.toml se pareça com isto:
Nosso Objetivo
Queremos agrupar o AWS Lambda Powertools, mypy-boto3-dynamodb e outras bibliotecas na seção [tools.poetry.dependencies] em uma camada Lambda para ser consumida por todas as nossas funções lambda e implantada com o AWS CDK.
Suposições
Você instalou o Docker.
Você instalou o AWS CDK.
Você usa poesia como seu gerenciador de dependências Python.
Você usa apenas um arquivo geral pyproject.toml para todas as funções do AWS Lambda. Ele inclui todos os requisitos de todas as funções.
Preparar uma pasta .build para implantação do CDK
Antes de escrever qualquer código CDK, precisamos preparar a pasta de construção da camada.
Armazenaremos todos os artefatos de build necessários em uma nova pasta: a pasta '.build', que não fará parte da base de código. Manteremos uma pasta para os artefatos das camadas do Lambda e outra pasta que contém o código da função do serviço Lambda, pronto para ser empacotado pelo AWS CDK.
Vamos começar com a camada.
Primeiro, precisamos criar um arquivo requirements.txt do nosso pyproject.toml que será usado para criar a camada em si. Neste exemplo, usamos poetry, mas pipenv também é uma opção válida.
Geramos um requirements.txt a partir da seção [tool . poetry . dependencies] do arquivo toml.
Diferentemente da seção [tool . poetry . dev-dependencies] no toml, as bibliotecas na seção [tool . poetry . dependencies] são as bibliotecas que as funções do Lambda no projeto exigem em tempo de execução e devem ser carregadas na AWS.
Execute os seguintes comandos para criar a pasta .build/common_layer e gerar o arquivo layer requirements.txt dentro dela. Conforme mencionado acima, esses arquivos não fazem parte da base de código e usamos a pasta .build para armazenar artefatos personalizados de build & deploy.
O comando poetry exportará as dependências não relacionadas ao desenvolvimento para o arquivo requirements.txt.
Os comandos produzem o seguinte arquivo requirements.txt na pasta '.build/common_layer'. O nome 'common_layer' representa o propósito da camada, a camada Lambda de uso comum em nosso serviço que todas as funções usam.
Agora, preparamos a pasta .build das funções Lambda do serviço Serverless.
Podemos fazer isso executando os seguintes comandos:
Em nosso projeto, o código dos manipuladores de funções do Lambda reside na pasta raiz do projeto, na pasta 'service'. Antes de implantarmos as funções do Lambda na AWS, copiamos a pasta 'service' para a pasta '.build/lambdas', que será compactada como um zip e carregada no AWS S3 pelo código do CDK. O código do CDK que cria as funções do Lambda pegará o código do manipulador do Lambda da pasta '.build/lambdas'.
Fazemos isso para preservar a hierarquia de importação no AWS CDK e no ambiente do contêiner de função do Lambda após sua implantação na AWS e para evitar problemas de importação em tempo de execução, como:
Este erro ocorre ao compilar a função sem copiá-la primeiro para .build/lambdas, mas copiando o código diretamente da pasta 'service' no nível raiz.
Código AWS CDK
Agora que tudo está no lugar, vamos escrever uma construção CDK que cria uma camada Lambda com base no arquivo requirements.txt pré-criado e uma função Lambda no Python 3.9 que usa a camada.
O AWS CDK criará um contêiner do construtor de camadas do Lambda usando o Docker.
O contêiner procurará um arquivo requirements.txt, baixará todas as bibliotecas necessárias, compactará-las e fará o upload para a AWS.
Depois que o objeto de camada for criado, você poderá adicioná-lo a qualquer função do Lambda.
A construção do AWS CDK 'MyConstruct' cria:
Função básica do Lambda (linhas 17-25).
Camada Lambda (linhas 27-34). O CDK procura um arquivo requirements.txt na pasta de entrada ('.build/common_layer') e usa o Python 3.9 como compatibilidade de tempo de execução.
Função lambda (linhas 36-46). A função usa a camada na linha 45 que recebe como argumento. O código do manipulador e outros módulos são retirados da pasta de código '.build/lambdas.'
Hora de implantar!
Agora podemos executar o CDK deploy e aguardar enquanto os recursos são criados.
Executamos o comando CDK deploy (e o apontamos para o arquivo app.py no projeto) combinado com os comandos anteriores que criam as pastas .build.
No AWS Lambda handler cookbook Serverless template project , usamos um makefile para abstrair tais detalhes. Executar 'make deploy' executará esses três comandos juntos.
Veja o makefile aqui .
Usar camada ARN externa
Se você deseja usar uma camada Lambda criada externamente, você pode trocar a implementação '_build_common_layer' para o seguinte:
Neste caso, construímos uma camada pública criada pela incrível equipe do AWS Lambda Powertools.
Observe como selecionamos uma versão específica (17) como parte do ARN.
Fique ligado na minha próxima postagem do blog, onde apresento as melhores práticas da camada AWS Lambda.
Comments