Moto. Burlándose de AWS

Las pruebas son una parte integral del proceso de desarrollo. Y, a veces, los desarrolladores necesitan ejecutar pruebas localmente antes de realizar cambios.
Si la aplicación utiliza Amazon Web Services, pitón библиотека movimiento perfecto para esto.
Moto. Burlándose de AWS

Se puede ver una lista completa de la cobertura de recursos. aquí.
Hay un nabo en Github Hugo Picado - servidor-moto. Imagen lista, lanzamiento y uso. El único matiz es que después del lanzamiento, no AWS Los recursos aún no se han creado allí.

Bueno, eso es bastante fácil de arreglar.

Ya que al iniciar es necesario especificar el tipo de servicio (env variable MOTO_SERVICIO), solo tenemos que describir la creación del recurso.

Cambiémoslo un poco inicio.sh:

En lugar de

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Insertar:

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

El archivo final es:

inicio.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

Construimos una nueva imagen y la insertamos en nuestro registro.

A continuación, escribamos un script de inicialización de recursos, por ejemplo. Dominio SWF, utilizando la biblioteca para trabajar con 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 lógica es esta:

  • Al iniciar montamos nuestro script en /opt/init/bootstrap.py.
  • Si el archivo está montado, se ejecutará.
  • Si no hay ningún archivo, el servidor moto simplemente se iniciará.

Y puedes burlarte de un recurso completo lanzando un contenedor:

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

Probémoslo de forma interactiva:

Moto. Burlándose de AWS

Работает!

Entonces podemos crear docker-compose.yml, lo que ahorrará tiempo probando cambios:

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 realidad, este enfoque se puede utilizar no sólo en la computadora portátil de un desarrollador. Las pruebas preliminares con simulacros después del ensamblaje ayudarán a eliminar posibles problemas al ejecutar en entornos de desarrollo*.

Enlaces:

repositorio de Motocker - github.com/picadoh/motocker
repositorio de motos - github.com/spulec/moto
Boto3 Documentos - boto3.amazonaws.com/v1/documentation/api/latest/index.html

Fuente: habr.com

Añadir un comentario