AWS sam + Dynamo DB : local
Levantar AWS sam (Lambdas + Api Gateway) y Dynamo DB en local.
Escenario:
Si necesitamos levantar nuestras lambdas para invocarlas en local, el comando sam local start-api
nos proporciona un punto de acceso donde estarán todos los paths que tengamos definidos en el template.yaml
.
sam local start-api
inicializa un docker con el código de las lambdas y lo disponibiliza a través del localhost
. Sin embargo, si nuestras lambdas necesitan acceder a Dynamo DB
y no queremos apuntar a la base en AWS es necesario levantarlo localmente.
Para levantarlo localmente usaremos:
Luego, necesitamos crear una red entre el docker de sam
y el docker de de Dynamo, para que se visualicen los containers.
Paso a paso:
- Docker de Dynamo DB y configuración de red
# Listar las redes de docker creadas
docker network ls
# Crear una nueva red (guardar el ID)
docker network create -d bridge my-bridge-network
# Pull de la imagen de Dynamo-Local
docker pull amazon/dynamodb-local
# Levantar docker con la red creada en el paso 2
docker run -d -p 8000:8000 --network=my-bridge-network amazon/dynamodb-local
# Inspeccionar la red para verificar la IP del docker de dynamo
docker network inspect id_de_red
Con la ip que obtenemos en el paso anterior es necesario agregarla a nuestra configuración local. Esto lo hacemos por que no se puede acceder a través del localhost:8000
, hay que acceder por la red interna de docker.
# Por ejemplo como variable de entorno en el proyecto
DYNAMO_DB_END_POINT = "http://172.18.X.X:8000"
- Ejemplo de código en JS para uso de dynamo local basado en la variable de entorno definida en el paso anterior:
const getDynamoClient = () => {
const dynamoLocal = (process.env.DYNAMO_DB_USE_LOCAL == 'true')
if (dynamoLocal == true) {
return new DynamoDBClient({
region: process.env.DYNAMO_DB_REGION,
endpoint: process.env.DYNAMO_DB_END_POINT,
});
}
return new DynamoDBClient({ region: process.env.DYNAMO_DB_REGION });
}
- Instalar un explorador de dynamo localmente:
Mas informacion de cómo funciona dynamo-admin en :
# Instalar dynamo-admin (global o local)
npm i dynamodb-admin
# Levantar dynamo-admin en el puerto deseado
# - Dependiendo de la configuración
# - Es necesario pasarle las credenciales
DYNAMO_ENDPOINT=http://localhost:8000 AWS_REGION=us-west-2 AWS_ACCESS_KEY_ID=XXXXX AWS_SECRET_ACCESS_KEY=XXXXX dynamodb-admin
- Finalmente levantar el
sam local start-api
# Levantar con el puerto deseado, o importante es agregar la red
# El parámetro para la red: -docker-network my-bridge-network
# La misma red creada en el paso de confifguración de dynamo-local
sam local start-api -p 3002 --docker-network my-bridge-network
Esto permitirá: invocar las lambdas (http://localhost:3002
) , que las lambdas puedan acceder a la Dynamo DB local y se pueda trabajar con la base de datos desde dynamo admin (http://localhost:8001
) modificando , verificando o borrando los datos en el local.
Saludos!
Referencias
AWS Dynamo DB: https://aws.amazon.com/es/dynamodb/
Dynamo Local: https://hub.docker.com/r/amazon/dynamodb-local
Dynamo Admin: https://www.npmjs.com/package/dynamodb-admin
Dynamo Admin Github: https://github.com/aaronshaf/dynamodb-admin
Docker Network: https://docs.docker.com/network/