O blog da AWS

Usando o AWS Lambda SnapStart com infraestrutura como código e pipelines de CI/CD

Por Michele Ricciardi é arquiteta especialista em soluções da DevAx
O AWS Lambda SnapStart permite que os clientes reduzam os “cold starts” (inicialização a frio do serviço Lambda) armazenando em cache um snapshot criptografado de uma função Lambda iniciada e reutilizando esse snapshot para invocações subsequentes.Este blog post descreve com mais detalhes como habilitar o SnapStart com diferentes infraestruturas como ferramentas de código: AWS Serverless Application Model (AWS SAM), AWS CloudFormation e Terraform. Ele mostra o que acontece durante uma implantação do Lambda quando o SnapStart está ativado, bem como as melhores práticas a serem aplicadas em 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:

  UnicornStockBrokerFunctionVersion1:
    Type: AWS::Lambda::Version
    Properties:
      FunctionName: !Ref 'UnicornStockBrokerFunction'

YAML

2. Para implantar uma nova versão da função Lambda com o CloudFormation, altere o nome do recurso de UnicornStockBrokerFunctionVersion1 para UnicornStockBrokerFunctionVersion2.Ative o controle de versão do Lambda adicionando um tipo de recurso AWS: :Lambda: :Version:

3. Crie um alias do Lambda usando o tipo de recurso AWS: :Lambda: :Alias:

UnicornStockBrokerFunctionAliasSnapStart:
  Type: AWS::Lambda::Alias
  Properties:
    Name: SnapStart
    FunctionName: !Ref 'UnicornStockBrokerFunction'
    FunctionVersion: !GetAtt 'UnicornStockBrokerFunctionVersion.Version'
YAML

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:

ServerlessRestApi:
  Type: AWS::ApiGateway::RestApi
  Properties:
    Body:
      paths:
        /transactions:
          post:
            x-amazon-apigateway-integration:
              [..]
              uri: !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${UnicornStockBrokerFunctionAliasSnapStart}/invocations'
YAML

5. Modifique as permissões do IAM para permitir que o API Gateway invoque o alias do Lambda especificado:

UnicornStockBrokerFunctionUnicornStockBrokerEventPermissionProd:
  Type: AWS::Lambda::Permission
  Properties:
    [..]
    FunctionName: !Ref UnicornStockBrokerFunctionAliasSnapStart
YAML

6. Ative o SnapStart na função Lambda:

UnicornStockBrokerFunction:
  Type: AWS::Lambda::Function
  Properties:
    [..]
    SnapStart:
      ApplyOn: PublishedVersions
YAML

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:

  1. 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:
  UnicornStockBrokerFunction:
    Type: AWS::Serverless::Function
    Properties: 
      [..]
      AutoPublishAlias: SnapStart
YAML

2. Ative o SnapStart na função Lambda:

UnicornStockBrokerFunction:
  Type: AWS::Serverless::Function
  Properties:
    [..]
    SnapStart:
      ApplyOn: PublishedVersions
YAML

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:

  1. Ative o controle de versão do Lambda adicionando uma propriedade aws_lambda_function do recurso
resource "aws_lambda_function" "UnicornStockBrokerFunction" {
  [...]
  publish = true
}
Terraform

2. Crie um alias Lambda adicionando um recurso aws_lambda_alias:

resource "aws_lambda_alias" "UnicornStockBrokerFunction_SnapStartAlias" {
  name             = "SnapStart"
  description      = "Alias for SnapStart"
  function_name    = aws_lambda_function.UnicornStockBrokerFunction.function_name
  function_version = aws_lambda_function.UnicornStockBrokerFunction.version
}
Terraform

3. Atualize o API Gateway para invocar o alias da função Lambda, em vez de usar um ARN não qualificado:

SnapshotFunction:
resource "aws_api_gateway_integration" "createproduct-lambda" {
  [...]
  uri = aws_lambda_alias.UnicornStockBrokerFunction_SnapStartAlias.invoke_arn
}
Terraform

4. Modifique a uri no aws_lambda_permission para permitir que o API Gateway invoque o alias Lambda especificado:

resource "aws_lambda_permission" "apigw-CreateProductHandler" {
  [...]
  qualifier = aws_lambda_alias.UnicornStockBrokerFunction_SnapStartAlias.name
}
Terraform

5. Ative o Lambda SnapStart adicionando um argumento snap_start ao recurso aws_lambda_function:

resource "aws_lambda_function" "UnicornStockBrokerFunction" {
  [...]
  snap_start {
    apply_on ="PublishedVersions"
  }
}
Terraform

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:

Lambda deployment phases

Depois de habilitar as versões do Lambda, o alias do Lambda e o Lambda SnapStart, há mais etapas para a implantação:

Phases with versions, alias and SnapStart

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:

  1. 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.

 

  1. 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.

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre o autor

Michele Ricciardi é arquiteta especialista em soluções da DevAx

 

 

 

 

Tradutor

Daniel Abib é Enterprise Solution Architect na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

https://www.linkedin.com/in/danielabib/