Moto. Mock aws

Testen ist ein wichtiger Teil des Entwicklungsprozesses. Und manchmal müssen Entwickler Tests lokal ausführen, bevor sie Änderungen vornehmen können.

Wenn Ihre Anwendung Amazon Web Services verwendet , ist Python Library Moto die perfekte Lösung dafür.



Die vollständige Liste der Implementierungsabdeckung finden Sie hier .

Ich habe das Repo von Hugo Picado auf Github gefunden - Moto-Server . Bereit, das Bild zu starten und zu verwenden. Die einzige Nuance ist, dass nach dem Start keine AWS- Ressourcen erstellt werden.

Nun, es ist ziemlich einfach, das Problem zu beheben.

Während wir die env- Variable MOTO_SERVICE definieren müssen , um den Ressourcentyp beim Start anzugeben, müssen wir nur noch die Ressourcenerstellung definieren.

Update start.sh :

Ersetzen

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT 

mit

 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 Datei sollte wie folgt aussehen:

start.sh
 #!/bin/sh # validate required input if [ -z "$MOTO_SERVICE" ]; then echo "Please define AWS service to run with Moto Server (eg 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 


Erstellen Sie ein neues Image und übertragen Sie es in Ihre Registrierung.

Lassen Sie uns außerdem ein Skript zur Ressourceninitialisierung erstellen und die Bibliothek für die Arbeit mit AWS - boto3 verwenden. ZB SWF-Domain :

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' 


Logischerweise:

  • Hängen Sie unser Bootstrap-Skript in /opt/init/bootstrap.py ein
  • Wenn die Datei gemountet ist, wird sie ausgeführt
  • Wenn nicht, wird der einzige Moto-Server gestartet

Wir können also die gesamte Ressource verspotten, indem wir nur einen Container ausführen:

 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 

Versuchen wir es im interaktiven Modus:



Es funktioniert!

Auf diese Weise können wir docker-compose.yml erstellen, um Zeit beim Testen von Änderungen zu sparen:

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 


Übrigens können wir diesen Ansatz nicht nur auf dem Laptop des Entwicklers anwenden. Vorläufige Tests mit Mocks nach dem Build helfen uns, mögliche Probleme in den dev * -Umgebungen zu beseitigen.

Links:

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

Source: https://habr.com/ru/post/de454892/


All Articles