Unable to execute HTTP request (DynamoDB, Java SDK)

En bref — Le SDK Java n'a jamais obtenu de réponse HTTP : la connexion TCP vers l'endpoint DynamoDB a échoué. Face à localhost:8000, cela signifie que DynamoDB Local n'est pas démarré (ou est sur un autre port) — et à l'intérieur des conteneurs Docker/SAM, localhost est le conteneur, pas ta machine, donc l'émulateur est injoignable à cette adresse. Démarre l'émulateur, corrige l'endpoint, et utilise une adresse joignable depuis l'hôte depuis les conteneurs.

Ce que ça signifie

com.amazonaws.SdkClientException: Unable to execute HTTP request:
Connect to localhost:8000 [localhost/127.0.0.1] failed: Connection refused

SdkClientException (v1 : AmazonClientException) est le wrapper d'échec côté client du SDK — la requête est morte avant que DynamoDB ne la voie jamais. La cause imbriquée te dit quelle étape réseau a échoué : Connection refused (rien n'écoute), connect timed out (pas de route/pare-feu), ou UnknownHostException (le nom d'hôte ne se résout pas, souvent une région ou un endpoint mal saisi). C'est l'équivalent Java du Could not connect to the endpoint URL de botocore.

Pourquoi ça arrive

  • DynamoDB Local n'est pas démarré — il n'a jamais démarré, a planté au démarrage (bibliothèque native, conflit de port), ou s'est terminé avec ton dernier terminal.
  • Mauvais port ou schéma — Local utilise par défaut le 8000 sur http simple ; un endpoint de https://localhost:8000 ou le mauvais port refuse.
  • localhost à l'intérieur d'un conteneur — le code s'exécutant dans Docker/SAM (sam local invoke) compose sa propre boucle locale. L'émulateur sur ton hôte (ou dans un conteneur frère) n'est pas là.
  • Face au vrai AWS : aucun chemin réseau — proxy d'entreprise non configuré sur le client HTTP du SDK, VPC sans route/endpoint pour DynamoDB, ou une région mal saisie produisant un nom d'hôte inexistant.

Comment corriger

  1. Confirme que quelque chose écoute là où tu composes :

    curl http://localhost:8000    # DynamoDB Local answers 400 with an AmazonDynamoDBv2 body

    Si cela échoue, démarre l'émulateur (java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar ou docker run -p 8000:8000 amazon/dynamodb-local).

  2. Pointe le client vers le bon endpoint (SDK v2) :

    DynamoDbClient client = DynamoDbClient.builder()
        .endpointOverride(URI.create("http://localhost:8000"))
        .region(Region.US_EAST_1)
        .build();
  3. Depuis un conteneur, ne compose pas localhost — utilise host.docker.internal:8000 (Docker Desktop), le nom du service compose (http://dynamodb:8000), ou attache les deux conteneurs au même réseau Docker. Pour sam local, passe un --docker-network partagé avec le conteneur de l'émulateur.

  4. Face au vrai AWS, vérifie que le nom d'hôte de la région est correct et configure les paramètres de proxy du SDK si ton réseau en exige un ; depuis des sous-réseaux privés, ajoute un endpoint VPC gateway DynamoDB ou une route NAT.

Une fois que l'endpoint répond, vérifie que les données circulent de bout en bout — l'application de bureau DynoTable se connecte à la fois à DynamoDB Local et au vrai AWS, pour que tu puisses voir les tables que ton code Java atteint (ou non). Tu construis la requête elle-même ? Le DynamoDB Expression Builder génère des conditions de clé correctes et des valeurs typées.

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

DynoTable est un client de bureau rapide pour DynamoDB — parcours les tables, exécute des requêtes de style SQL et édite les items en local.