Escalabilidade de instâncias gerenciadas do Lambda
As instâncias gerenciadas do Lambda não escalam quando as invocações chegam e não oferecem suporte a inicializações a frio. Em vez disso, elas escalam de forma assíncrona usando sinais de consumo de recursos. Atualmente, as instâncias gerenciadas escalam com base na utilização de recursos da CPU e na saturação de multissimultaneidade.
Principais diferenças:
-
Lambda (padrão): escala quando não há ambiente de execução livre para lidar com uma invocação recebida (inicialização a frio)
-
Instâncias gerenciadas do Lambda: escalam de forma assíncrona com base na utilização de recursos da CPU e na saturação de multissimultaneidade dos ambientes de execução
Se seu tráfego mais do que dobrar em 5 minutos, será possível ver controles de utilização quando o Lambda aumentar a escala verticalmente das instâncias e ambientes de execução para atender à demanda.
O ciclo de vida de escalabilidade
As instâncias gerenciadas do Lambda usam uma arquitetura distribuída para gerenciar a escalabilidade:
Componentes:
-
Instâncias gerenciadas: executadas na sua conta, nas sub-redes que você fornece
-
Roteador e escalador: componentes compartilhados do Lambda que roteiam invocações e gerenciam a escalabilidade
-
Agente do Lambda: executado em cada instância gerenciada para gerenciar o ciclo de vida do ambiente de execução e monitorar o consumo de recursos
Como funciona:
-
Quando você publica uma versão da função com um provedor de capacidade, o Lambda executa instâncias gerenciadas em sua conta. Ele executa três por padrão, para resiliência de AZ, e inicia três ambientes de execução antes de marcar sua versão de função como ATIVA.
-
Cada instância gerenciada pode executar ambientes de execução para várias funções mapeadas para o mesmo provedor de capacidade.
-
Conforme o tráfego flui para a sua aplicação, os ambientes de execução consomem recursos. O agente do Lambda notifica o escalador, que decide se quer escalar novos ambientes de execução ou instâncias gerenciadas.
-
Se o roteador tentar enviar uma invocação para um ambiente de execução com alto consumo de recursos, o agente do Lambda nessa instância o notificará para tentar novamente em outra.
-
À medida que o tráfego diminui, o agente do Lambda notifica o escalador, que toma a decisão de reduzir a escala verticalmente dos ambientes de execução e reduzir a escala horizontalmente das instâncias gerenciadas.
Ajuste do comportamento de escalabilidade
É possível personalizar o comportamento de escalabilidade das instâncias gerenciadas por meio de cinco controles:
Controles em nível de função
1. Memória da função e vCPUs
Escolha o tamanho da memória e a alocação de vCPUs para sua função. O menor tamanho de função com suporte é de 2 GB e 1 vCPU.
Considerações:
-
Selecione uma configuração de memória e vCPU que ofereça suporte a execuções multissimultâneas da sua função.
-
Não é possível configurar uma função com menos de 1 vCPU, pois as funções executadas em instâncias gerenciadas devem oferecer suporte a workloads multissimultâneas
-
Não é possível escolher menos de 2 GB, pois isso corresponde à proporção de 2 para 1 memória por vCPU das instâncias c, que têm a menor proporção
-
Para aplicações em Python, talvez seja necessário escolher uma proporção maior de memória para vCPUs, como 4 para 1 ou 8 para 1, devido à forma como o Python lida com a multissimultaneidade
-
Se você estiver executando operações intensivas de CPU ou executando pouca E/S, é necessário escolher mais de uma vCPU
2. Simultaneidade máxima
Defina a simultaneidade máxima por ambiente de execução.
Comportamento padrão: o Lambda escolhe padrões sensatos que equilibram o consumo de recursos e o throughput, o que funciona para uma ampla variedade de aplicações.
Diretrizes de ajuste:
-
Aumente a simultaneidade: se suas invocações de função usarem muito pouca CPU, será possível aumentar a simultaneidade máxima até um máximo de 64 por vCPU
-
Reduza a simultaneidade: se a sua aplicação consome uma grande quantidade de memória e muito pouca CPU, é possível reduzir sua simultaneidade máxima
Importante: como as instâncias gerenciadas do Lambda são destinadas a aplicações multissimultâneas, ambientes de execução com simultaneidade muito baixa podem sofrer controles de utilização durante a escalabilidade.
3. Ambientes de execução por função
Defina o número mínimo e máximo de ambientes de execução para sua função.
Comportamento padrão: o Lambda mantém um padrão mínimo de 3 ambientes de execução para garantir alta disponibilidade em todas as zonas de disponibilidade.
Diretrizes de ajuste:
-
Defina o mínimo: provisione a capacidade para o tráfego básico e reduza os controles de utilização durante picos repentinos.
-
Defina o máximo: limite o número de ambientes de execução para controlar o aumento da escala horizontalmente e evitar problemas com vizinhos barulhentos quando várias funções compartilharem um provedor de capacidade.
-
Desative a função: defina o mínimo e o máximo como 0 para desativar uma função sem excluí-la.
Exemplo:
aws lambda put-function-scaling-config \ --function-name my-lmi-function \ --qualifier '$LATEST.PUBLISHED' \ --function-scaling-config MinExecutionEnvironments=5,MaxExecutionEnvironments=20 \ --region us-east-1
Observações importantes:
-
Escopo do qualificador: essas configurações se aplicam no nível da função para cada ARN qualificado. Quando definida como
$LATEST.PUBLISHED, a configuração se propaga para versões futuras de$LATEST.PUBLISHED. Quando definida para uma versão específica, as versões recém-publicadas retornam para os valores padrão. -
Configuração pareada: você deve definir os valores mínimo e máximo juntos. Qualquer configuração não especificada retornará para seu valor padrão. Os valores válidos para
MinExecutionEnvironmentseMaxExecutionEnvironmentsvariam de 0 a 15000.
Controles em nível de provedor de capacidade
4. Utilização de recursos do destino
Escolha seu próprio destino para o consumo de utilização da CPU.
Comportamento padrão: o Lambda mantém espaço suficiente para que seu tráfego dobre em 5 minutos sem controles de utilização.
Opções de otimização:
-
Se a sua workload for muito estável ou se sua aplicação não for sensível a restrições, será possível definir a meta em um nível alto para obter maior utilização e custos mais baixos
-
Se você quiser manter o espaço livre para picos de tráfego, é possível definir metas de recursos em um nível baixo, o que exigirá mais capacidade
5. Seleção do tipo de instância
Defina os tipos de instância permitidos ou excluídos.
Comportamento padrão: o Lambda escolhe os melhores tipos de instância para sua workload. É recomendável que as instâncias gerenciadas do Lambda escolham os tipos de instância, pois restringir o número de tipos de instância possíveis pode resultar em menor disponibilidade.
Configuração personalizada:
-
Requisitos específicos de hardware: defina os tipos de instância permitidos em uma lista de instâncias compatíveis. Por exemplo, se você tiver uma aplicação que exija alta largura de banda da rede, poderá selecionar vários tipos de instâncias n.
-
Otimização de custos: para ambientes de testes ou desenvolvimento, é possível escolher tipos de instância menores, como tipos de instância m7a.large
Escalabilidade programada
Use o Agendador do Amazon EventBridge para ajustar os ambientes de execução mínimo e máximo da sua função em uma programação recorrente ou única. Isso é útil para padrões de tráfego previsíveis, como aumentar a escala verticalmente antes do horário de pico e reduzir a escala verticalmente fora do horário de pico.
Configuração do agendador:
-
Crie um perfil de execução do Agendador do EventBridge ou use um perfil existente que conceda permissão para chamar
lambda:PutFunctionScalingConfigem sua função de destino. -
Crie uma programação usando uma expressão rate ou cron, definindo a API
PutFunctionScalingConfigcomo alvo universal. Especifique os novos valores deMinExecutionEnvironmentseMaxExecutionEnvironmentsna carga útil de entrada.
Exemplo 1: escalar para lidar com picos de tráfego planejados
Crie duas programações para aumentar a escala verticalmente antes do horário de pico e reduzi-la depois. Cada programação tem como alvo a API PutFunctionScalingConfig com os valores MinExecutionEnvironments e MaxExecutionEnvironments atualizados.
Aumentar a escala verticalmente às 8:00 UTC (mín.=100, máx.=1000):
aws scheduler create-schedule \ --name "ScaleUpLambdaManagedInstances" \ --schedule-expression "cron(0 8 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 100, \"MaxExecutionEnvironments\": 1000}}" }'
Reduzir a escala verticalmente às 18:00 UTC (mín.=5, máx.=20):
aws scheduler create-schedule \ --name "ScaleDownLambdaManagedInstances" \ --schedule-expression "cron(0 18 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 5, \"MaxExecutionEnvironments\": 20}}" }'
Exemplo 2: desativar fora do horário de pico e reativar
Definir MinExecutionEnvironments e MaxExecutionEnvironments como 0 desativa a versão da função sem excluí-la. Uma função desativada não aumenta automaticamente com o tráfego. Você deve reativá-la explicitamente definindo valores diferentes de zero por meio de outra ação programada.
Desativar às 22:00 UTC (mín.=0, máx.=0):
aws scheduler create-schedule \ --name "DeactivateLambdaManagedInstances" \ --schedule-expression "cron(0 22 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 0, \"MaxExecutionEnvironments\": 0}}" }'
Reativar às 7:00 UTC (mín.=10, máx.=20):
aws scheduler create-schedule \ --name "ReactivateLambdaManagedInstances" \ --schedule-expression "cron(0 7 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 10, \"MaxExecutionEnvironments\": 20}}" }'
Diretrizes de ajuste:
-
Para workloads com picos previsíveis, crie várias programações de acordo com seu padrão de tráfego: uma para aumentar a escala de sua função verticalmente antes do horário de pico e outra para reduzir a escala verticalmente após o horário de pico. Cada programação segue o mesmo padrão com os valores
MinExecutionEnvironmentseMaxExecutionEnvironmentsatualizados. -
O escalonamento programado ajusta o piso e o teto provisionados para os ambientes de execução, mas o dimensionamento real entre mínimo e máximo ainda responde à utilização da CPU e à saturação causada pela simultaneidade.
-
Se seu tráfego mais do que dobrar em um intervalo de cinco minutos após um aumento vertical de escala programado, ainda assim será possível que haja controles de utilização à medida que a capacidade for provisionada.
-
Ao escalar para zero para desativar uma função, lembre-se de que a reativação requer uma chamada
PutFunctionScalingConfigexplícita com valores diferentes de zero.
Próximas etapas
-
Saiba mais sobre provedores de capacidade para instâncias gerenciadas do Lambda
-
Revise os guias específicos de runtime para lidar com a multissimultaneidade
-
Configure a conectividade de VPC para seus provedores de capacidade
-
Monitore as métricas de escalabilidade para otimizar o comportamento da escalabilidade