

# Ampliar funções do Lambda usando extensões do Lambda
<a name="lambda-extensions"></a>

É possível usar extensões do Lambda para aumentar as funções do Lambda. Por exemplo, use extensões do Lambda para integrar funções com suas ferramentas preferidas de monitoramento, observação, segurança e governança. Você pode escolher entre várias ferramentas que os [parceiros do AWS Lambda](https://aws.amazon.com/lambda/partners/) fornecem, ou pode [criar suas próprias extensões do Lambda](runtimes-extensions-api.md).

O Lambda é compatível com extensões internas e externas. Uma extensão externa é executada como um processo independente no ambiente de execução e continua a ser executada após a invocação da função ser totalmente processada. Como as extensões são executadas como processos separados, elas podem ser escritas em uma linguagem diferente da função. Todos os [Runtimes do Lambda](lambda-runtimes.md) são compatíveis com extensões.

Uma extensão interna é executada como parte do processo de runtime. A função acessa extensões internas usando scripts wrapper ou mecanismos no processo, como `JAVA_TOOL_OPTIONS`. Para obter mais informações, consulte [Modificar o ambiente de runtime](runtimes-modify.md).

É possível adicionar extensões a uma função usando o console do Lambda, a AWS Command Line Interface (AWS CLI) ou serviços e ferramentas da infraestrutura como código (IaC), como o CloudFormation, o AWS Serverless Application Model (AWS SAM) e o Terraform.

Você é cobrado pelo tempo de execução consumido pela extensão (em incrementos de 1 ms). Não há custo para instalar suas próprias extensões. Para obter mais informações sobre a definição de preço para extensões, consulte [Definição de preço do AWS Lambda](https://aws.amazon.com/lambda/pricing/). Para obter informações de definição de preço sobre extensões de parceiros, consulte os sites desses parceiros. Consulte [Parceiros de extensões do AWS Lambda](extensions-api-partners.md) para obter uma lista de extensões oficiais de parceiros.

**Topics**
+ [Ambiente de execução](#using-extensions-env)
+ [Impacto na performance e nos recursos](#using-extensions-reg)
+ [Permissões](#using-extensions-permissions)
+ [Configuração de extensões do Lambda](extensions-configuration.md)
+ [Parceiros de extensões do AWS Lambda](extensions-api-partners.md)
+ [Usar a API de extensões do Lambda para criar extensões](runtimes-extensions-api.md)
+ [Acessar dados de telemetria em tempo real para extensões usando a API Telemetria](telemetry-api.md)

## Ambiente de execução
<a name="using-extensions-env"></a>

O Lambda invoca a função em um [ambiente de execução](lambda-runtime-environment.md), que fornece um ambiente do runtime seguro e isolado. O ambiente de execução gerencia os recursos necessários para executar sua função e fornece suporte ao ciclo de vida para o runtime e extensões da função.

O ciclo de vida do ambiente de execução inclui as seguintes fases:
+ `Init`: nessa fase, o Lambda cria ou descongela um ambiente de execução com os recursos configurados, faz download do código da função e de todas as camadas, inicializa todas as extensões e o runtime, em seguida executa o código de inicialização da função (o código fora do handler principal). O`Init`ocorre durante a primeira invocação, ou antes de invocações de função se você tiver habilitado[Simultaneidade provisionada](provisioned-concurrency.md).

  O`Init`é dividida em três subfases:`Extension init`,`Runtime init`, e`Function init`. Essas subfases garantem que todas as extensões e o runtime concluam suas tarefas de configuração antes que o código da função seja executado.

  Quando o [Lambda SnapStart](snapstart.md) está ativado, a fase `Init` ocorre ao você publicar uma versão da função. O Lambda salva um snapshot do estado da memória e do disco do ambiente de execução inicializado, mantém o snapshot criptografado e o armazena em cache para acesso de baixa latência. Se você tiver um [hook de runtime](snapstart-runtime-hooks.md) before-checkpoint, então, o código será executado ao final da fase `Init`.
+ `Restore` (somente para SnapStart): quando você invoca uma função do [SnapStart](snapstart.md) pela primeira vez e à medida que aumenta a escala verticalmente da função, o Lambda retoma novos ambientes de execução do snapshot retido, em vez de inicializar a função do zero. Se você tiver um [hook de runtime](snapstart-runtime-hooks.md) after-restore, o código será executado ao final da fase `Restore`. Serão realizadas cobranças pela duração dos hooks de runtime after-restore. O runtime deve ser carregado e os hooks de runtime after-restore devem ser concluídos dentro do limite de tempo limite (dez segundos). Caso contrário, você obterá uma SnapStartTimeoutException. Quando a fase `Restore` é concluída, o Lambda invoca o manipulador de função (a [Fase de invocação](lambda-runtime-environment.md#runtimes-lifecycle-invoke)).
+ `Invoke`: Nesta fase, o Lambda chama o manipulador de função. Depois que a função é executada até a conclusão, o Lambda se prepara para manipular outra invocação de função.
+ `Shutdown`: Esta fase é acionada se a função do Lambda não receber quaisquer invocações por um período de tempo. Na fase `Shutdown`, o Lambda encerra o runtime, alerta as extensões para permitir que elas parem de forma limpa e, em seguida, remove o ambiente. Lambda envia um`Shutdown`para cada extensão, que informa a extensão que o ambiente está prestes a ser encerrado.

Durante o`Init`, o Lambda extrai camadas contendo extensões para o`/opt`no ambiente de execução. O Lambda procura extensões no`/opt/extensions/`, interpreta cada arquivo como um bootstrap executável para iniciar a extensão e inicia todas as extensões em paralelo.

## Impacto na performance e nos recursos
<a name="using-extensions-reg"></a>

O tamanho das extensões da função conta para o limite de tamanho do pacote de implantação. Para um arquivo .zip, o tamanho total descompactado da função e de todas as extensões não pode exceder o limite de tamanho do pacote de implantação descompactado de 250 MB.

As extensões podem afetar a performance da função porque compartilham recursos de função, como CPU, memória e armazenamento. Por exemplo, se uma extensão executa operações de computação intensiva, você pode ver o aumento da duração da execução da função.

Cada extensão deve concluir sua inicialização antes de o Lambda invocar a função. Portanto, uma extensão que consome tempo de inicialização significativo pode aumentar a latência da invocação da função.

Para medir o tempo adicional que a extensão leva após a execução da função, você pode usar a[métrica da função](monitoring-metrics.md) `PostRuntimeExtensionsDuration`. Para medir o aumento da memória usada, você pode usar a métrica `MaxMemoryUsed`. Para entender o impacto de uma extensão específica, você pode executar diferentes versões das funções lado a lado.

**nota**  
A métrica `MaxMemoryUsed` é uma das [métricas coletadas pelo Lambda Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Lambda-Insights-metrics.html), não uma métrica nativa do Lambda.

## Permissões
<a name="using-extensions-permissions"></a>

As extensões têm acesso aos mesmos recursos que as funções. Como as extensões são executadas no mesmo ambiente que a função, as permissões são compartilhadas entre a função e a extensão.

Para um arquivo .zip, é possível criar um modelo do CloudFormation para simplificar a tarefa de anexar a mesma configuração de extensão, incluindo permissões do AWS Identity and Access Management (IAM), a várias funções.