🎓 MiniStack : Se former sur AWS en Local
Qu'est-ce que MiniStack ?
MiniStack est un émulateur de services AWS. Il permet d'émuler localement plus de 55 services. Il s'exécute entièrmenr dans un conteneur Docker sur votre machine. Il permet de reproduire les API de services majeurs (S3, Lambda, DynamoDB, SQS, etc.) sans jamais se connecter à Internet ni aux serveurs d'Amazon.
MiniStack est Gratuit pour Toujours (Free forever - ♾️🆓), avec des conteneurs Postgres, Redis, and Docker. Il ne requière pas de compte, de licence ou de télémetrie.
Pourquoi l'utiliser pour se former ?
- Gratuité totale : Vraiment pas de facturation surprise en fin de mois.
- Vitesse : Déploiements instantanés puisque tout est local.
- Sécurité : Vous pouvez faire des erreurs, supprimer des ressources ou tester des scripts "sales" sans conséquence.
- Mode hors-ligne : Travaillez dans le train ou sans connexion.
Comment le mettre en place ?
C'est très simple si vous avez déjà Docker installé. Voici la méthode la plus propre utilisant Docker Compose.
Je me suis préparer un boilerplate pour cela et je vous partage ici sa structure de base :
1. La structureÂ
├── data
├── docker
│ └── cli
│ └── Dockerfile.dev
├── sources
│ └── cli
├── docker-compose.yml
├── README.md
└── .env
2. Le fichier docker-compose.yml
Créez un dossier pour votre projet et placez-y ce fichier :
services:
awslocal:
image: ministackorg/ministack:latest
container_name: ministack
hostname: ministack
tty: true
stdin_open: true
ports:
- "4566:4566"
user: "${UID}:${GID}"
environment:
- GATEWAY_PORT=4566
- LOG_LEVEL=INFO
- S3_PERSIST=1
- REDIS_HOST=redis
- REDIS_PORT=6379
- RDS_BASE_PORT=15432
- DOCKER_NETWORK=ministack-network # Docker network for RDS/EKS/ElastiCache/Lambda containers
- ELASTICACHE_BASE_PORT=16379
volumes:
- ./data:/tmp/ministack-data
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
redis:
condition: service_healthy
restart: ${RESTART_POLICY}
networks:
- internal-network
redis:
image: redis:8.6-alpine
container_name: ministack-redis
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
restart: ${RESTART_POLICY}
networks:
- internal-network
cli:
build:
context: ./docker/cli
dockerfile: Dockerfile.${ENVIRONMENT}
args:
UID: ${UID:-1000}
GID: ${GID:-1000}
USERNAME: ${USERNAME:-developer}
container_name: cli
hostname: cli
volumes:
- ./sources/cli:/home/${USERNAME:-developper}/app
user: "${USERNAME:-developer}"
working_dir: "/home/${USERNAME:-developer}/app"
env_file:
- .env
environment:
- PYTHONDONTWRITEBYTECODE=1 # Évite les fichiers .pyc sur l'hôte
- PYTHONUNBUFFERED=1
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
- AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}
tty: true
stdin_open: true
ports:
- "8000:8000"
networks:
- internal-network
networks:
internal-network:
name: network-${PROJECT_NAME}-${ENVIRONMENT}
driver: bridge
3. Le fichier .env
PROJECT_NAME=ministack
ENVIRONMENT=dev
RESTART_POLICY=no # unless-stopped
UID=1000
GID=1000
USERNAME=michel
AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
AWS_DEFAULT_REGION=us-east-1
Comment l'utilier ?
Tout est dans le README.md ci-dessous :
1. Partie docker
1.1. Build la stack
docker compose build --no-cache
1.2. Lancer la stack
docker compose up -d
1.3. Stopper la stack
docker compose down --volumes
1.4. Reconstruire la stack
docker compose up -d --force-recreate
2. Utiliser la stack
2.1. Créer un projet
docker compose exec cli sh -c "poetry new tests"
2.2. Installer le nécessaire
docker compose exec cli sh -c "cd tests ; poetry add awscli-local awscli boto3 pytest"
2.3. Jouer un script
docker compose exec cli sh -c "cd tests ; poetry run python le_script.py"
Pour la suite
Je vais faire quelques petits tuto pour l'utilisation de la stack (histoire de l'améliorer, de la compléter, ... )