Moto. Hånende AWS

Testing er en integrert del av utviklingsprosessen. Og noen ganger må utviklere kjøre tester lokalt før de foretar endringer.
Hvis applikasjonen bruker Amazon Web Services, python библиотека moto perfekt for dette.
Moto. Hånende AWS

En fullstendig liste over ressursdekning kan sees her.
Det er en nepe på Github Hugo Picado - moto-server. Klart bilde, lansering og bruk. Den eneste nyansen er at etter lansering, nei AWS ressurser er ennå ikke opprettet der.

Vel, det er lett nok å fikse.

Siden du starter må du spesifisere typen tjeneste (env variabel MOTO_SERVICE), må vi bare beskrive opprettelsen av ressursen.

La oss endre det litt start.sh:

I stedet for

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Sett inn:

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

Den endelige filen er:

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

Vi bygger et nytt bilde og skyver det inn i registeret vårt.

La oss deretter skrive et ressursinitialiseringsskript, for eksempel SWF-domene, bruker biblioteket for å jobbe med 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'

Logikken er denne:

  • Når vi starter, monterer vi skriptet vårt /opt/init/bootstrap.py.
  • Hvis filen er montert, vil den bli utført.
  • Hvis det ikke er noen fil, starter den bare moto-serveren.

Og du kan håne en hel ressurs ved å starte én beholder:

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

La oss prøve det interaktivt:

Moto. Hånende AWS

Det fungerer!

Så vi kan lage docker-compose.yml, som vil spare tid på å teste endringer:

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

Faktisk kan denne tilnærmingen brukes ikke bare på en utviklers bærbare datamaskin. Foreløpige tester med mocks etter montering vil bidra til å bli kvitt mulige problemer når du kjører på dev*-miljøer.

referanser:

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

Kilde: www.habr.com

Legg til en kommentar