DEV Community

olcortesb for AWS Español

Posted on • Originally published at olcortesb.hashnode.dev on

2 1 1

AWS sam #1: sam local + DynamoDB

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

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay