mkdevs

[ TWITTER ] [ FACEBOOK ] [ GITHUB ] [ LINKEDIN ]

Bienvenue sur mkdevs



🎓 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 ?

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, ... )