AWS sam + Dynamo DB : local

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