Cómo conectarse a DynamoDB Local y LocalStack
Tienes un DynamoDB local corriendo y tu código le habla bien — pero quieres
ver las tablas, no escribir un script de scan cada vez. Conectar un client a
un endpoint local son dos cambios: apuntar a la URL correcta y darle credenciales
desechables. Los detalles de abajo son donde la gente se atasca — el namespace de región,
la regla de clave alfanumérica y la división de puertos 8000 vs 4566.
DynamoDB Local vs LocalStack: a qué te estás conectando
Ambos te dan una API de DynamoDB en localhost sin una cuenta AWS, pero son
cosas distintas:
- DynamoDB Local es el motor DynamoDB descargable en un solo proceso — AWS lo
reparte como JAR y como imagen Docker
(
amazon/dynamodb-local). Es DynamoDB y nada más. Puerto por defecto 8000 (docs AWS). Mira ejecutar DynamoDB Local con Docker. - LocalStack emula un stack de servicios AWS detrás de un solo endpoint. Su DynamoDB está impulsado por DynamoDB Local, pero todo pasa por el edge port único 4566 de LocalStack.
Así que la única diferencia práctica para conectar es la URL del endpoint: :8000 para
DynamoDB Local standalone, :4566 para DynamoDB-vía-LocalStack. Todo lo demás —
la API, el truco de credenciales, la config de la GUI — es idéntico.
La setup de endpoint + credenciales dummy que tropieza a todo el mundo
Los SDKs y la CLI de AWS exigen una access key y una región incluso al hablar con un endpoint local — pero esos valores no tienen que ser reales. Los propios docs de AWS dicen que estos valores "don't have to be valid AWS values to run locally" (docs AWS).
Dos gotchas que no son obvios:
- La región/access-key hace namespace de tus datos en silencio. Sin el flag
-sharedDb, DynamoDB Local escribe un archivomyaccesskeyid_region.dbseparado por combinación de access-key-ID + región — el naming exacto de AWS. Conéctate con una clave o región distinta a la que usó tu app y tus tablas parecen haber desaparecido; solo están en otro archivo. Arranca con-sharedDb(unshared-local-instance.dbpara cada client) o iguala la clave + región exactas que usa tu app. - El access key ID debe ser alfanumérico en DynamoDB Local — sin símbolos.
Los docs AWS
dicen que
AWS_ACCESS_KEY_IDsolo puede contenerA–Z,a–zy0–9; AWS introdujo esto en DynamoDB Local 2.0.0 (y 1.23.0+), así que una clave con caracteres especiales que funcionaba en una imagen anterior ahora falla (AWS re:Post). Mira el error más abajo.
Para LocalStack el default seguro es test / test:
ignora el secret key por completo
y nunca valida el valor del secret. Claves con aspecto real AKIA…/ASIA… se
rechazan como salvaguarda y caen al account dummy 000000000000 —
el mismo account al que resuelve una clave arbitraria como test. Quédate con test.
Conectar con la AWS CLI (sanity check)
Antes de apuntar una GUI, confirma que el endpoint está vivo desde la CLI. La CLI
no tiene un endpoint local por defecto,
así que o pasas --endpoint-url por comando o pones
AWS_ENDPOINT_URL_DYNAMODB=http://localhost:8000 (CLI v2.13+).
DynamoDB Local:
aws dynamodb list-tables --endpoint-url http://localhost:8000LocalStack (mismo comando, puerto distinto):
aws dynamodb list-tables --endpoint-url http://localhost:4566Si tienes credenciales configuradas (aunque sean falsas en ~/.aws/credentials
o vía AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY), esto devuelve tu lista de tablas.
Una lista vacía sin error significa que el endpoint funciona pero estás mirando un
namespace de clave/región distinto — mira el gotcha de arriba.
GUI de DynamoDB Local: explorar y consultar tablas locales en DynoTable
Una vez que la CLI funciona, una GUI necesita los mismos tres valores: endpoint, región, y unas credenciales dummy. La CLI devuelve DynamoDB-JSON que lees a ojo; una GUI renderiza los mismos datos como una tabla que puedes ordenar, filtrar y editar.
En DynoTable, añade una conexión y pon un endpoint custom:
- Endpoint:
http://localhost:8000(DynamoDB Local) ohttp://localhost:4566(LocalStack) - Región: la que use tu app — p. ej.
us-east-1. Aquí es una etiqueta, no una región AWS real, pero debe coincidir para aterrizar en el mismo namespace de datos. - Access key / secret: lo que sea (
test/testes lo convencional). Solo alfanumérico para la access key en DynamoDB Local.
Desde ahí exploras items, ejecutas un Query o un Scan, y editas filas visualmente
en vez de JSON a mano en la CLI. Cuando cargas fixtures, el
convertidor DynamoDB-JSON pasa JSON plano al
formato wire, y Query vs Scan cubre a qué lectura
ir. El mismo drill para un
visor DynamoDB de LocalStack — solo cambia el puerto a
4566.
DynoTable es software de escritorio solo-local, así que apuntarlo a localhost mantiene
tus fixtures en tu máquina. Para un vistazo más amplio a las opciones de GUI, mira la
comparación de GUIs de DynamoDB.
Errores comunes (mismatch de región, puerto, credenciales)
- Connection refused. Puerto equivocado —
8000es DynamoDB Local,4566es LocalStack. Confirma también que el contenedor publicó el puerto de verdad (docker run -p 8000:8000 amazon/dynamodb-local). Para LocalStack, comprueba que el servicio está up enhttp://localhost:4566/_localstack/health. The Access Key ID or Security Token is Invaliden DynamoDB Local. Desde la imagen 2.0.0 (y 1.23.0+), el access key ID debe ser solo alfanumérico. Una clave con símbolos que funcionaba en una imagen anterior ahora falla — reemplázala con letras/números (p. ej.test) y actualiza cada tool para que coincida.The security token included in the request is invalidcontra LocalStack. Esto es casi siempre un problema de endpoint, no de credenciales — tu client SDK dejó caer el--endpoint-url/endpoint_urly golpeó el endpoint real de AWS, que rechaza tu clave dummy. Confirma que el client apunta de verdad ahttp://localhost:4566.- Errores de credenciales del SDK/CLI. Incluso los endpoints locales necesitan alguna
credencial presente. Pon
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY(o un perfil falso) para que la credential chain del SDK resuelva. httpvshttps. Los endpoints locales sonhttpplano. Una URLhttps://falla el handshake TLS.
¿Es DynamoDB Local los mismos datos que mis tablas AWS reales?
No — local y cloud son stores completamente separados. DynamoDB Local (y el DynamoDB de LocalStack) guarda datos en un archivo local o en memoria; nunca toca tu cuenta AWS, y las regiones/cuentas AWS no están soportadas a nivel de client en local. Ese es el punto: es para desarrollo y testing. Si quieres las mismas fixtures en la cloud más adelante, AWS sugiere valores de clave/región con aspecto válido en local para solo cambiar el endpoint al moverte. Para modelar ese schema antes de shippearlo, single-table design y GSI vs LSI cubren las decisiones que no cambian entre local y prod.
Lo que te ahorra lo local (y lo que prod sigue facturando)
DynamoDB Local no mide nada — sin RCU, sin WCU, sin transfer. El mismo GetItem
contra DynamoDB managed en us-east-1 on-demand factura 0.5 RCU
con consistencia eventual o 1 RCU con consistencia fuerte para un item ≤ 4 KB.
Cuando cambias --endpoint-url por el endpoint real, cada browse y query
vuelve a facturar. Modela el salto con la
calculadora de pricing y dimensiona items
representativos con la calculadora de tamaño de item.
FAQ
¿Necesito credenciales AWS reales? No. Tanto DynamoDB Local como LocalStack aceptan valores dummy. Solo tienen que estar presentes, ser alfanuméricos (para DynamoDB Local), y ser consistentes entre tus tools.
¿Por qué desaparecen mis tablas cuando cambio de tool? Sin -sharedDb, DynamoDB
Local particiona los datos por access-key + región en archivos myaccesskeyid_region.db
separados. Usa -sharedDb o mantén esos valores idénticos en todas partes.
¿Cuál es la diferencia entre el puerto 8000 y 4566? 8000 es el default de
DynamoDB Local standalone; 4566 es el edge port único de LocalStack que frontea todos
sus servicios emulados, DynamoDB incluido.
¿Puede una GUI conectarse a ambos? Sí — hablan la misma API de DynamoDB. Solo cambia
la URL del endpoint (:8000 vs :4566).
¿Es gratis DynamoDB Local? Sí. AWS reparte DynamoDB Local sin coste como JAR y como imagen Docker — no hay "provisioned throughput, data storage, or data transfer costs"; está pensado solo para desarrollo y testing, no para producción.
¿Puedo ejecutar SQL contra mis tablas locales? El DynamoDB local habla la misma API que
la cloud, así que aplican las mismas reglas de patrón de acceso — y los mismos límites: la
gramática SELECT de PartiQL
de DynamoDB es solo SELECT … FROM … WHERE … ORDER BY — sin JOIN, sin GROUP BY, y
sin funciones de agregación de agrupación
como COUNT/SUM/AVG (mira PartiQL vs SQL).
El de DynoTable ejecuta esas
queries analíticas sobre cualquier conexión, local incluido.
Prueba DynoTable para conectarte directo a localhost:8000 o
localhost:4566 y explorar, consultar y editar tus tablas locales con una GUI.