AWS sam #1: sam local + DynamoDB
Tags: aws, sam, dynamodb
Published: 2023-10-17 15:56:58

---
title: AWS sam #1: sam local + DynamoDB 
published: true
date: 2023-03-09 11:06:16 UTC
tags: aws,sam,dynamodb
canonical_url: https://olcortesb.hashnode.dev/aws-sam-dynamo-db-local
series: AWS lambda con sam
---

### **Escenario** :

Estamos trabajando con nuestras primeras [lambdas](https://aws.amazon.com/es/lambda/) usando [AWS sam](https://aws.amazon.com/es/serverless/sam/) y queremos probarlas localmente.

Si necesitamos levantar nuestras _lambdas_ para invocarlas en local, el comando [`sam local start-api`](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-start-api.html) 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:

- [https://hub.docker.com/r/amazon/dynamodb-local](https://hub.docker.com/r/amazon/dynamodb-local)

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

```bash
# 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_.

```bash
# 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:

```js
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:
      - [https://www.npmjs.com/package/dynamodb-admin](https://www.npmjs.com/package/dynamodb-admin)

```bash
# 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`

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

¡Saludos!

## Referencias

- AWS sam : [https://aws.amazon.com/es/serverless/sam/](https://aws.amazon.com/es/serverless/sam/)

- AWS Dynamo DB: [https://aws.amazon.com/es/dynamodb/](https://aws.amazon.com/es/dynamodb/)

- Dynamo Local: [https://hub.docker.com/r/amazon/dynamodb-local](https://hub.docker.com/r/amazon/dynamodb-local)

- Dynamo Admin: [https://www.npmjs.com/package/dynamodb-admin](https://www.npmjs.com/package/dynamodb-admin)

- Dynamo Admin Github: [https://github.com/aaronshaf/dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin)

- Docker Network: [https://docs.docker.com/network/](https://docs.docker.com/network/)