Skip to content

MiniStack

Mientras otra tecnología, conocida como LocalStack, planteaba el uso de simular ciertos sevicios AWS, MiniStack provee más características gratuitas para un entorno local con variedad de servicios AWS, proporcionando incluso verdaderas bases de datos, ejecución lambdas y gestión de contenedores. De este modo, podrías desarrollar en tu máquina o red privada, es decir, sin consumir recursos de AWS en tu etapa de desarrollo.

Ten presente que lo que hace es simular ciertos servicios de AWS sin que esto sustituya una operación productiva. Sin embargo, esto permite replicar nuestros ambientes para buscar tener una alta consistencia en el despliegue. Por lo que podrías usar la nube solo para el entorno productivo, dependiendo de los servicios que implementes.

Instalación de MiniStack

Para instalar MiniStack se puede usar Docker, por ejemplo ejecutando:

bash
docker run -d -p 4566:4566 --name ministack docker.io/nahuelnucera/ministack
docker logs ministack

Puedes verificar también ejecutando: curl http://localhost:4566/_ministack/health

Como alternativa para persistir almacenamiento con servicio simulado de S3 usarías en su lugar el comando:

bash
docker run -d -p 4566:4566 \
  --name ministack \
  -e S3_PERSIST=1 \
  -v ~/wsdata/s3:/tmp/ministack-data/s3 \
  docker.io/nahuelnucera/ministack

Podemos probar la disponiblidad del servicio S3 ejecutando desde otra terminal lo siguiente:

bash
aws --endpoint-url http://localhost:4566 s3api create-bucket --bucket my-bucket
aws --endpoint-url http://localhost:4566 s3 ls

aws (CLI) debe estar instalado previamente, por ejemplo, para Windows se descarga desde enlace en AWS.

Probando MiniStack

A continuación, exploraremos ejemplos prácticos usando el servicio S3 de MiniStack con código en JavaScript, por lo que necesitaremos entorno NodeJS previamente establecido, o si se prefiere Bun (instalando con: curl -fsSL https://bun.sh/install | bash).

Configuración del Proyecto para MiniStack

Primero, crea un directorio para el proyecto e inicializa un proyecto de Node.js:

bash
mkdir ministack-test
cd ministack-test
npm init -y
npm install @aws-sdk/client-s3 @aws-sdk/client-lambda

Ejemplo con S3

Creamos un Bucket usando la CLI de AWS:

bash
aws --endpoint-url http://localhost:4566 s3 mb s3://mi-bucket-local

La CLI se instala con sudo snap install aws-cli --classic para Linux y brew install awscli para macOS

Para subir un archivo iniciamos el programa s3-example.js con un contenido como el siguiente:

javascript
import { S3Client, PutObjectCommand, GetObjectCommand, ListBucketsCommand } from "@aws-sdk/client-s3";

// Set S3 wit MiniStack endpoint
const s3Client = new S3Client({
  endpoint: "http://localhost:4566",
  region: "us-east-1",
  credentials: {
    accessKeyId: "test",
    secretAccessKey: "test"
  },
  forcePathStyle: true  // For MiniStack
});

// List buckets
async function listBuckets() {
  const command = new ListBucketsCommand({});
  const response = await s3Client.send(command);
  console.log("Buckets disponibles:", response.Buckets);
}

// Upload file
async function uploadFile() {
  const command = new PutObjectCommand({
    Bucket: "mi-bucket-local",
    Key: "saludo.txt",
    Body: "¡Hola desde MiniStack!",
    ContentType: "text/plain"
  });
  
  const response = await s3Client.send(command);
  console.log("Archivo subido exitosamente:", response);
}

// Download file
async function downloadFile() {
  const command = new GetObjectCommand({
    Bucket: "mi-bucket-local",
    Key: "saludo.txt"
  });
  
  const response = await s3Client.send(command);
  const body = await response.Body.transformToString();
  console.log("Contenido del archivo:", body);
}

// Launching Proof
async function main() {
  try {
    await listBuckets();
    await uploadFile();
    await downloadFile();
  } catch (error) {
    console.error("Error:", error);
  }
}

main();

Ejecutando el ejemplo:

bash
node s3-example.js

Nota: Recuerda que MiniStack es una herramienta de desarrollo local. Los recursos creados aquí no se replican en AWS a menos que configures explícitamente un despliegue hacia la nube.