Moto. Mocking AWS

Testarea este o parte esențială a procesului de dezvoltare. Uneori, dezvoltatorii au nevoie să ruleze teste local, înainte de a comite modificările.
Dacă aplicația folosește Amazon Web Services, python biblioteca moto este perfect pentru asta.
Moto. Mocking AWS

Lista completă a resurselor disponibile poate fi consultată aici.
Pe Github există un repo Hugo Picado — moto-server. O imagine gata, rulează și folosește-o. Singura problemă este că, după rulare, nu sunt create încă niciun fel de AWS resurse acolo.

Ei bine, asta se poate remedia ușor.

Deoarece la pornire trebuie specificat tipul de serviciu (env variabila MOTO_SERVICE), ne rămâne să descriem crearea resursei.

Să modificăm puțin start.sh:

În loc de

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Inserăm:

if [ -f /opt/init/bootstrap.py ]; then
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Executând scriptul de bootstrap." && python /opt/init/bootstrap.py)
else
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait

Fișierul rezultat este:

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

Construim o nouă imagine și o împingem în registrul nostru.

Apoi, vom scrie un script de inițializare a resursei, de exemplu domeniul SWF, folosind biblioteca pentru interacțiune cu 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="Domeniu SWF de test",
        workflowExecutionRetentionPeriodInDays="10"
    )
except ClientError as e:
    print "Domeniul există deja: ", e.response.get("Error", {}).get("Code")

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

print 'Gata'

Logica este:

  • Montăm scriptul nostru la pornire /opt/init/bootstrap.py.
  • Dacă fișierul este montat — va fi executat.
  • Dacă fișierul nu există — va porni doar moto-serverul gol.

Și, putem simula o resursă întreagă prin rularea unui singur 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

Să încercăm în modul interactiv:

Moto. Mocking AWS

Funcționează!

Astfel, putem crea un docker-compose.yml, care va ajuta la economisirea timpului pentru testarea modificărilor:

docker-compose.yml

versiune: '3'
servicii:
  s3:
    imagine: picadoh/motocker
    mediu:
      - MOTO_SERVICE=s3
      - MOTO_HOST=10.0.1.2
    porturi:
      - "5002:5000"
    rețele:
      motonet:
        ipv4_address: 10.0.1.2
    volume:
      - /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
  swf:
    imagine: picadoh/motocker
    mediu:
      - MOTO_SERVICE=swf
      - MOTO_HOST=10.0.1.3
    porturi:
      - "5001:5000"
    rețele:
      motonet:
        ipv4_address: 10.0.1.3
    volume:
      - /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
  ec2:
    imagine: picadoh/motocker
    mediu:
      - MOTO_SERVICE=ec2
      - MOTO_HOST=10.0.1.4
    porturi:
      - "5003:5000"
    rețele:
      motonet:
        ipv4_address: 10.0.1.4
    volume:
      - /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
rețele:
  motonet:
    driver: bridge
    ipam:
      config:
        - subnet: 10.0.0.0/16

De fapt, această abordare nu este limitată doar la laptopul dezvoltatorului. Testele preliminare cu mock-uri după build vor ajuta la evitarea posibilelor probleme la rulare în medii dev*.

Linkuri:

Repo Motocker — github.com/picadoh/motocker
Repo Moto — github.com/spulec/moto
Documentația Boto3 — boto3.amazonaws.com/v1/documentation/api/latest/index.html

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster