Gestion de la simultanéité pour une fonction Lambda - AWS Lambda

Gestion de la simultanéité pour une fonction Lambda

La simultanéité est le nombre de demandes auxquelles votre fonction répond à un moment donné. Lorsque votre fonction est appelée, Lambda alloue une instance pour traiter l'événement. Lorsque le code de la fonction a fini de s'exécuter, il peut gérer une autre demande. Si la fonction est appelée à nouveau alors qu'une demande est toujours en cours de traitement, une autre instance est allouée, ce qui augmente la simultanéité de la fonction.

La simultanéité est soumise à un quota régional partagé par toutes les fonctions figurant dans une région. Pour vous assurer qu'une fonction peut toujours atteindre un certain niveau de simultanéité, vous pouvez la configurer avec la simultanéité réservée. Lorsqu'une fonction dispose de la simultanéité réservée, aucune autre fonction ne peut utiliser cette simultanéité. La simultanéité réservée limite également la simultanéité maximale pour la fonction et s'applique à la fonction dans son ensemble, y compris les versions et les alias.

Si Lambda alloue une instance de votre fonction, l’environnement d’exécution charge le code de votre fonction et exécute le code d'initialisation que vous définissez en dehors du gestionnaire. Si votre code et les dépendances sont volumineux, ou si vous créez des clients SDK pendant l'initialisation, ce processus peut prendre un certain temps. Au fur et à mesure que votre fonction évolue, la partie des demandes servies par les nouvelles instances subissent une latence plus élevée.

Pour permettre à votre fonction d'évoluer sans fluctuations de latence, utilisez la simultanéité provisionnée. En allouant la simultanéité provisionnée avant une augmentation des appels, vous pouvez vous assurer que toutes les demandes sont servies par des instances initialisées avec une latence très faible. Vous pouvez configurer la simultanéité provisionnée sur une version d'une fonction ou sur un alias.

Lambda s'intègre également à Application Auto Scaling. Vous pouvez configurer Application Auto Scaling pour gérer la simultanéité provisionnée selon une planification ou en fonction de l'utilisation. Utilisez la mise à l'échelle planifiée pour augmenter la simultanéité provisionnée en prévision du trafic de pointe. Pour augmenter automatiquement la simultanéité provisionnée en fonction des besoins, utilisez l'API Application Auto Scaling pour enregistrer une cible et créer une stratégie de dimensionnement.

La simultanéité allouée compte dans les quotas de simultanéité réservée et régionales d'une fonction. Si la simultanéité provisionnée sur les versions et les alias d'une fonction s'ajoute à la simultanéité réservée de la fonction, tous les appels s'exécutent sur la simultanéité provisionnée. Cette configuration a également pour effet de limiter la version non publiée de la fonction ($LATEST), ce qui empêche son exécution.

Configuration de la simultanéité réservée

Pour gérer les paramètres de simultanéité réservée pour une fonction, utilisez la console Lambda.

Réserver la simultanéité pour une fonction

  1. Ouvrez la page Fonctions de la console Lambda.

  2. Choisissez une fonction.

  3. Sous Concurrency (Simultanéité), choisissez Edit (Modifier).

  4. Choisissez Reserve concurrency (Réserver la simultanéité). Saisissez la quantité de simultanéité à réserver pour la fonction.

  5. Choisissez Save.

Vous pouvez réserver jusqu'à la valeur affichée Unreserved account concurrency (Simultanéité de compte non réservée), moins 100 pour les fonctions qui n'ont pas de simultanéité réservée. Pour limiter une fonction, définissez la simultanéité réservée à zéro. Cela empêche tout événement d'être traité jusqu'à ce que vous supprimiez la limite.

L'exemple suivant montre deux fonctions avec des pools de simultanéité réservée, ainsi que le pool de simultanéité non réservée utilisé par d'autres fonctions. Des erreurs de limitation se produisent lorsque toute la simultanéité d'un pool est en cours d'utilisation.


        Simultanéité réservée allouée à deux fonctions.

Légende

  • Simultanéité de la fonction

  • Simultanéité réservée

  • Simultanéité non réservée

  • Limitation

Les effets de la réservation de la simultanéité sont les suivants.

  • D'autres fonctions ne peuvent pas empêcher votre fonction d’évoluer – Toutes les fonctions de votre compte dans la même région sans simultanéité réservée partagent le groupe de simultanéité non réservée. Sans simultanéité réservée, d'autres fonctions peuvent utiliser toute la simultanéité disponible. Cela empêche l’évolution de votre fonction si nécessaire.

  • Votre fonction ne peut pas évoluer sans contrôle – La simultanéité réservée limite également votre fonction pour utiliser la simultanéité à partir du groupe non réservé, plafonnant ainsi sa simultanéité maximale. Vous pouvez réserver de la simultanéité pour empêcher votre fonction d'utiliser toute la simultanéité disponible dans la région, ou de surcharger les ressources en aval.

Le fait de définir la simultanéité par fonction peut avoir des conséquences sur le groupe de simultanéité disponible pour d'autres fonctions. Pour éviter les problèmes, limitez le nombre d'utilisateurs pouvant faire appel aux opérations d'API DeleteFunctionConcurrency et PutFunctionConcurrency.

Configuration de la simultanéité provisionnée

Pour gérer les paramètres de simultanéité provisionnée pour une version ou un alias, utilisez la console Lambda.

Pour réserver de la simultanéité pour un alias

  1. Ouvrez la page Fonctions de la console Lambda.

  2. Choisissez une fonction.

  3. Sous Provisioned concurrency configurations (Configurations de simultanéité provisionnée), choisissez Add (Ajouter).

  4. Choisissez un alias ou une version.

  5. Entrez le montant de la simultanéité provisionnée à allouer.

  6. Choisissez Enregistrer.

Vous pouvez gérer la simultanéité provisionnée pour tous les alias et toutes les versions à partir de la page de configuration de la fonction. La liste des configurations de simultanéité provisionnée indique la progression de l'allocation de chaque configuration. Les paramètres de simultanéité provisionnée sont également disponibles sur la page de configuration de chaque version et de chaque alias.

Dans l'exemple suivant, les fonctions my-function-DEV et my-function-PROD sont configurées avec la simultanéité réservée et provisionnée. Pour my-function-DEV, le pool complet de la simultanéité réservée est également provisionné. Dans ce cas, tous les appels s'exécutent au niveau de la simultanéité provisionnée ou sont limités. Pour my-function-PROD, une partie du pool de simultanéité réservée correspond à la simultanéité standard. Lorsque l'ensemble de la simultanéité provisionnée est utilisée, la fonction exploite la simultanéité standard pour répondre aux demandes supplémentaires.


        Fonction avec simultanéité réservée et simultanéité allouée.

Légende

  • Simultanéité de la fonction

  • Simultanéité réservée

  • Simultanéité provisionnée

  • Simultanéité non réservée

  • Limitation

La simultanéité allouée n'est pas mise en ligne immédiatement après la configuration. Lambda commence à allouer la simultanéité allouée après une phase de préparation d'une ou deux minutes. De la même manière que les fonctions sont mises à l'échelle en fonction de la charge, jusqu'à 3 000 instances de la fonction peuvent être initialisées en même temps, selon la région. Après le lancement initial en mode rafale, les instances sont allouées à un taux constant de 500 par minute jusqu'à ce que la demande soit satisfaite. Lorsque vous demandez la simultanéité allouée pour plusieurs fonctions ou versions d'une fonction dans la même région, des quotas de mise à l'échelle s'appliquent à toutes les demandes.


      Mise à l'échelle avec la simultanéité allouée.

Légende

  • Instances de la fonction

  • Demandes ouvertes

  • Simultanéité allouée

  • Simultanéité standard

Le code d'initialisation de votre fonction s'exécute pendant l'allocation et à intervalle de quelques heures, car les instances de votre fonction qui s'exécutent sont recyclées. Vous pouvez consulter le temps d'initialisation dans les journaux et les traces après le traitement d'une demande par une instance. Toutefois, l'initialisation est facturée même si l'instance ne traite pas une demande. La simultanéité allouée s'exécute en continu et est facturée séparément des coûts d'initialisation et d'appel. Pour plus d’informations, consultez Tarification AWS Lambda.

Chaque version d'une fonction ne peut avoir qu'une seule configuration de simultanéité provisionnée. Cela peut être directement sur la version elle-même ou sur un alias qui pointe vers la version. Deux alias ne peuvent pas allouer la simultanéité provisionnée pour la même version. En outre, vous ne pouvez pas allouer la simultanéité provisionnée sur un alias qui pointe vers la version non publiée ($LATEST).

Lorsque vous modifiez la version vers laquelle un alias pointe, la simultanéité provisionnée est désallouée de l'ancienne version, puis allouée à la nouvelle version. Vous pouvez ajouter une configuration de routage à un alias doté d'une simultanéité provisionnée. Toutefois, vous ne pouvez pas gérer les paramètres de simultanéité provisionnée sur l'alias lorsque la configuration de routage est en place.

Lambda émet les métriques suivantes pour la simultanéité provisionnée :

Métriques de simultanéité provisionnée

  • ProvisionedConcurrentExecutions

  • ProvisionedConcurrencyInvocations

  • ProvisionedConcurrencySpilloverInvocations

  • ProvisionedConcurrencyUtilization

Pour plus d'informations, veuillez consulter Utilisation des métriques de fonction AWS Lambda.

Configuration de la simultanéité avec l'API Lambda

Pour gérer les paramètres de simultanéité avec l'AWS CLI ou le kit SDK AWS, utilisez les opérations d'API suivantes.

Pour configurer la simultanéité réservée avec l’AWS CLI, utilisez la commande put-function-concurrency. La commande suivante réserve une simultanéité de 100 pour une fonction nommée my-function :

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

Pour allouer de la simultanéité provisionnée pour une fonction, utilisez put-provisioned-concurrency-config. La commande suivante alloue une simultanéité de 100 pour l'alias BLUE d'une fonction nommée 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" }

Pour configurer Application Auto Scaling de sorte à gérer la simultanéité provisionnée, utilisez Application Auto Scaling pour configurer le dimensionnement du suivi de la cible. Tout d'abord, enregistrez l'alias d'une fonction en tant que cible de dimensionnement. L'exemple suivant enregistre l'alias BLUE d'une fonction nommée 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

Ensuite, appliquez une stratégie de dimensionnement à la cible. L'exemple suivant configure Application Auto Scaling pour ajuster la configuration de simultanéité provisionnée pour un alias afin de maintenir l'utilisation proche 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" } ] }

Application Auto Scaling crée deux alarmes dans CloudWatch. La première alarme se déclenche lorsque l'utilisation de la simultanéité provisionnée dépasse systématiquement 70 %. Lorsque cela se produit, Application Auto Scaling alloue plus de simultanéité provisionnée afin de réduire l'utilisation. La deuxième alarme se déclenche lorsque l'utilisation est constamment inférieure à 63 % (90 % de la cible de 70 %). Lorsque cela se produit, Application Auto Scaling réduit la simultanéité provisionnée de l'alias.

Dans l'exemple suivant, une fonction évolue entre une valeur minimale et une valeur maximale de simultanéité allouée en fonction du niveau d'utilisation. Lorsque le nombre de demandes ouvertes augmente, Application Auto Scaling augmente la simultanéité allouée par paliers importants jusqu'à ce qu'elle atteinte la valeur maximale configurée. La fonction continue d'évoluer selon une simultanéité standard jusqu'à ce que l'utilisation commencer à baisser. Lorsque l'utilisation est faible dans la durée, Application Auto Scaling diminue régulièrement la simultanéité allouée par paliers plus petits.


      Dimensionnement automatique de la simultanéité allouée avec le suivi de la cible Application Auto Scaling.

Légende

  • Instances de la fonction

  • Demandes ouvertes

  • Simultanéité allouée

  • Simultanéité standard

Pour afficher les quotas de simultanéité de votre compte dans une région, utilisez get-account-settings.

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