Moto. Mocking AWS

Testning er en uundgåelig del af udviklingsprocessen. Og nogle gange har udviklere brug for at køre tests lokalt, før de forpligter ændringer.
Hvis applikationen bruger Amazon Web Services, python biblioteket moto er perfekt til dette.
Moto. Mocking AWS

Du kan se den komplette liste over dækning af ressourcer her.
Der er en repo på Github Hugo Picado — moto-server. En klar image, start og brug. Det eneste er, at efter starten er der ingen AWS ressourcer oprettet der endnu.

Nå, det er ret nemt at rette.

Da det er nødvendigt at angive servicetypen ved opstart (env variabel MOTO_SERVICE), er vi tilbage til at beskrive oprettelsen af ressourcen.

Lad os ændre lidt på start.sh:

I stedet for

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Indsæt:

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

Den endelige fil bliver:

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

Bygger et nyt image og skubber til dit registry.

Dernæst skriver vi et initialiseringsscript for ressourcen, f.eks. SWF domæne, ved at bruge biblioteket til 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 domæne",
        workflowExecutionRetentionPeriodInDays="10"
    )
except ClientError as e:
    print "Domænet eksisterer allerede: ", e.response.get("Error", {}).get("Code")

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

print 'Klar'

Logikken er sådan:

  • Vi monterer vores script ved opstart i /opt/init/bootstrap.py.
  • Hvis filen er monteret — vil den blive eksekveret.
  • Hvis filen ikke findes — vil det bare starte en ren moto-server.

Og vi kan simulerer en hel ressource ved at starte en container:

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

Lad os prøve i interaktiv tilstand:

Moto. Mocking AWS

Det virker!

Dermed kan vi lave en docker-compose.yml, der vil hjælpe med at spare tid på at teste ændringer:

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

Faktisk kan denne tilgang ikke kun bruges på udviklerens laptop. Forudgående tests med mocks efter bygningen vil hjælpe med at undgå mulige problemer, når de køres i dev* miljøer.

Links:

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

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster