Moto. Weep AWS

Les tests font partie intégrante du processus de développement. Et parfois, les développeurs doivent exécuter des tests localement, jusqu'à ce que la modification soit validée.
Si l'application utilise Amazon Web Services , la bibliothèque moto python est idéale pour cela.


Une liste complète de la couverture des ressources peut être trouvée ici .
Github a un navet Hugo Picado - moto-serveur . Image prête, exécutez et utilisez. La seule nuance est qu'après le lancement, aucune ressource AWS n'y a encore été créée.

Eh bien, c'est assez facile à corriger.

Puisqu'au démarrage il faut préciser le type de service ( env de la variable MOTO_SERVICE ), il nous reste à décrire la création de la ressource.

Modifions un peu start.sh :

Au lieu de cela

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT 

Insérer:

 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 

Le fichier résultant est obtenu:

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 


Créez une nouvelle image et insérez-la dans votre registre.

Ensuite, nous écrivons un script d'initialisation de ressource, par exemple, un domaine SWF , en utilisant la bibliothèque pour travailler avec 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' 


La logique est la suivante:

  • Montez au démarrage notre script dans /opt/init/bootstrap.py .
  • Si le fichier est monté, il sera exécuté.
  • S'il n'y a pas de fichier, le serveur moto nu démarrera simplement.

Et, vous pouvez tamponner une ressource entière en lançant un conteneur:

 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 

Nous essayons en mode interactif:



Ça marche!

Ainsi, nous pouvons créer docker-compose.yml, ce qui permettra de gagner du temps sur les tests de modifications:

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 


En fait, non seulement sur l'ordinateur portable du développeur, vous pouvez utiliser cette approche. Les tests préliminaires avec les mokas après l'assemblage aideront à se débarrasser des problèmes possibles lors de l'exécution sur des environnements dev *.

Références:

Dépôt Motocker - github.com/picadoh/motocker
Dépôt de moto - github.com/spulec/moto
Documents Boto3 - boto3.amazonaws.com/v1/documentation/api/latest/index.html

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


All Articles