Moto. Výsměch AWS

Testování je nedílnou součástí vývojového procesu. A někdy musí vývojáři před provedením změn provést testy lokálně.
Pokud aplikace používá Amazon Web Services, krajta библиотека moto ideální pro toto.
Moto. Výsměch AWS

Můžete si prohlédnout úplný seznam pokrytí zdrojů zde.
Na Githubu je tuřín Hugo Picado - moto-server. Připravený obrázek, spuštění a použití. Jediná nuance je, že po spuštění ne AWS zdroje tam ještě nebyly vytvořeny.

No, to je dost snadné napravit.

Protože při spouštění musíte určit typ služby (env proměnná MOTO_SERVICE), musíme jen popsat vytvoření zdroje.

Pojďme to trochu změnit start.sh:

Místo toho

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Vložit:

if [ -f /opt/init/bootstrap.py ]; then
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Executing bootstrap script." && python /opt/init/bootstrap.py)
else
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait

Konečný soubor je:

start.sh

#!/bin/sh

# validate required input
if [ -z "$MOTO_SERVICE" ]; then
  echo "Please define AWS service to run with Moto Server (e.g. s3, ec2, etc)"
  exit 1
fi

# setting defaults for optional input
if [ -z "$MOTO_HOST" ]; then
  MOTO_HOST="0.0.0.0"
fi

if [ -z "$MOTO_PORT" ]; then
  MOTO_PORT="5000"
fi

echo "Starting service $MOTO_SERVICE at $MOTO_HOST:$MOTO_PORT"

if [ -f /opt/init/bootstrap.py ]; then
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Executing bootstrap script." && python /opt/init/bootstrap.py)
else
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
# Prevent container from exiting when bootstrap.py finishing
wait

Vytvoříme novou image a vložíme ji do našeho registru.

Dále napíšeme například inicializační skript prostředku doména SWF, pomocí knihovny pro práci s AWS - boto3:

bootstrap_swf.py

import boto3
from botocore.exceptions import ClientError
import os

os.environ["AWS_ACCESS_KEY_ID"] = "fake"
os.environ["AWS_SECRET_ACCESS_KEY"] = "fake"

client = boto3.client('swf', region_name='us-west-2', endpoint_url='http://localhost:5000')

try:
    client.register_domain(
        name='test-swf-mock-domain',
        description="Test SWF domain",
        workflowExecutionRetentionPeriodInDays="10"
    )
except ClientError as e:
    print "Domain already exists: ", e.response.get("Error", {}).get("Code")

response = client.list_domains(
    registrationStatus='REGISTERED',
    maximumPageSize=123,
    reverseOrder=True|False
)

print 'Ready'

Logika je tato:

  • Při spuštění připojíme náš skript /opt/init/bootstrap.py.
  • Pokud je soubor připojen, bude spuštěn.
  • Pokud neexistuje žádný soubor, jednoduše se spustí holý moto-server.

A můžete zesměšnit celý zdroj spuštěním jednoho kontejneru:

docker run --name swf -d 
    -e MOTO_SERVICE=swf 
    -e MOTO_HOST=0.0.0.0 
    -e MOTO_PORT=5000 
    -p 5001:5000 
    -v /tmp/bootstrap_swf.py:/opt/init/bootstrap.py 
    -i awesome-repo.com/moto-server:latest

Zkusme to interaktivně:

Moto. Výsměch AWS

Funguje to!

Můžeme tedy vytvořit docker-compose.yml, což ušetří čas při testování změn:

docker-compose.yml

version: '3'
services:
  s3:
    image: picadoh/motocker
    environment:
      - MOTO_SERVICE=s3
      - MOTO_HOST=10.0.1.2
    ports:
      - "5002:5000"
    networks:
      motonet:
        ipv4_address: 10.0.1.2
    volumes:
      - /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
  swf:
    image: picadoh/motocker
    environment:
      - MOTO_SERVICE=swf
      - MOTO_HOST=10.0.1.3
    ports:
      - "5001:5000"
    networks:
      motonet:
        ipv4_address: 10.0.1.3
    volumes:
      - /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
  ec2:
    image: picadoh/motocker
    environment:
      - MOTO_SERVICE=ec2
      - MOTO_HOST=10.0.1.4
    ports:
      - "5003:5000"
    networks:
      motonet:
        ipv4_address: 10.0.1.4
    volumes:
      - /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
networks:                             
  motonet:                          
    driver: bridge                
    ipam:                         
      config:                       
        - subnet: 10.0.0.0/16

Ve skutečnosti lze tento přístup použít nejen na vývojářském notebooku. Předběžné testy s maketami po sestavení pomohou zbavit se možných problémů při běhu v prostředích dev*.

Odkazy:

Motocker repo - github.com/picadoh/motocker
Moto repo - github.com/spulec/moto
Dokumenty Boto3 - boto3.amazonaws.com/v1/documentation/api/latest/index.html

Zdroj: www.habr.com

Přidat komentář