Moto. Κοροϊδεύοντας το AWS

Η δοκιμή είναι αναπόσπαστο μέρος της διαδικασίας ανάπτυξης. Και μερικές φορές οι προγραμματιστές πρέπει να εκτελούν δοκιμές τοπικά, πριν πραγματοποιήσουν αλλαγές.
Εάν η εφαρμογή χρησιμοποιεί Amazon υπηρεσίες Web, Πύθων библиотека μοτοποδηλάτων τέλειο για αυτό.
Moto. Κοροϊδεύοντας το AWS

Μπορείτε να δείτε μια πλήρη λίστα κάλυψης πόρων εδώ.
Υπάρχει ένα γογγύλι στο Github Ούγκο Πικάδο - moto-server. Έτοιμη εικόνα, εκκίνηση και χρήση. Η μόνη απόχρωση είναι ότι μετά την εκτόξευση, όχι AWS πόροι δεν έχουν ακόμη δημιουργηθεί εκεί.

Λοιπόν, αυτό είναι αρκετά εύκολο να διορθωθεί.

Επειδή κατά την εκκίνηση πρέπει να καθορίσετε τον τύπο της υπηρεσίας (env μεταβλητός MOTO_SERVICE), πρέπει απλώς να περιγράψουμε τη δημιουργία του πόρου.

Ας το αλλάξουμε λίγο εκκίνηση.σ:

Αντί για

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $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
wait

Το τελικό αρχείο είναι:

εκκίνηση.σ

#!/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

Δημιουργούμε μια νέα εικόνα και την εισάγουμε στο μητρώο μας.

Στη συνέχεια, ας γράψουμε, για παράδειγμα, ένα σενάριο προετοιμασίας πόρων Τομέας SWF, χρησιμοποιώντας τη βιβλιοθήκη για εργασία με 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'

Η λογική είναι η εξής:

  • Κατά την εκκίνηση, προσαρτούμε το σενάριό μας /opt/init/bootstrap.py.
  • Εάν το αρχείο είναι προσαρτημένο, θα εκτελεστεί.
  • Εάν δεν υπάρχει αρχείο, ο γυμνός διακομιστής moto θα ξεκινήσει απλώς.

Και, μπορείτε να κοροϊδέψετε έναν ολόκληρο πόρο εκκινώντας ένα κοντέινερ:

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

Ας το δοκιμάσουμε διαδραστικά:

Moto. Κοροϊδεύοντας το AWS

Λειτουργεί!

Έτσι, μπορούμε να δημιουργήσουμε το docker-compose.yml, το οποίο θα εξοικονομήσει χρόνο στις αλλαγές δοκιμής:

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

Στην πραγματικότητα, αυτή η προσέγγιση μπορεί να χρησιμοποιηθεί όχι μόνο σε φορητό υπολογιστή προγραμματιστή. Οι προκαταρκτικές δοκιμές με μακέτες μετά τη συναρμολόγηση θα σας βοηθήσουν να απαλλαγείτε από πιθανά προβλήματα κατά την εκτέλεση σε περιβάλλοντα dev*.

Βιβλιογραφικές αναφορές:

Repo Motocker - github.com/picadoh/motocker
Moto repo - github.com/spulec/moto
Έγγραφα Boto3 - boto3.amazonaws.com/v1/documentation/api/latest/index.html

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο