Moto. Verspottung von AWS

Tests sind ein integraler Bestandteil des Entwicklungsprozesses. Und manchmal müssen Entwickler Tests lokal ausführen, bevor sie Änderungen vornehmen.
Wenn die Anwendung verwendet Amazon Web Services, python библиотека Motorrad perfekt dafür.
Moto. Verspottung von AWS

Eine vollständige Liste der Ressourcenabdeckung kann angezeigt werden hier.
Auf Github gibt es eine Rübe Hugo Picado - Moto-Server. Fertiges Image, starten und verwenden. Die einzige Nuance ist, dass nach dem Start nein AWS Ressourcen wurden dort noch nicht erstellt.

Nun, das lässt sich leicht beheben.

Da Sie beim Start die Art des Dienstes angeben müssen (env Variable MOTO_SERVICE), müssen wir nur die Erstellung der Ressource beschreiben.

Lass es uns ein wenig ändern start.sh:

Statt

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Einfügen:

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

Die endgültige Datei ist:

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

Wir erstellen ein neues Image und übertragen es in unsere Registrierung.

Als Nächstes schreiben wir beispielsweise ein Ressourceninitialisierungsskript SWF-Domäne, Verwendung der Bibliothek für die Arbeit mit 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'

Die Logik ist folgende:

  • Zu Beginn mounten wir unser Skript /opt/init/bootstrap.py.
  • Wenn die Datei gemountet ist, wird sie ausgeführt.
  • Wenn keine Datei vorhanden ist, wird einfach der nackte Moto-Server gestartet.

Und Sie können eine ganze Ressource verspotten, indem Sie einen Container starten:

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

Probieren wir es interaktiv aus:

Moto. Verspottung von AWS

Es funktioniert!

So können wir docker-compose.yml erstellen, was Zeit beim Testen von Änderungen spart:

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

Tatsächlich kann dieser Ansatz nicht nur auf dem Laptop eines Entwicklers verwendet werden. Vorläufige Tests mit Mocks nach dem Zusammenbau helfen dabei, mögliche Probleme bei der Ausführung in Entwicklungsumgebungen zu beseitigen.

Links:

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

Source: habr.com

Kommentar hinzufügen