Escenario :
Estamos trabajando con nuestras primeras lambdas usando AWS sam y queremos probarlas localmente.
Si necesitamos levantar nuestras lambdas para invocarlas en local, el comando sam local start-api
nos proporciona un punto de acceso donde están todos los paths(GET, POST, PUT, …) que tengamos definidos en el template.yaml
.
sam local start-api
inicializa un docker con el código de las lambdas y lo habilita a través del http://localhost:port
. Sin embargo, si nuestras lambdas necesitan acceder a DynamoDb y no queremos apuntar a la base en AWS
, es necesario levantar DynamoDB en local.
Para levantar DynamoDb localmente usaremos:
Luego, necesitamos crear una red entre el docker de sam
y el docker de DynamoDb, para que se visualicen los containers.
Paso a paso:
- Levantar docker de DynamoDB 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 qué no se puede acceder a través del http://localhost:8000
, entre Lambda y DynamoDB 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 DynamoDb 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 DynamoDB localmente, ene este caso usaremos
dynamo-admin
:- Más información de como funciona
dynamo-admin
en:
- Más información de como funciona
# Instalar dynamo-admin (global o local)
npm i dynamodb-admin
# Levantar dynamo-admin en el puerto deseado
# - Dependiendo de la configuracin
# - Es necesario pasarle las credenciales y el puerto de acceso
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 parmetro para la red: -docker-network my-bridge-network
# La misma red creada en el paso de confifguracin 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 DynamoDB local y se pueda trabajar con la base de datos desdedynamo-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/