Moto. We testen AWS

Testen is een essentieel onderdeel van het ontwikkelingsproces. Soms moeten ontwikkelaars tests lokaal uitvoeren, voordat ze wijzigingen committen.
Als de applicatie gebruikmaakt van Amazon Web Services, python bibliotheek moto is hier perfect voor.
Moto. We testen AWS

De volledige lijst met ondersteunde resources kan bekeken worden here.
Op Github is er een repository Hugo Picado — moto-server. Een kant-en-klaar beeld, start en gebruik het. Het enige punt is dat er na de start nog geen AWS resources zijn aangemaakt.

Nou, dat is vrij eenvoudig op te lossen.

Aangezien we bij het starten het type service moeten opgeven (env variabele MOTO_SERVICE), moeten we het aanmaken van de resource beschrijven.

Laten we start.sh:

In plaats van

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Toevoegen:

if [ -f /opt/init/bootstrap.py ]; then
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Script voor initialisatie uitvoeren." && python /opt/init/bootstrap.py)
else
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait

Het eindresultaat is dan:

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

We bouwen een nieuw beeld en pushen dit naar onze registry.

Vervolgens schrijven we een script voor het initialiseren van de resource, bijvoorbeeld SWF domein, met gebruik van de bibliotheek voor de interactie met 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 domein",
        workflowExecutionRetentionPeriodInDays="10"
    )
except ClientError as e:
    print "Domein bestaat al: ", e.response.get("Error", {}).get("Code")

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

print 'Klaar'

De logica is als volgt:

  • We monteren ons script bij de start in /opt/init/bootstrap.py.
  • Als het bestand is gemonteerd, wordt het uitgevoerd.
  • Als het bestand niet bestaat, zal alleen de kale moto-server worden gestart.

En we kunnen een hele resource mocken door slechts één container te 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

Laten we het in interactieve modus proberen:

Moto. We testen AWS

Werkt!

Zo kunnen we een docker-compose.yml maken, die tijd bespaart bij het testen van wijzigingen:

docker-compose.yml

versie: '3'
diensten:
  s3:
    afbeelding: picadoh/motocker
    omgeving:
      - MOTO_SERVICE=s3
      - MOTO_HOST=10.0.1.2
    poorten:
      - "5002:5000"
    netwerken:
      motonet:
        ipv4_adres: 10.0.1.2
    volumes:
      - /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
  swf:
    afbeelding: picadoh/motocker
    omgeving:
      - MOTO_SERVICE=swf
      - MOTO_HOST=10.0.1.3
    poorten:
      - "5001:5000"
    netwerken:
      motonet:
        ipv4_adres: 10.0.1.3
    volumes:
      - /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
  ec2:
    afbeelding: picadoh/motocker
    omgeving:
      - MOTO_SERVICE=ec2
      - MOTO_HOST=10.0.1.4
    poorten:
      - "5003:5000"
    netwerken:
      motonet:
        ipv4_adres: 10.0.1.4
    volumes:
      - /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
netwerken:
  motonet:
    driver: brug
    ipam:
      config:
        - subnet: 10.0.0.0/16

Eigenlijk is deze aanpak niet alleen voor de laptop van de ontwikkelaar. Voorlopige tests met mocks na de bouw helpen mogelijke problemen bij de executie in dev* omgevingen te voorkomen.

Links:

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

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster