Unable to execute HTTP request (DynamoDB, Java SDK)

TL;DR — Java SDK hiç bir HTTP yanıtı almadı: DynamoDB uç noktasına giden TCP bağlantısı başarısız oldu. localhost:8000'e karşı bu, DynamoDB Local'in çalışmadığı (ya da başka bir portta olduğu) anlamına gelir — ve Docker/SAM kapsayıcıları içinde localhost, makineniz değil, kapsayıcı olduğundan, emülatöre o adreste ulaşılamaz. Emülatörü başlatın, uç noktayı düzeltin ve kapsayıcılardan ana bilgisayara ulaşılabilir bir adres kullanın.

Ne anlama gelir

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

SdkClientException (v1: AmazonClientException), SDK'nın istemci tarafı hata sarmalayıcısıdır — istek, DynamoDB onu görmeden önce öldü. İç içe neden, hangi ağ adımının başarısız olduğunu söyler: Connection refused (hiçbir şey dinlemiyor), connect timed out (yol yok/güvenlik duvarı) ya da UnknownHostException (ana bilgisayar adı çözümlenmiyor, genellikle yanlış yazılmış bir bölge veya uç nokta). Bu, botocore'un Could not connect to the endpoint URL hatasının Java eşdeğeridir.

Neden olur

  • DynamoDB Local çalışmıyor — hiç başlatılmadı, başlangıçta çöktü (yerel kitaplık, port çakışması) ya da son terminalinizle çıktı.
  • Yanlış port veya şema — Local, düz http üzerinden varsayılan olarak 8000'dir; https://localhost:8000 uç noktası ya da yanlış port reddeder.
  • Bir kapsayıcı içinde localhost — Docker/SAM'de (sam local invoke) çalışan kod, kendi geri döngüsünü arar. Ana bilgisayarınızdaki (ya da bir kardeş kapsayıcıdaki) emülatör orada değil.
  • Gerçek AWS'ye karşı: ağ yolu yok — SDK'nın HTTP istemcisinde yapılandırılmamış bir kurumsal proxy, DynamoDB için bir yolu/uç noktası olmayan bir VPC ya da var olmayan bir ana bilgisayar adı üreten yanlış yazılmış bir bölge.

Nasıl düzeltilir

  1. Aradığınız yerde bir şeyin dinlediğini doğrulayın:

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

    Bu başarısız olursa, emülatörü başlatın (java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar ya da docker run -p 8000:8000 amazon/dynamodb-local).

  2. İstemciyi doğru uç noktaya yöneltin (v2 SDK):

    DynamoDbClient client = DynamoDbClient.builder()
        .endpointOverride(URI.create("http://localhost:8000"))
        .region(Region.US_EAST_1)
        .build();
  3. Bir kapsayıcıdan localhost'u aramayınhost.docker.internal:8000'i (Docker Desktop), compose hizmet adını (http://dynamodb:8000) kullanın ya da her iki kapsayıcıyı aynı Docker ağına ekleyin. sam local için, emülatör kapsayıcısıyla paylaşılan bir --docker-network iletin.

  4. Gerçek AWS'ye karşı, bölge ana bilgisayar adının doğru olduğunu doğrulayın ve ağınız gerektiriyorsa SDK'nın proxy ayarlarını yapılandırın; özel alt ağlardan, bir DynamoDB ağ geçidi VPC uç noktası veya NAT yolu ekleyin.

Uç nokta yanıt verdiğinde, verinin baştan sona aktığını doğrulayın — DynoTable masaüstü uygulaması hem DynamoDB Local'e hem de gerçek AWS'ye bağlanır, böylece Java kodunuzun ulaştığı (ya da ulaşmadığı) tabloları görebilirsiniz. İsteğin kendisini mi oluşturuyorsunuz? DynamoDB Expression Builder doğru anahtar koşulları ve türlü değerler üretir.

İlgili hatalar

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.