O blog da AWS
Usando o AWS Lambda SnapStart com infraestrutura como código e pipelines de CI/CD
O Snapstart pode reduzir significativamente os tempos de inicialização a frio (cold start) das funções do Lambda escritas em Java. O exemplo descrito na postagem do blog de lançamento reduz a duração da inicialização a frio de mais de 6 segundos para menos de 200 ms.
Usando o SnapStart
Você ativa o recurso SnapStart por meio de uma configuração do Lambda. No entanto, há etapas adicionais para usar o recurso SnapStart.
Ativar versões da função Lambda
O SnapStart funciona em conjunto com as versões da função Lambda. Ele inicializa a função quando você publica uma nova versão da função Lambda. Portanto, você deve habilitar as versões do Lambda para usar o SnapStart. Para obter mais informações, leia o Lambda Developer Guide.
Opcionalmente, crie um alias de função Lambda
Um alias de função Lambda permite definir um ponteiro personalizado e controlar a qual versão do Lambda ele está anexado. Embora isso seja opcional, criar um alias de função Lambda facilita as operações de gerenciamento. Você pode alterar a versão do Lambda vinculada a um alias do Lambda sem modificar os aplicativos usando a função Lambda.
Modifique o aplicativo ou o serviço da AWS invocando a função Lambda
Depois de ter uma versão do Lambda pronta para o SnapStart, você deve alterar o mecanismo que invoca a função Lambda para usar um ARN qualificado do Lambda. Isso pode invocar diretamente a versão específica do Lambda ou invocar o alias do Lambda, que aponta para a versão correta do Lambda.
Se você não modificar o mecanismo que invoca a função Lambda ou usar um ARN não qualificado, não poderá aproveitar as otimizações fornecidas pelo SnapStart.
Usando o SnapStart com infraestrutura como código
AWS CloudFormation
O UnicornStockBroker é um exemplo de aplicativo Serverless. Esse aplicativo é composto por um endpoint do Amazon API Gateway, uma função Java Lambda e uma tabela do Amazon DynamoDB. Encontre o modelo do CloudFormation sem o SnapStart neste repositório do GitHub.
Para ativar o SnapStart:
4. Atualize o API Gateway para invocar o alias da função Lambda, em vez de usar um ARN não qualificado. Isso garante que o API Gateway invoque o alias Lambda especificado:
5. Modifique as permissões do IAM para permitir que o API Gateway invoque o alias do Lambda especificado:
6. Ative o SnapStart na função Lambda:
Depois dessas atualizações, o template do CloudFormation com o SnapStart ativado fica assim. Você pode implantar o aplicativo de amostra e aproveitar as vantagens do SnapStart.
AWS SAM
Você pode encontrar o modelo do AWS SAM sem o SnapStart aqui. Para habilitar o Lambda SnapStart:
- Ative as versões do Lambda e crie um alias do Lambda adicionando uma propriedade autopublishAlias. O AWS SAM publica automaticamente uma nova versão da função do Lambda para cada nova implantação e atribui automaticamente o alias do Lambda à nova versão publicada:
2. Ative o SnapStart na função Lambda:
Este exemplo usa o recurso AWS::Serverless::Function com a propriedade autoPublishAlias. O AWS SAM cria implicitamente um Amazon API Gateway com as permissões e a configuração corretas para invocar a função Lambda usando o alias Lambda declarado.
Você pode ver o modelo modificado do AWS SAM aqui. Você pode implantar o aplicativo de amostra com o AWS SAM e aproveitar as vantagens do SnapStart.
Terraform
Você pode encontrar o modelo do Terraform sem o SnapStart aqui. Para habilitar o Lambda SnapStart usando o Terraform da HashiCorp:
- Ative o controle de versão do Lambda adicionando uma propriedade
aws_lambda_function
do recurso
2. Crie um alias Lambda adicionando um recurso aws_lambda_alias:
3. Atualize o API Gateway para invocar o alias da função Lambda, em vez de usar um ARN não qualificado:
4. Modifique a uri no aws_lambda_permission
para permitir que o API Gateway invoque o alias Lambda especificado:
5. Ative o Lambda SnapStart adicionando um argumento snap_start ao recurso aws_lambda_function:
Você pode ver o template modificado do Terraform aqui. Você pode implantar o aplicativo de exemplo com o Terraform e aproveitar as vantagens do SnapStart.
Como a implantação muda com o SnapStart?
Esta seção descreve como a implantação muda após a ativação do Lambda SnapStart.
Antes de adicionar versões do Lambda, alias do Lambda e SnapStart, esse é o processo de publicação de um novo código em uma função:
Depois de habilitar as versões do Lambda, o alias do Lambda e o Lambda SnapStart, há mais etapas para a implantação:
Durante a implantação de uma versão do Lambda, o Lambda cria um novo ambiente de execução e o inicializa com o novo código. Depois que o código é inicializado, o Lambda faz um snapshot (foto) do código inicializado. A implantação agora leva mais tempo do que sem o snapshot, pois leva mais tempo para inicializar o ambiente de execução e criar o snapshot da função inicializada.
Enquanto a nova versão do Lambda está sendo criada, o alias do Lambda permanece inalterado e invoca a versão anterior do Lambda quando chamado. O aplicativo não tem conhecimento da implantação; portanto, o tempo adicional de implantação não afeta os aplicativos.
Quando a nova versão da função estiver pronta, você poderá atualizar o alias do Lambda para apontar para a nova versão do Lambda (isso é feito automaticamente nos exemplos anteriores do IaC).
Ao usar um alias do Lambda, você não precisa direcionar todas as invocações do Lambda para a versão mais recente. Você pode usar a configuração de roteamento do Alias para transferir gradualmente o tráfego para a nova versão do Lambda, oferecendo uma maneira mais fácil de testar novas versões do Lambda gradualmente e revertê-las em caso de problemas com a versão mais recente.
Há um modo de falha adicional com essa implantação. A inicialização de uma nova versão do Lambda pode falhar em caso de erros no código. Por exemplo, o Lambda não inicializa seu código se houver uma exceção não tratada durante a fase de inicialização. Esse é um modo de falha adicional que você deve manipular no ciclo de implantação.
Considerações sobre CI/CD
Implantações mais longas
A primeira consideração é que habilitar o Lambda SnapStart aumenta o tempo de implantação.
Quando seu pipeline de CI/CD implanta uma nova versão do Lambda habilitada para SnapStart, o Lambda inicializa um novo ambiente de execução e tira um snapshot da memória e do disco do código inicializado. Isso leva tempo e sua latência dependeria do tempo de inicialização da função Lambda e do tamanho geral do snapshot.
Esse atraso adicional pode ser significativo para pipelines de CI/CD com grande número de funções Lambda. Portanto, se você tiver um aplicativo com várias funções do Lambda, ative o Lambda SnapStart nas funções do Lambda gradualmente e ajuste o tempo limite do pipeline de CI/CD adequadamente.
Modos de falha de implantação
Com o Lambda SnapStart, há um modo de falha adicional que você precisaria manipular em seu pipeline de CI/CD.
Conforme descrito anteriormente, durante a criação da nova versão do Lambda, pode haver falhas vinculadas à inicialização do código do Lambda. Esse cenário de falha adicional pode ser gerenciado de duas maneiras:
- Adicione uma etapa de teste em seu pipeline de CI/CD.
Você pode adicionar uma etapa de teste para validar se a função foi inicializada com êxito. Essa etapa de teste pode incluir a execução da função Lambda localmente, com o SAM local, ou a execução de testes locais usando a biblioteca Lambda Java Test.
- Implante a função Lambda em um ambiente de teste com o SnapStart ativado.
Uma verificação adicional para detectar problemas precocemente é implantar sua função Lambda em um ambiente de teste com o SnapStart ativado. Ao implantar suas funções do Lambda com o SnapStart em um ambiente de teste, você pode detectar problemas no início do ciclo de desenvolvimento e executar testes adicionais completos e testes de desempenho.
Conclusão
Este blog mostra as etapas necessárias para aproveitar o Lambda SnapStart, com exemplos para AWS CloudFormation, AWS SAM e Terraform.
Quando você usa o recurso, há etapas adicionais que o Lambda executa durante a implantação. O Lambda inicializa uma nova versão do Lambda com o novo código e tira um instantâneo. Essa operação leva tempo e pode falhar se a inicialização do código falhar, portanto, talvez seja necessário fazer ajustes no pipeline de CI/CD para lidar com esses cenários.
Se quiser saber mais sobre o recurso Lambda SnapStart, leia mais no Guia do desenvolvedor do AWS Lambda ou visite nosso workshop sobre Java no AWS Lambda. Para ler mais sobre esse e outros recursos, visite Serverless Land.