Je souhaite utiliser ou résoudre les problèmes liés à Amazon DynamoDB Streams avec mes fonctions AWS Lambda.
Résolution
Les questions suivantes sont fréquemment posées lors de l'utilisation de DynamoDB Streams avec la fonction Lambda :
Pourquoi ma fonction Lambda ne s'adapte-t-elle pas lorsque le flux DynamoDB est un déclencheur ?
Lorsque vous activez un flux DynamoDB sur une table DynamoDB, Amazon DynamoDB associe une partition à chaque partition. Par exemple, si votre table DynamoDB comporte 10 partitions et que vous activez DynamoDB Streams sur cette table, vous disposez de 10 partitions.
Si le nombre de partitions de votre table augmente, le nombre de partitions dans le flux augmente également.
Chaque partition d'une table DynamoDB peut gérer jusqu'à 3 000 unités de capacité de lecture (RCU), 1 000 unités de capacité d'écriture (WCU) et 10 Go de données. Le dépassement de l'un de ces paramètres entraîne les conséquences suivantes :
- L'ajout d'une nouvelle partition à la table.
- Création d'une nouvelle partition dans le flux DynamoDB.
Comment puis-je contrôler le traitement des données depuis le flux DynamoDB ?
La taille du lot et la fenêtre de traitement des lots permettent de contrôler le traitement des données à partir du flux.
Fenêtre de traitement par lots : Définit le délai d'attente pour les enregistrements avant d'appeler. La fenêtre de traitement par lots permet de contrôler le traitement des données à partir du flux DynamoDB. Notez que ce comportement dépend de la disponibilité des données dans le flux.
Taille du lot : Définit le nombre maximum d'enregistrements du lot.
La fonction Lambda n'est pas invoquée tant que les conditions suivantes ne sont pas remplies :
- La taille de la charge utile atteint 6 Mo (limite d'invocation synchrone).
- La fenêtre de traitement par lots atteint sa valeur maximale (60 secondes, dans cet exemple).
- La taille du lot atteint sa valeur maximale.
Comment le facteur de parallélisation est-il utilisé pour accélérer le traitement des données ?
Le facteur de parallélisation traite rapidement de grandes quantités d'enregistrements en permettant davantage d'exécutions simultanées. Vous pouvez définir le facteur de parallélisation (par défaut) : 1 à 10) pour augmenter le nombre de partitions traitées. Lorsque vous activez le facteur de parallélisation, veillez à utiliser des clés de partition aléatoires ou uniques pour obtenir le débit le plus élevé.
Calcul : Facteur de parallélisation (lots simultanés par partition) * Partitions = Exécution simultanée
Qu'est-ce que le paramètre BisectBatchOnFunctionError ?
Si la fonction Lambda échoue, les lots sont divisés en deux lorsque l'option BisectBatchonFunctionError est définie sur true. Les lots fractionnés sont ensuite réessayés jusqu'à ce que l'enregistrement du problème soit trouvé. Les tentatives sont traitées en fonction du nombre maximum de tentatives et de l'âge de l'enregistrement.
Si l'option Nombre de tentatives est définie sur 0, aucune nouvelle tentative n'est effectuée pour l'enregistrement ayant échoué. Dans ce cas, DynamoDB Stream supprime les enregistrements ayant échoué ou les envoie vers la Dead Letter Queue (DLQ), si elle est configurée.
Exemple 1
Dans l'exemple suivant, « p » représente l'enregistrement du problème et le nombre de tentatives est défini sur 0.
Enregistrement du lot : [1,2,3p,4,5p]
Division 1 : [3p,4,5p]
Division 2 : [3p] [4,5p] La nouvelle tentative ignore [3p] car il est identifié comme l'enregistrement du problème. Ou bien, il est envoyé à la DLQ, si elle est configurée.
Split 3 :[4] est traité. [5p] est supprimé ou envoyé à la DLQ, si elle est configurée.
Exemple 2
Dans l'exemple suivant, « x » représente l'enregistrement du problème. ****Le nombre de tentatives est défini sur -1.
Enregistrements du lot insérés : [1,2,3x,4,5x]
[3x,4,5x]
[3x,4,5x]
[3x,4,5x]
[3x,4,5x]
Pourquoi IteratorAge dans Lambda augmente-t-il pour mon flux DynamoDB ?
Les raisons courantes de l'augmentation de IteratorAge dans Lambda sont les suivantes :
- Il y a un mauvais enregistrement dans le flux DynamoDB.
- Le flux comporte un volume élevé d'opérations d'écriture (PutItem vers BatchWriteItem). La fonction Lambda peut ne pas être en mesure de traiter un volume d'écriture élevé. Dans ce cas, augmentez la capacité provisionnée de la table DynamoDB pour augmenter le nombre de partitions pour 1 000 WCU. L'augmentation de la capacité provisionnée augmente le nombre d'exécutions Lambda simultanées. Pour plus d'informations, consultez la section précédente Pourquoi ma fonction Lambda ne s'adapte-t-elle pas lorsque le flux DynamoDB est un déclencheur ?
- Le nombre de partitions DynamoDB a diminué, par exemple lors de la migration vers un nouveau compte ou vers une nouvelle table.
- La fonction Lambda présente des erreurs de limitation ou de fonction. AWS Lambda réessaie les enregistrements jusqu'à ce que l'ensemble du lot soit traité correctement ou jusqu'à ce que l'âge de l'enregistrement expire. De plus, la période de rétention de DynamoDB Streams est de 24 heures. Pour éviter toute perte de données, il est recommandé de configurer la DLQ. Si la DLQ est configurée, AWS Lambda envoie les lots d'enregistrements ayant échoué au DLQ une fois que les tentatives sont terminées ou que l'âge des enregistrements a expiré.
Pour résoudre les erreurs de fonction Lambda, consultez les journaux Amazon CloudWatch pour plus de détails sur l'erreur.
- La durée de la fonction Lambda augmente.
- Vous devez optimiser la gestion des erreurs et le facteur de parallélisation.
Pour des informations détaillées, consultez la section Pourquoi ma métrique Lambda IteratorAge augmente-t-elle et comment la diminuer ?