AWS Lambda
Guia do desenvolvedor

Melhores práticas para trabalhar com funções do AWS Lambda

As melhores práticas a seguir são recomendadas para usar o AWS Lambda:

Código da função

  • Separe o manipulador do Lambda da lógica central. Isso permite que você crie uma função mais fácil para teste de unidade. No Node.js isso pode ser semelhante a:

    exports.myHandler = function(event, context, callback) { var foo = event.foo; var bar = event.bar; var result = MyLambdaFunction (foo, bar); callback(null, result); } function MyLambdaFunction (foo, bar) { // MyLambdaFunction logic here }
  • Aproveite a reutilização do contexto de execução para melhorar o desempenho de sua função. Inicialize clientes SDK e conexões de banco de dados fora do manipulador de funções e armazene em cache os ativos estáticos localmente no diretório /tmp. As invocações subsequentes processadas pela mesma instância da função podem reutilizar esses recursos. Isso economiza tempo de execução e custo.

    Para evitar possíveis vazamentos de dados entre chamadas, não use o contexto de execução para armazenar dados do usuário, eventos ou outras informações com implicações de segurança. Se sua função depende de um estado mutável que não pode ser armazenado na memória dentro do manipulador, considere criar uma função separada ou versões separadas de uma função para cada usuário.

  • Use Variáveis de ambiente do AWS Lambda para transmitir parâmetros operacionais para sua função. Por exemplo, se estiver gravando em um bucket do Amazon S3, em vez fixar no código o nome do bucket em que você está gravando, configure o nome do bucket como uma variável de ambiente.

  • Controle as dependências em seu pacote de implantação da função. O ambiente de execução do AWS Lambda contém várias bibliotecas, como o AWS SDK para Node.js e os tempos de execução do Python (uma lista completa pode ser encontrada aqui: Tempo de execução do AWS Lambda). Para habilitar o conjunto de recursos e atualizações de segurança mais recente, o Lambda atualizará periodicamente essas bibliotecas. Essas atualizações podem introduzir alterações sutis ao comportamento de sua função do Lambda. Para ter controle total das dependências usadas por sua função, empacote todas as dependências em seu pacote de implantação.

  • Minimize o tamanho do pacote de implantação para as necessidades de seu tempo de execução. Isso reduzirá a quantidade de tempo necessária para que seu pacote de implantação seja obtido por download e desempacotado antes da invocação. Para funções criadas em Java ou .NET Core, evite fazer upload da biblioteca inteira de AWS SDK como parte de seu pacote de implantação. Em vez disso, dependa seletivamente dos módulos que coletam os componentes do SDK necessário (por exemplo, módulos do SDK do DynamoDB, do Amazon S3 e bibliotecas principais do Lambda).

  • Reduza o tempo necessário para o Lambda desempacotar pacotes de implantação criados em Java colocando seus arquivos .jar de dependências em um diretório lib/separado. Isso é mais rápido do que colocar todo o código de sua função em um único jar com um grande número de arquivos .class. Consulte Pacote de implantação do AWS Lambda no Java para obter instruções.

  • Minimize a complexidade de suas dependências. Prefira estruturas mais simples que sejam carregadas rapidamente na inicialização do contexto de execução. Por exemplo, prefira estruturas de injeção de dependência Java (IoC) mais simples, como Dagger ou Guice, em vez de estruturas mais complexas, como a Spring Framework.

  • Evite usar código recursivo em sua função do Lambda, em que a função chame a si mesma automaticamente até que alguns critérios arbitrários sejam atendidos. Isso pode levar a um volume não intencional de invocações da função e a custos elevados. Se você fizer isso acidentalmente, defina o limite de execução simultânea da função como 0 imediatamente para limitar todas as invocações para a função, enquanto você atualiza o código.

Configuração da função

  • Os testes de desempenho de sua função Lambda são uma parte essencial para garantir que você escolha a configuração do tamanho da memória ideal. Qualquer aumento no tamanho da memória dispara um aumento equivalente na CPU disponível para sua função. O uso de memória para sua função é determinado por invocação e pode ser visualizado nos AWS CloudWatch Logs. Em cada invocação, será feita uma entrada de REPORT:, conforme mostrado a seguir:

    REPORT RequestId: 3604209a-e9a3-11e6-939a-754dd98c7be3 Duration: 12.34 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 18 MB

    Ao analisar o campo Max Memory Used:, você poderá determinar se a função precisa de mais memória ou se você provisionou excessivamente o tamanho da memória de sua função.

  • Teste a carga de sua função Lambda para determinar um valor de tempo limite ideal. É importante analisar por quanto tempo sua função é executada para que você possa determinar melhor qualquer problema com um serviço de dependência que possa aumentar a simultaneidade da função além do que você espera. Isso é importante, principalmente quando sua função Lambda faz chamadas de rede para recursos que não podem lidar com a escalabilidade do Lambda.

  • Use permissões mais restritivas ao definir políticas do IAM. Compreenda os recursos e operações necessários para sua função Lambda e limite a função de execução a essas permissões. Para obter mais informações, consulte Permissões do AWS Lambda.

  • Familiarize-se com o Limites do AWS Lambda. O tamanho da carga, os descritores de arquivos e o espaço /tmp geralmente são ignorados ao determinar os limites de recursos de tempo de execução.

  • Exclua as funções Lambda que você não está mais usando. Fazendo isso, as funções não utilizadas não serão contadas desnecessariamente em relação ao limite do tamanho do pacote de implantação.

  • Se você estiver usando o Amazon Simple Queue Service como uma origem do evento, certifique-se de que o valor de tempo de execução esperado para a função não exceda o valor do Tempo limite de visibilidade na fila. Isso se aplica ao CreateFunction e ao UpdateFunctionConfiguration.

    • No caso de CreateFunction, o AWS Lambda fará com que haja falha no processo de criação da função.

    • No caso de UpdateFunctionConfiguration, isso pode resultar em invocações duplicadas da função.

Geração de alarmes e métricas

  • Use Métricas do AWS Lambda e Alarmes do CloudWatch, em vez de criar ou atualizar uma métrica em seu código da função Lambda. É uma forma muito mais eficiente de monitorar a integridade de suas funções Lambda permitindo detectar problemas no início do processo de desenvolvimento. Por exemplo, você pode configurar um alarme com base na duração esperada do tempo de execução da função Lambda para lidar com gargalos ou latências atribuíveis ao código da função.

  • Utilize sua biblioteca de logs e as Métricas e dimensões do AWS Lambda para detectar erros de aplicativo (por exemplo, ERR, ERROR, WARNING etc.)

Invocações de eventos de fluxo

  • Teste com diferentes tamanhos de lotes e de registros para que a frequência de sondagem de cada origem de evento seja ajustada para a rapidez com que a função pode concluir sua tarefa. BatchSize controla o número máximo de registros que podem ser enviados para sua função a cada invocação. Um tamanho de lote maior geralmente absorve de maneira mais eficiente a sobrecarga da invocação em um conjunto maior de registros aumentando a taxa de transferência.

    Por padrão, o Lambda invoca sua função assim que os registros estão disponíveis no fluxo. Se o lote que ele ler do fluxo tiver somente um registro, o Lambda enviará apenas um registro à função. Para evitar invocar a função com um número pequeno de registros, você pode dizer à origem dos eventos para fazer o buffer dos registros por até cinco minutos, configurando uma janela de lote. Antes de invocar a função, o Lambda continua lendo os registros do fluxo até reunir um lote completo ou até a janela do lote expirar.

  • Aumente a taxa de transferência de processamento de fluxos do Kinesis adicionando estilhaços. Um fluxo do Kinesis é composto de um ou mais estilhaços. O Lambda sondará cada estilhaço com, no máximo, uma invocação simultânea. Por exemplo, se o seu fluxo tiver 100 estilhaços ativos, haverá, no máximo, 100 invocações de função Lambda em execução simultaneamente. O aumento do número de estilhaços aumentará diretamente o número máximo de invocações simultâneas de função Lambda e poderá aumentar a taxa de processamento de fluxos do Kinesis. Se você estiver aumentando o número de estilhaços em um fluxo do Kinesis, certifique-se de ter escolhido uma boa chave de partição (consulte Chaves de partição) para seus dados, para que os registros relacionados terminem nos mesmos estilhaços e seus dados sejam bem distribuídos.

  • Use o Amazon CloudWatch no IteratorAge para determinar se seu fluxo do Kinesis está sendo processado. Por exemplo, configure um alarme do CloudWatch com uma configuração máxima de 30000 (30 segundos).