top of page
Foto do escritorRan Isenberg

Melhores práticas de camadas do AWS Lambda


camadas

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 que consistem em 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 princípios básicos das camadas do AWS Lambda, os prós e contras e minhas práticas recomendadas.

Minhapostagem anterior forneceu detalhes técnicos e exemplos de código sobre como construir uma camada Lambda com o AWS CDK em Python.

 

Como construir funções AWS Lambda com dependências externas

Ao criar uma função do AWS Lambda, você precisa fornecer o código do manipulador e seus módulos internos (camada lógica, manipuladores de banco de dados, etc.). No entanto, mais frequentemente do que nunca, seu código depende de dependências externas. Quando sua função do Lambda é executada, ela é executada em uma imagem base de contêiner da AWS. A imagem de contêiner fornecida pela AWS pode não conter todas as suas dependências externas. Nesse caso, você precisa fornecê-las você mesmo.

Você tem quatro opções:

  1. Crie e carregue uma imagem de contêiner Lambda que você mesmo cria, que inclui código de manipulador e todas as dependências externas e carregue-a no repositório Amazon ECR. Veja meu blog anterior sobre o assunto .

  2. Crie e carregue um arquivo ZIP contendo todo o código Lambda e as dependências externas por função AWS Lambda. Veja exemplos de código aqui .

  3. Crie e carregue um arquivo ZIP contendo dependências externas como uma camada AWS Lambda. Veja exemplos de código e explicações técnicas aqui .

  4. Use um ARN de camada Lambda existente que contenha as dependências externas. Veja o exemplo no final do meupost anterior.

Embora as opções um e dois sejam soluções razoáveis, gostaria de me concentrar nas opções três e quatro, pois elas oferecem uma oportunidade única de otimização para seu aplicativo sem servidor.

 

teoria vs prática

Vamos supor que seu aplicativo sem servidor tenha dez funções do AWS Lambda e que suas dependências externas pesem cerca de 50 megabytes.

Além disso, todas as dependências externas são compartilhadas entre todas as 10 funções do Lambda.


Agora, vamos relembrar as quatro opções que temos para carregar as dependências na AWS.

Na opção um, você precisa criar um arquivo docker-compose por função Lambda, cada um com suas dependências, ponto de entrada e CMD. É outro recurso que você mantém, carrega no AWS ECR e paga por seu armazenamento.

O ponto principal é que, a menos que você consuma dependências que tenham um tamanho descompactado maior que 250 MB, não vejo nenhuma vantagem nesse mecanismo.


Na opção dois, que é a mais comum, criamos um arquivo ZIP por função Lambda. O AWS CDK faz isso nativamente usando um contêiner Docker builder que cria o arquivo ZIP.

Esses arquivos ZIP são carregados na sua conta da AWS como ativos do AWS S3.

No entanto, como todas as dez funções compartilham as mesmas dependências, o Docker agrupará as mesmas dependências, pesando cerca de 50 MB nas 10 funções Lambda.

São 500 MB das mesmas dependências sendo carregadas.

Esse é um tempo extra para implantar. Supondo que você faça isso por ambiente; dev, test, stage, production, pode levar até minutos, dependendo da velocidade da sua internet.


E se houvesse uma maneira de carregar essas dependências apenas uma vez e acelerar o tempo geral de implantação?

É aí que as camadas Lambda entram em ação.

 

Prós das camadas AWS Lambda


As camadas do AWS Lambda são carregadas uma vez e podem ser usadas por diversas funções do Lambda.

Agora, vamos relembrar o caso de uso anterior, em que suas funções do Lambda tinham dependências compartilhadas somando 50 MB.

Vamos supor que você crie uma camada a partir dessas dependências e configure suas funções Lambda para usá-la.


Com esse caso de uso em mente, vamos resumir as vantagens que você obtém ao criar a camada Lambda:

  1. Reduza o tamanho do arquivo ZIP da função Lambda. Cada arquivo ZIP Lambda contém código de manipulador e módulos internos, mas nenhuma dependência externa.

  2. Reduza o tempo geral para produção - cada arquivo ZIP lambda é menor e leva menos tempo para carregar. Multiplique pelo número de funções Lambda vezes o número de contas AWS (dev, teste, produção) e você verá um tempo muito menor para implantar da conta dev para a produção. Já vi casos em que vários minutos foram perdidos do tempo total de implantação.

  3. Você pode ver e editar o código da função Lambda no console AWS - Um efeito colateral legal. Ao abrir a seção de código da função AWS Lambda, você pode visualizar o código se o tamanho do arquivo ZIP for menor que 3 MB (de acordo com os limites do editor de console ).


Ver código fonte sem dependências
Ver código fonte sem dependências

 

Contras das camadas AWS Lambda

Vamos analisar as desvantagens das camadas Lambda:

  1. Controle de versão - as camadas são versionadas e sua função sempre consome uma versão específica.

  2. Você pode consumir até 5 camadas Lambda em uma função Lambda.

  3. O tamanho total descompactado da função e de todas as camadas não pode exceder a cota de tamanho do pacote de implantação descompactado de 250 MB. https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html.

  4. Você pode usar uma camada construída externamente, ou seja, camadas consumidas como ARNs e não construídas no mesmo projeto. No entanto, elas introduzem desafios adicionais:

    1. Elas são mais difíceis de consumir e compartilhar - Você pode usar camadas criadas e implantadas em uma conta diferente. O compartilhamento é mais complicado entre contas da AWS e, no final, você depende de um ARN externo que você inclui no seu código.

    2. Atualizações manuais - As camadas são versionadas. A versão faz parte do ARN. Você precisa estar ciente de que há uma nova versão e ir manualmente e alterar a versão para a versão mais recente. As camadas Lambda não têm um gerenciador de pacotes como Python e outras linguagens têm. As atualizações, como resultado, tornam-se um esforço manual.

    3. Configurar um ambiente de desenvolvedor local é difícil - você precisa descobrir quais dependências externas as camadas trazem e instalá-las localmente para testar seu código e depurar no IDE. Isso pode ser desafiador, especialmente em casos em que há conflitos. Uma discrepância entre o desenvolvedor local e os ambientes de função do Lambda pode levar a travamentos e bugs.

    4. Segurança. Usar camadas como um ARN externo pode expor você a um risco de segurança, pois você nunca tem certeza do que está empacotado na camada. Certifique-se de usar o AWS Inspector para mitigar essa vulnerabilidade.

 

Melhores práticas de camadas do AWS Lambda


Não use camadas com ARN externo

Como visto no segmento de desvantagens anterior na seção 4, as camadas externas têm muitas desvantagens que as tornam irrelevantes e não valem a pena.

Isso me leva a uma resolução aparente: construa você mesmo!


Use camadas AWS Lambda como otimização de implantação

A principal lição é que você deve usar camadas do AWS Lambda como otimização de implantação e criá-las no mesmo repositório de código que usa a camada.

Deixe o gerenciamento de dependências e o controle de versão para os gerenciadores de pacotes apropriados, ou seja, em Python, use pip ou poetry e use camadas como uma otimização de implantação.


Construir a camada no mesmo repositório que a usa diminuirá os números de contras 1 e 4 da camada lambda. As funções Lambda sempre usarão a versão mais recente automaticamente, e toda vez que você atualizar as dependências, uma nova camada será criada. Além disso, o ambiente do desenvolvedor sempre refletirá as mesmas dependências que sua camada agrupa, já que elas são feitas da mesma versão de dependências.


Camadas múltiplas

Você deve criar várias camadas no mesmo serviço?

Eu argumentaria contra isso, pois traz mais complexidade e aumenta o tempo de implantação.

Sugiro dividir as dependências em várias camadas somente se uma função exigir um pacote drasticamente maior (o que aumenta a inicialização a frio); caso contrário, use seu julgamento e analise o impacto da inicialização a frio com/sem a dependência extra.

Você pode usar os recursos de rastreamento do AWS X-Ray; leia mais aqui .

Segurança

E, por último, segurança. Se você ainda for obrigado a usar camadas Lambda pelo ARN, certifique-se de habilitar o inspetor AWS em sua função e camadas Lambda.

O AWS Inspector verificará suas camadas em busca de vulnerabilidades e notificará você se for necessário tomar alguma medida.

Clique aqui para mais detalhes.

 

Exemplo de AWS CDK

Quer aprender como criar camadas Lambda com o AWS CDK? Confira meupost anterior no blog.


Você está interessado em um projeto CDK Serverless totalmente funcional que usa camadas Lambda?

Confira meu projeto de modelo de código aberto: https://github.com/ran-isenberg/aws-lambda-handler-cookbook




bottom of page