Unable to execute HTTP request (DynamoDB, Java SDK)
TL;DR — Java SDK tidak pernah mendapat respons HTTP: koneksi TCP ke endpoint DynamoDB gagal. Terhadap localhost:8000 itu berarti DynamoDB Local tidak berjalan (atau di port lain) — dan di dalam kontainer Docker/SAM, localhost adalah kontainer, bukan mesin Anda, jadi emulator tak terjangkau di alamat itu. Mulai emulator, perbaiki endpoint, dan gunakan alamat yang dapat dijangkau host dari kontainer.
Apa artinya
com.amazonaws.SdkClientException: Unable to execute HTTP request:
Connect to localhost:8000 [localhost/127.0.0.1] failed: Connection refusedSdkClientException (v1: AmazonClientException) adalah pembungkus kegagalan sisi klien SDK — permintaan mati sebelum DynamoDB pernah melihatnya. Penyebab bersarang memberi tahu langkah jaringan mana yang gagal: Connection refused (tidak ada yang mendengarkan), connect timed out (tidak ada rute/firewall), atau UnknownHostException (hostname tidak teruraikan, sering region atau endpoint yang salah ketik). Ini padanan Java dari Could not connect to the endpoint URL botocore.
Mengapa terjadi
- DynamoDB Local tidak berjalan — ia tidak pernah dimulai, crash saat startup (native library, konflik port), atau keluar bersama terminal terakhir Anda.
- Port atau skema salah — Local default ke
8000melalui plainhttp; endpointhttps://localhost:8000atau port yang salah menolak. localhostdi dalam kontainer — kode yang berjalan di Docker/SAM (sam local invoke) memanggil loopback-nya sendiri. Emulator di host Anda (atau di kontainer saudara) tidak ada di sana.- Terhadap AWS asli: tidak ada jalur jaringan — proxy korporat tidak dikonfigurasi pada klien HTTP SDK, VPC tanpa rute/endpoint untuk DynamoDB, atau region salah ketik menghasilkan hostname yang tidak ada.
Cara memperbaikinya
Konfirmasi ada sesuatu yang mendengarkan di tempat Anda memanggil:
curl http://localhost:8000 # DynamoDB Local answers 400 with an AmazonDynamoDBv2 bodyJika itu gagal, mulai emulator (
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jarataudocker run -p 8000:8000 amazon/dynamodb-local).Arahkan klien ke endpoint yang benar (SDK v2):
DynamoDbClient client = DynamoDbClient.builder() .endpointOverride(URI.create("http://localhost:8000")) .region(Region.US_EAST_1) .build();Dari kontainer, jangan panggil
localhost— gunakanhost.docker.internal:8000(Docker Desktop), nama layanan compose (http://dynamodb:8000), atau lampirkan kedua kontainer ke jaringan Docker yang sama. Untuksam local, teruskan--docker-networkyang dibagi dengan kontainer emulator.Terhadap AWS asli, verifikasi hostname region benar dan konfigurasikan pengaturan proxy SDK jika jaringan Anda membutuhkannya; dari subnet privat, tambahkan gateway VPC endpoint DynamoDB atau rute NAT.
Setelah endpoint menjawab, verifikasi data mengalir dari ujung ke ujung — aplikasi desktop DynoTable terhubung ke DynamoDB Local dan AWS asli, jadi Anda dapat melihat tabel yang (atau tidak) dikenai kode Java Anda. Membangun permintaan itu sendiri? DynamoDB Expression Builder menghasilkan key condition yang benar dan nilai bertipe.
Kesalahan terkait
- Could not connect to the endpoint URL (boto3) — kembaran Python.
- Could not connect to DynamoDB Local (ECONNREFUSED) — kembaran Node.js.
- DynamoDB Local port 8000 in use
- Pelajari: Running DynamoDB Local · Connect to Local & LocalStack
References
- Handling errors in the AWS SDK for Java 2.x — Developer Guide (
SdkClientException= a client-side problem, e.g. no network connection available) - Deploying DynamoDB locally on your computer — AWS DynamoDB Developer Guide (default port 8000, launch command, Docker examples)
- DynamoDB local usage notes — AWS DynamoDB Developer Guide (setting the local endpoint
http://localhost:8000) docker run --add-host— Docker CLI reference (host.docker.internal/host-gatewayfor container-to-host connections)
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.