AWS SAM + LocalStack

AWS SAM + LocalStack

Desplegando Mimic en LocalStack

En artículos anteriores he comentado sobre Mimic, un laboratorio de pruebas que he desarrollado con un stack serverless. Actualmente continuo trabajando en mimic y realizando distintas pruebas de herramientas de IaC (Infraestructura como código) Link, en esta ocasión desplegaremos el stack en localstack utilizando AWS Sam como herramienta de IaC.

Configurando AWS sam

Para realizar las pruebas, suelo separar él .yaml para el local y para el del Cloud. El archivo template-local.yaml Link contiene la configuración para ejecutarlo localmente. Es una copia del templete.yaml pero con la configuración para el LocalStack.

El punto más importante es la configuración local de la DynamoDB:

Globals:
  Function:
    Runtime: nodejs18.x
    Timeout: 40
    MemorySize: 256
    Environment:
      Variables:
        DYNAMO_DB_USE_LOCAL: true
        DYNAMO_DB_REGION: us-east-1
        DYNAMO_DB_END_POINT: https://localhost.localstack.cloud:4566
        MIMIC_TABLE: mimic-sam

Esta configuración es util en el código del cliente de la base de datos. Si la variable DYNAMO_DB_USE_LOCAL está configurado en TRUE, eL cliente de la base de datos tomará la URL del localstack para realizar las consultas a la base y las inserciones como se ve en el código a continuación. Link

# main/src/clients/dbClient.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,
        });
    }
    //if (client ){ return client}
    return new DynamoDBClient({ region: process.env.DYNAMO_DB_REGION });
}

Levantar LocalStack

Como explique en la entrada de guía de inicio , levantamos el localstack y verificamos que esté corriendo correctamente:

     __                     _______ __             __
    / /   ____  _________ _/ / ___// /_____ ______/ /__
   / /   / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/
  / /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,<
 /_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_|

 💻 LocalStack CLI 3.7.0
 👤 Profile: default

[11:16:12] starting LocalStack in Docker mode 🐳               localstack.py:503
           container image not found on host                   bootstrap.py:1272
[11:17:02] download complete                                   bootstrap.py:1276
──────────────── LocalStack Runtime Log (press CTRL-C to quit) ─────────────────

LocalStack version: 3.7.2.dev6
LocalStack build date: 2024-09-03
LocalStack build git hash: daa45717

Ready.

Instalamos samlocal

En un paso anterior para simplificar separamos los archivos de configuración para los ambientes local y Cloud, ahora instalamos samlocal. samlocal es un wrapper al comando Sam, que permite gestionar de forma independiente el despliegue en ambos ambientes. Link:

pip install aws-sam-cli-local

Con AWS sam , Podemos inicializar u proyecto o desplegar, mantiene las mismas funciones que el sam cli original. En este caso especificamos el archivo al que queremos que utilice como base para el despliegue, que es el archivo que separamos del templarte base y lo configuramos para un despliegue local.

samlocal deploy -t template-local.yaml

El proceso de despliegue se realiza de manera similar a como se realizara en el Cloud.

# Ultimas salidas del despliege local con SAM en localstack
...                                                             rmissionStage                                                 
CREATE_IN_PROGRESS              AWS::ApiGateway::Stage          kSixApiStage                    -                             
CREATE_COMPLETE                 AWS::ApiGateway::Stage          kSixApiStage                    -                             
CREATE_COMPLETE                 AWS::CloudFormation::Stack      sam-app                         -                             
-----------------------------------------------------------------------------------------------------------------------------


Successfully created/updated stack - sam-app in us-east-1

Una vez desplegado accediendo a la página de administración de localstack podemos ver los servicios que se desplegaron.

Probando el Stack

Como pruebas verificamos un recurso que hemos insertado en la DynamoDB:

Primero guardamos algunos registros en la base:

curl  -X POST \
  'http://zggxllsgd6.execute-api.localhost.localstack.cloud:4566/tlj77ngaiv/mimic' \
  --header 'Accept: */*' \
  --header 'User-Agent: Thunder Client (https://www.thunderclient.com)' \
  --header 'Content-Type: application/json' \
  --data-raw '{"name":"Terraform", "age":30, "car":null, "region":"eu-central-1"}'

Verificamos que se guarden los datos

Conclusiones:

  • Se desplegó de manera correcta el stack de referencia mimic en localstack

  • Se pueden navegar los recursos sin inconveniente accediendo a las lambdas, el API gateway, y los recursos de la DynamoDB

  • Es importante configurar el archivo .yaml para el despliegue local.

  • Es interesante seguir probando distintas herramientas de IaC.

Referencias: