Gerenciar a simultaneidade para uma função do Lambda - AWS Lambda

Gerenciar a simultaneidade para uma função do Lambda

Simultaneidade é o número de solicitações que a função está atendendo em determinado momento. Quando a função é invocada, o Lambda aloca uma instância dela para processar o evento. Quando a execução do código da função terminar, ela poderá processar outra solicitação. Se a função for invocada novamente enquanto uma solicitação ainda estiver sendo processada, outra instância será alocada, o que aumenta a simultaneidade da função.

A simultaneidade está sujeita a uma cota regional que é compartilhada por todas as funções em uma região. Para garantir que uma função possa sempre atingir um determinado nível de simultaneidade, é possível configurar a função com simultaneidade reservada. Quando uma função tem simultaneidade reservada, nenhuma outra função pode usar essa simultaneidade. A simultaneidade reservada também limita a simultaneidade máxima para a função e aplica-se à função como um todo, incluindo versões e aliases.

Quando o Lambda aloca uma instância da sua função, o tempo de execução carrega o código da sua função e executa o código de inicialização definido fora do manipulador. Se seu código e dependências forem grandes, ou você criar clientes de SDK durante a inicialização, esse processo poderá levar algum tempo. À medida que a função é expandida, a parte das solicitações atendidas por novas instâncias passa a ter latência maior do que o restante.

Para permitir que sua função seja dimensionada sem flutuações na latência, use simultaneidade provisionada. Ao alocar simultaneidade provisionada antes de um aumento nas invocações, é possível garantir que todas as solicitações sejam atendidas por instâncias inicializadas com latência muito baixa. Você pode configurar a simultaneidade provisionada em uma versão de uma função ou em um alias.

O Lambda também se integra ao Aplicativo Auto Scaling. É possível configurar o Aplicativo Auto Scaling para gerenciar a simultaneidade provisionada em uma programação ou com base na utilização. Use o dimensionamento agendado para aumentar a simultaneidade provisionada em antecipação ao tráfego máximo. Para aumentar a simultaneidade provisionada automaticamente conforme necessário, usea API do Aplicativo Auto Scaling para registrar um destino e criar uma política de escalabilidade.

A simultaneidade provisionada é contabilizada para a simultaneidade reservada e as cotas regionais de uma função. Se a quantidade de simultaneidade provisionada nas versões e aliases de uma função se somar à simultaneidade reservada da função, todas as invocações serão executadas na simultaneidade provisionada. Essa configuração também tem o efeito de controlar a utilização da versão não publicada da função ($LATEST), o que impede que ela seja executada.

Configurar a simultaneidade reservada

Para gerenciar configurações de simultaneidade reservada para uma função, use o console do Lambda.

Para reservar simultaneidade para uma função

  1. Abra a página Funções do console do Lambda.

  2. Escolha uma função.

  3. Em Concurrency (Simultaneidade), selecione Edit (Editar).

  4. Selecione Reserve concurrency (Reservar simultaneidade). Insira a quantidade de simultaneidade para reservar para a função.

  5. Escolha Salvar.

É possível reservar até o valor mostrado de Unreserved account concurrency (Simultaneidade da conta não reservada), menos 100 para funções que não têm simultaneidade reservada. Para limitar uma função, defina a simultaneidade reservada como zero. Isso impede que todos os eventos sejam processados até que você remova o limite.

O exemplo a seguir mostra duas funções com grupos de simultaneidade reservada e o grupo de simultaneidade não reservada usado por outras funções. Erros de limitação ocorrem quando toda a simultaneidade em um grupo está em uso.


        Simultaneidade reservada alocada para duas funções.

Legenda

  • Simultaneidade de funções

  • Simultaneidade reservada

  • Simultaneidade não reservada

  • Limitação

Reservar simultaneidade tem os seguintes efeitos.

  • Outras funções não podem impedir que sua função seja dimensionada – todas as funções da sua conta na mesma região sem simultaneidade reservada compartilham o grupo de simultaneidade não reservada. Sem simultaneidade reservada, outras funções podem usar toda a simultaneidade disponível. Isso evita que sua função seja ampliada quando necessário.

  • Sua função não pode ser dimensionada a ponto de perder o controle – a simultaneidade reservada também impede que sua função use simultaneidade do grupo não reservado, o que limita sua simultaneidade máxima. É possível reservar a simultaneidade para impedir que sua função use toda a simultaneidade disponível na região ou sobrecarregue os recursos downstream.

Configurar a simultaneidade por função pode afetar o grupo de simultaneidade disponível para outras funções. Para evitar problemas, limite o número de usuários que podem usar as operações de API PutFunctionConcurrency e DeleteFunctionConcurrency.

Configurar a simultaneidade provisionada

Para gerenciar configurações de simultaneidade provisionada para uma versão ou alias, use o console do Lambda.

Como reservar simultaneidade para uma alias

  1. Abra a página Funções do console do Lambda.

  2. Escolha uma função.

  3. Em Provisioned concurrency configurations (Configurações de simultaneidade provisionada), escolha Add (Adicionar).

  4. Escolha um alias ou versão.

  5. Informe a quantia de simultaneidade provisionada a ser alocada.

  6. Escolha Save (Salvar).

É possível gerenciar a simultaneidade provisionada para todos os aliases e versões na página de configuração da função. A lista de configurações de simultaneidade provisionada mostra o andamento da alocação de cada configuração. As configurações de simultaneidade provisionada também estão disponíveis na página de configuração de cada versão e alias.

No exemplo a seguir, as funções my-function-DEV e my-function-PROD são configuradas com simultaneidade reservada e provisionada. Em my-function-DEV, o grupo completo de simultaneidade reservada também é a simultaneidade provisionada. Nesse caso, todas as invocações são executadas em simultaneidade provisionada ou são limitadas. Em my-function-PROD, uma parte do grupo de simultaneidade reservada é a simultaneidade padrão. Quando toda a simultaneidade provisionada está em uso, a função escalada para a simultaneidade padrão para atender a quaisquer solicitações adicionais.


        Uma função com simultaneidade reservada e simultaneidade provisionada.

Legenda

  • Simultaneidade de funções

  • Simultaneidade reservada

  • Simultaneidade provisionada

  • Simultaneidade não reservada

  • Limitação

A simultaneidade provisionada não fica online imediatamente após a configuração. O Lambda começa a alocar a simultaneidade provisionada após um ou dois minutos de preparação. Semelhante à forma como as funções escalam sob carga, é possível inicializar até 3000 instâncias da função de uma só vez, dependendo da região. Após a intermitência inicial, as instâncias são alocadas a uma taxa constante de 500 por minuto até que a solicitação seja atendida. Quando você solicita simultaneidade provisionada para várias funções ou versões de uma função na mesma região, as cotas de escalabilidade são aplicáveis a todas as solicitações.


      Dimensionamento com simultaneidade provisionada.

Legenda

  • Instâncias de função

  • Solicitações abertas

  • Simultaneidade provisionada

  • Simultaneidade padrão

O código de inicialização da função é executado durante a alocação e de poucas em poucas horas, porque as instâncias em execução da sua função são recicladas. O tempo de inicialização pode ser visualizado em logs e rastreamentos depois que uma instância processar uma solicitação. No entanto, a inicialização é cobrada mesmo que a instância nunca processe uma solicitação. A simultaneidade provisionada é executada continuamente e faturada separadamente dos custos de inicialização e de chamada. Para obter detalhes, consulte Definição de preço do AWS Lambda.

Cada versão de uma função só pode ter uma configuração de simultaneidade provisionada. Ela pode estar diretamente na própria versão ou em um alias que aponte para a versão. Dois aliases não podem alocar simultaneidade provisionada para a mesma versão. Além disso, não é possível alocar simultaneidade provisionada em um alias que aponte para a versão não publicada ($LATEST).

Quando você altera a versão para a qual um alias aponta, a simultaneidade provisionada é desalocada da versão antiga e, depois, alocada para a nova versão. É possível adicionar uma configuração de roteamento a um alias que tenha simultaneidade provisionada. No entanto, você não poderá gerenciar configurações de simultaneidade provisionada no alias enquanto a configuração de roteamento estiver em vigor.

O Lambda emite as seguintes métricas para simultaneidade provisionada:

Métricas de simultaneidade provisionada

  • ProvisionedConcurrentExecutions

  • ProvisionedConcurrencyInvocations

  • ProvisionedConcurrencySpilloverInvocations

  • ProvisionedConcurrencyUtilization

Para obter detalhes, consulte Trabalhar com métricas de função do AWS Lambda.

Configurar a simultaneidade com a API do Lambda

Para gerenciar as configurações de simultaneidade e escalabilidade automática com a AWS CLI ou com o AWS SDK, use as operações de API a seguir.

Para configurar a simultaneidade reservada com a AWS CLI, use o comando put-function-concurrency. O comando a seguir reserva uma simultaneidade de 100 para uma função chamada my-function:

$ aws lambda put-function-concurrency --function-name my-function --reserved-concurrent-executions 100 { "ReservedConcurrentExecutions": 100 }

Para alocar simultaneidade provisionada para uma função, use put-provisioned-concurrency-config. O comando a seguir aloca uma simultaneidade de 100 para o alias BLUE de uma função chamada my-function:

$ aws lambda put-provisioned-concurrency-config --function-name my-function \ --qualifier BLUE --provisioned-concurrent-executions 100 { "Requested ProvisionedConcurrentExecutions": 100, "Allocated ProvisionedConcurrentExecutions": 0, "Status": "IN_PROGRESS", "LastModified": "2019-11-21T19:32:12+0000" }

Para configurar o Aplicativo Auto Scaling para gerenciar a simultaneidade provisionada, use o Aplicativo Auto Scaling para configurar a escalabilidade de rastreamento de destino. Primeiro, registre o alias de uma função como um destino de escalabilidade. O exemplo a seguir registra o alias BLUE de uma função chamada my-function:

$ aws application-autoscaling register-scalable-target --service-namespace lambda \ --resource-id function:my-function:BLUE --min-capacity 1 --max-capacity 100 \ --scalable-dimension lambda:function:ProvisionedConcurrency

Depois, aplique uma política de escalabilidade ao destino. O exemplo a seguir configura o Aplicativo Auto Scaling para ajustar a configuração de simultaneidade provisionada para um alias manter a utilização próxima de 70%.

$ aws application-autoscaling put-scaling-policy --service-namespace lambda \ --scalable-dimension lambda:function:ProvisionedConcurrency --resource-id function:my-function:BLUE \ --policy-name my-policy --policy-type TargetTrackingScaling \ --target-tracking-scaling-policy-configuration '{ "TargetValue": 0.7, "PredefinedMetricSpecification": { "PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization" }}' { "PolicyARN": "arn:aws:autoscaling:us-east-2:123456789012:scalingPolicy:12266dbb-1524-xmpl-a64e-9a0a34b996fa:resource/lambda/function:my-function:BLUE:policyName/my-policy", "Alarms": [ { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7" }, { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66" } ] }

O Aplicativo Auto Scaling cria dois alarmes no CloudWatch. O primeiro alarme será acionado quando a utilização da simultaneidade provisionada exceder consistentemente 70%. Quando isso acontecer, o Aplicativo Auto Scaling alocará mais simultaneidade provisionada para reduzir a utilização. O segundo alarme será acionado quando a utilização for consistentemente inferior a 63% (90% da meta de 70%). Quando isso acontecer, o Aplicativo Auto Scaling reduzirá a simultaneidade provisionada do alias.

No exemplo a seguir, uma função dimensiona entre um valor mínimo e máximo da simultaneidade provisionada com base na utilização. Quando o número de solicitações abertas aumenta, o Aplicativo Auto Scaling aumenta a simultaneidade provisionada em grande escala até que alcance a configuração máxima. A função continua a ser dimensionada na simultaneidade padrão até que a utilização comece a ser reduzida. Quando a utilização é consistentemente baixa, o Aplicativo Auto Scaling reduz a simultaneidade provisionada em escalas periódicas menores.


      Escalabilidade automática de simultaneidade provisionada com o controle de destino do Aplicativo Auto Scaling.

Legenda

  • Instâncias de função

  • Solicitações abertas

  • Simultaneidade provisionada

  • Simultaneidade padrão

Para visualizar as cotas de simultaneidade da sua conta em uma região, use get-account-settings.

$ aws lambda get-account-settings { "AccountLimit": { "TotalCodeSize": 80530636800, "CodeSizeUnzipped": 262144000, "CodeSizeZipped": 52428800, "ConcurrentExecutions": 1000, "UnreservedConcurrentExecutions": 900 }, "AccountUsage": { "TotalCodeSize": 174913095, "FunctionCount": 52 } }