DynamoDB cannot access stream — stream is not enabled

TL;DR — Un consommateur (une source d'événements Lambda, un lecteur Kinesis Adapter, ou un appel brut DescribeStream/GetShardIterator) a essayé de lire un stream DynamoDB sur une table où Streams est désactivé, ou il a utilisé un ARN de stream périmé datant d'avant la réactivation de Streams. Active DynamoDB Streams sur la table et pointe le consommateur vers le LatestStreamArn actuel de la table.

Ce que ça signifie

Cannot access stream arn:aws:dynamodb:us-east-1:111122223333:table/Orders/stream/... .
Please ensure the ARN is correct and the stream is enabled.

DynamoDB Streams must be enabled on the table.

DynamoDB Streams est une fonctionnalité opt-in. Une table n'a un stream que lorsque tu définis un StreamSpecification avec StreamEnabled: true. Si un lecteur — le plus souvent une source d'événements Lambda — est câblé à une table qui n'a pas de stream actif (ou à un ARN qui n'existe plus), le mapping ne peut pas s'attacher et signale qu'il ne peut pas accéder au stream.

Pourquoi ça arrive

  • Streams n'a jamais été activé sur la table, mais un consommateur en attend un.
  • Streams a été désactivé puis réactivé — chaque activation crée un ARN de stream tout neuf (avec un suffixe d'horodatage frais). Un consommateur détenant l'ancien ARN lit un stream désactivé qui reste lisible pendant au plus 24 heures de plus, puis ses enregistrements expirent.
  • Dérive de l'infrastructure-as-code — un consommateur CDK/CloudFormation/Terraform référence une table importée par nom/ARN qui n'a pas propagé sa config de stream, donc l'outillage pense que Streams est désactivé.
  • Mauvais ARN de stream — utiliser l'ARN de table, ou un placeholder .../stream/latest, au lieu du vrai LatestStreamArn.

Comment le corriger

  1. Active Streams sur la table. Définis StreamSpecification { StreamEnabled: true, StreamViewType: NEW_AND_OLD_IMAGES } (ou le type de vue dont ton consommateur a besoin) via UpdateTable, la console, ou ton IaC.
  2. Lis l'ARN de stream actuel. Appelle DescribeTable et utilise le champ LatestStreamArn — jamais un ARN construit à la main ou mis en cache.
  3. Re-pointe le consommateur vers le nouvel ARN après tout cycle désactivation/activation ; recrée la source d'événements Lambda si elle était liée à l'ancien stream.
  4. Accorde la permission de lecture — le rôle du consommateur a besoin de dynamodb:DescribeStream, GetRecords, GetShardIterator et ListStreams sur l'ARN du stream.
  5. Ne confonds pas ARN de table et ARN de stream — l'ARN de stream se termine par /stream/<horodatage>, l'ARN de table non.

Tu as besoin d'inspecter la table et sa configuration de stream sans la console ? L'application de bureau DynoTable fait ressortir le statut du stream à côté de la table pour que tu puisses confirmer qu'il est activé avant de pointer un lecteur dessus.

Avant de réessayer dans DynoTable

Avant d'attacher un event source mapping Lambda, ouvre la table dans DynoTable et confirme que Streams est activé et quel StreamViewType est en place (détails de la table). DynoTable affiche la configuration du flux à côté du schéma : pas besoin de faire un détour par la console AWS.

Quand tu désactives puis réactives Streams, l'ARN change — rafraîchis la table dans DynoTable et copie l'identité de flux actuelle depuis AWS (LatestStreamArn via la CLI/DescribeTable) dans le consommateur. Sers-toi de ⌘P pour rester sur le bon profil de compte/région. L'inspection quotidienne des éléments reste dans DynoTable ; les consommateurs de flux restent dans l'outillage Lambda/Kinesis. Le query builder aide à vérifier que la table sert toujours des lectures par clé après un basculement de Streams.

Sources

Erreurs liées

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.