AWS Serverless: Vale a pena importar o AWS SDK?

Resultando em Lambdas menores em tamanho final

Se você não está familiarizado com o início frio (cold start) no contexto do AWS Lambda, leia esta postagem primeiro.

Atualização 24/03/2019: Os testes agora incluem o serverless-webpack.

Quando uma função Lambda do Node.js é iniciada a frio (cold start), várias coisas acontecem:

Se você ativar o rastreamento para uma função Lambda, poderá ver quanto tempo é gasto nessas etapas no X-Ray. Infelizmente, o tempo necessário para inicializar o contêiner e o tempo de execução do Node.js não são registrados como segmentos. Mas você pode calcular a diferença de durações.

Abaixo, o Initialization refere-se ao tempo necessário para inicializar o módulo/manipulador:

O rastreamento acima é para a função abaixo, que requer o AWS SDK e nada mais. Como você pode ver, este simples require adicionou 147ms ao início frio.

const AWS = require("aws-sdk");

module.exports.handler = async () => {};

Considere esse o custo de fazer negócios quando sua função precisar interagir com os recursos da AWS. Porém, se você precisar interagir apenas com um serviço (por exemplo, DynamoDB), poderá economizar algum tempo de inicialização com recursos de linha única:

const DynamoDB = require("aws-sdk/clients/dynamodb");
const documentClient = new DynamoDB.DocumentClient();

Acima importamos o cliente DynamoDB diretamente, sem inicializar todo o AWS SDK. Fiz um experimento para ver quanto tempo de inicialização fria você pode economizar com essa alteração simples.

O crédito é dado ao meu colega Justin Caldicott por despertar meu interesse e fazer muitas análises iniciais.

Além do AWS SDK, geralmente também precisamos do XRay SDK e o usamos para instrumentar automaticamente o AWS SDK. Infelizmente, o pacote aws-xray-sdk também possui algumas bagagens adicionais que não precisamos. Por padrão, ele suporta aplicativos Express.js, MySQL e Postgres. Se você estiver interessado apenas em instrumentar o AWS SDK e módulos http/https, precisará apenas do aws-xray-sdk-core.

Metodologia

Eu testei várias configurações:

Cada uma dessas funções é rastreada pelo X-Ray. Taxa de amostragem (sample rate) definida para 100%, para não perdermos nada. Estamos interessados ​​apenas na duração do segmento Initialization, pois corresponde ao tempo para inicializar essas dependências.

O caso sem SDK da AWS é o nosso grupo de controle. Podemos ver quanto tempo cada dependência adicional adiciona à duração de Initialization.

Para coletar um conjunto de dados estatisticamente significantes, decidi automatizar o processo usando as Funções de Etapa (Step Functions).

Cada configuração é testada em torno de 1000 chamadas frias. Ocasionalmente, os rastreamentos do X-Ray estão incompletos (veja abaixo). Esses rastreamentos incompletos são excluídos na etapa Analyze.

Onde está o segmento AWS::Lambda:Function?

Cada configuração também é testada com o WebPack (usando o plugin serverless-webpack). Obrigado a Erez Rokah pela sugestão nos comentários.

Os Resultados

Abaixo está a análise do Initialization para todos os casos de teste:

Observações chave:

Créditos

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store