AWS sam #1: sam local + DynamoDB

olcortesb - Oct 17 '23 - - Dev Community

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
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode
  • 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 });
}

Enter fullscreen mode Exit fullscreen mode
# 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

Enter fullscreen mode Exit fullscreen mode
  • 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

Enter fullscreen mode Exit fullscreen mode

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 desde dynamo-admin (http://localhost:8001) modificando, verificando o borrando los datos en el local.

¡Saludos!

Referencias

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player