O blog da AWS

Testando funções do AWS Lambda com a invocação remota do AWS SAM

Por Eric Johnson

Os desenvolvedores estão aproveitando a arquitetura orientada a eventos (EDA) para criar grandes aplicações distribuídas. Para criar essas aplicações, os desenvolvedores estão usando serviços gerenciados como AWS Lambda, AWS Step Functions e Amazon EventBridge para lidar com computação, orquestração e coreografia. Como esses serviços são executados na nuvem, os desenvolvedores também estão procurando maneiras de testar na nuvem. Com isso em mente, o AWS SAM está adicionando um novo recurso à CLI do AWS SAM chamado remote invoke (invocação remota) .

A invocação remota do AWS SAM permite que os desenvolvedores invoquem uma função Lambda na nuvem da AWS a partir de seu ambiente de desenvolvimento. O recurso tem várias opções para identificar a função Lambda a ser invocada, o payload do evento e o tipo de saída.

Usando a invocação remota

Para testar o recurso de invocação remota, criamos um pequeno aplicativo AWS SAM que possui duas funções AWS Lambda. A TranslateFunction pega uma string de texto e a traduz para a linguagem de destino usando o serviço de AI/ML Amazon Translate. A StreamFunction gera dados em um formato de streaming. Para executar essas exemplos, certifique-se de instalar a versão mais recente do AWS SAM CLI.

Para implantar o aplicativo, siga estas etapas:

  1. Clone o repositório:
    git clone https://github.com/aws-samples/aws-sam-remote-invoke-example
    Bash
  2. Mude para o diretório raiz do repositório:
    cd aws-sam-remote-invoke-example
    Bash
  3. Gere os artefatos do AWS Lambda (use a opção —use-container) para garantir que o Python 3.10 e o Node 18 estejam presentes. Se ambos estiverem configurados em sua máquina, você pode ignorar essa flag):
    sam build --use-container
    Bash
  4. Implemente a aplicação na sua conta da AWS:
    sam deploy --guided
    Bash
  5. Nomeie a aplicação como “teste remoto” e escolha all defaults.

Agora, o AWS SAM pode invocar remotamente as funções do Lambda implementadas com essa aplicação. Use o comando a seguir para testar a função TranslateFunction:

sam remote invoke --stack-name remote-test --event '{"message":"I am testing the power of remote invocation", "target-language":"es"}' TranslateFunction

Essa é uma maneira rápida de testar um pequeno evento. No entanto, os desenvolvedores geralmente lidam com payloads grandes e complexos. A função de invocação remota do AWS SAM também permite que um evento seja passado como um arquivo. Use o comando a seguir para testar:

sam remote invoke --stack-name remote-test --event-file './events/translate-event.json' TranslateFunction

Com qualquer um desses métodos, o AWS SAM retorna a resposta da função Lambda como se ela tivesse sido chamada de um serviço como o Amazon API Gateway. No entanto, o AWS SAM também oferece a capacidade de obter a resposta raw quando retornado do kit de desenvolvimento de software (SDK) do Python, boto3. Esse formato fornece informações adicionais, como a versão que você invocou, se houve tentativa de retry e muito mais. Para recuperar essa saída, execute utilizando  o parâmetro adicional —output e o valor do json.

sam remote invoke --stack-name remote-test --event '{"message": "I am testing the power of remote invocation", "target-language": "es"}' --output json TranslateFunction

Full output from SDK

Full output from SDK

Também é possível invocar funções do Lambda que não foram criadas pelo AWS SAM. Usando o nome de uma função Lambda, o AWS SAM pode invocar remotamente qualquer função Lambda que você tenha permissão para invocar. Quando você implementou a aplicação de exemplo, o AWS SAM imprimiu o nome da função Lambda no console. Use o comando a seguir para imprimir a saída novamente:

sam list stack-outputs --stack-name remote-test

Usando a saída para o TranslateFunctionName, execute:

sam remote invoke --event '{"message": "Testing direct access of the function", "target-language": "fr"}' <TranslateFunctionName>

Recentemente, o Lambda adicionou suporte a respostas de streaming de funções do Lambda. As funções de streaming não esperam até que toda a resposta esteja disponível antes de responder ao cliente. Para mostrar isso, a StreamFunction gera vários blocos de texto e os envia por um período de tempo.

Para invocar a função, execute:

sam remote invoke --stack-name remote-test StreamFunction

Estendendo a invocação remota

Os SDKs da AWS oferecem opções diferentes ao invocar funções Lambda por meio do serviço Lambda. Nos bastidores, o AWS SAM está usando o boto3 para alimentar a funcionalidade de invocação remota. Para fazer uso total das opções do SDK para invocação da função Lambda, o AWS SAM oferece uma flag —parameter que pode ser usado várias vezes.

Por exemplo, talvez você queira somente executar uma invocação dry run. Esse tipo de invocação testa a capacidade do Lambda de invocar a função com base em fatores como valores variáveis e permissões adequadas. O comando tem a seguinte aparência:

sam remote invoke --stack-name remote-test --event '{"message": "I am testing the power of remote invocation", "target-language": "es"}' --parameter InvocationType=DryRun --output json TranslateFunction

Em um segundo exemplo, quero invocar uma versão específica da função Lambda:

sam remote invoke --stack-name remote-test --event '{"message": "I am testing the power of remote invocation", "target-language": "es"}' --parameter Qualifier='$LATEST' TranslateFunction

Se você precisar das duas opções:

sam remote invoke --stack-name remote-test --event '{"message": "I am testing the power of remote invocation", "target-language": "es"}' --parameter InvocationType=DryRun --parameter Qualifier='$LATEST' --output json TranslateFunction

Logging

Ao desenvolver aplicações distribuídas, o registro em log é uma ferramenta essencial para rastrear o estado de uma solicitação em microsserviços desacoplados. O AWS SAM oferece a funcionalidade sam logs para ajudar a visualizar logs e traces agregados do Amazon CloudWatch e do AWS X-Ray, respectivamente. No entanto, ao testar funções individuais, os desenvolvedores querem registros contextuais identificados para uma invocação específica. A nova função de invocação remota fornece esses registros por padrão. Retornando à TranslateFunction, execute o seguinte comando novamente:

sam remote invoke --stack-name remote-test --event '{"message": "I am testing the power of remote invocation", "target-language": "es"}' TranslateFunction

Logging response from remote invoke

Logging response from remote invoke

A invocação remota retorna a resposta da função Lambda, qualquer registro interno da função Lambda, seguido pelo relatório final do serviço Lambda sobre a invocação em si.

Combinando a invocação remota com o AWS SAM Accelerate

Os desenvolvedores estão constantemente se esforçando para eliminar a complexidade e o atrito e melhorar a velocidade e a agilidade no pipeline de desenvolvimento. Para ajudar os desenvolvedores serverless a atingir esse objetivo, a equipe do AWS SAM lançou um recurso chamado AWS SAM Accelerate. O AWS SAM Accelerate é uma série de recursos que transferem a depuração e o teste da máquina local para a nuvem.

Para mostrar como o AWS SAM Accelerate e a invocação remota podem funcionar juntos, siga estas etapas:

  1. Em um terminal separado, inicie o processo de sincronização do AWS SAM com a opção watch:
    sam sync --stack-name remote-test --use-container --watch
  2. Em uma segunda janela ou guia, execute a função de invocação remota:
    sam remote invoke --stack-name remote-test --event-file './events/translate-event.json' TranslateFunction

A combinação dessas duas opções fornece um ambiente robusto de implementação e teste automáticos. Durante as iterações do código na função Lambda, sempre que você salva o arquivo, o AWS SAM sincroniza o código e todas as dependências com a nuvem. Conforme necessário, a invocação remota é então executada para verificar se o código funciona conforme o esperado, com o log fornecido para cada execução.

Conclusão

Os desenvolvedores serverless estão procurando a maneira mais eficiente de testar seus aplicativos na nuvem da AWS. Eles querem invocar uma função AWS Lambda rapidamente sem precisar simular segurança, serviços externos ou outras variáveis de ambiente. Este blog mostra como usar o novo recurso de invocação remota do AWS SAM para fazer exatamente isso.

Esta postagem mostra como invocar a função Lambda, alterar o tipo e a localização payload e alterar o formato de saída. Ele explica o uso desse recurso em conjunto com os recursos do AWS SAM Accelerate para simplificar o processo de desenvolvimento e teste serverless.

Para obter mais recursos de aprendizado serverless, visite Serverless Land.

Este blog é uma tradução do conteúdo original em inglês (link aqui).

Biografia do Autor

Eric Johnson, Principal Developer Advocate na AWS.

Biografia do Tradutor

Rodrigo Peres é Arquiteto de Soluções na AWS, com mais de 20 anos de experiência trabalhando com arquitetura de soluções, desenvolvimento de sistemas e modernização de sistemas legados.

Biografia do Revisor

Daniel Abib é arquiteto de soluções sênior 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/