Moto. Probamos AWS

La prueba es una parte integral del proceso de desarrollo. A veces, los desarrolladores necesitan ejecutar pruebas localmente antes de realizar el commit de los cambios.
Si la aplicación utiliza Amazon Web Services, python biblioteca moto es ideal para esto.
Moto. Probamos AWS

Puedes ver la lista completa de recursos aquí.
Hay un repositorio en Github Hugo Picado — moto-server. Imagen lista, solo ejecuta y usa. El único detalle es que después de iniciar, no hay AWS recursos creados todavía.

Bueno, eso es bastante fácil de solucionar.

Dado que al iniciar es necesario especificar el tipo de servicio (env variable MOTO_SERVICE), solo nos queda describir la creación del recurso.

Modificamos un poco start.sh:

En lugar de

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Insertamos:

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

El archivo final queda así:

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

Construimos una nueva imagen y la subimos a nuestro registro.

A continuación, escribiré un script para la inicialización del recurso, 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"] = "falso"
os.environ["AWS_SECRET_ACCESS_KEY"] = "falso"

client = boto3.client('swf', region_name='us-west-2', endpoint_url='http://localhost:5000')

try:
    client.register_domain(
        name='test-swf-mock-domain',
        description="Dominio SWF de prueba",
        workflowExecutionRetentionPeriodInDays="10"
    )
except ClientError as e:
    print "El dominio ya existe: ", e.response.get("Error", {}).get("Code")

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

print 'Listo'

La lógica es la siguiente:

  • Montamos nuestro script al iniciar /opt/init/bootstrap.py.
  • Si el archivo está montado, se ejecutará.
  • Si no hay archivo, simplemente se iniciará el moto-server vacío.

Y se puede simular un recurso completo iniciando un solo 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

Probamos en modo interactivo:

Moto. Probamos AWS

¡Funciona!

Así, podemos crear un docker-compose.yml, que ayudará a ahorrar tiempo en las pruebas de cambios:

docker-compose.yml

versión: '3'
servicios:
  s3:
    imagen: picadoh/motocker
    entorno:
      - MOTO_SERVICE=s3
      - MOTO_HOST=10.0.1.2
    puertos:
      - "5002:5000"
    redes:
      motonet:
        ipv4_address: 10.0.1.2
    volúmenes:
      - /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
  swf:
    imagen: picadoh/motocker
    entorno:
      - MOTO_SERVICE=swf
      - MOTO_HOST=10.0.1.3
    puertos:
      - "5001:5000"
    redes:
      motonet:
        ipv4_address: 10.0.1.3
    volúmenes:
      - /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
  ec2:
    imagen: picadoh/motocker
    entorno:
      - MOTO_SERVICE=ec2
      - MOTO_HOST=10.0.1.4
    puertos:
      - "5003:5000"
    redes:
      motonet:
        ipv4_address: 10.0.1.4
    volúmenes:
      - /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
redes:
  motonet:
    controlador: bridge
    ipam:
      configuración:
        - subnet: 10.0.0.0/16

De hecho, este enfoque no solo se puede utilizar en la computadora portátil del desarrollador. Las pruebas preliminares con mocks después de la construcción ayudarán a eliminar posibles problemas al lanzarse en entornos dev*.

Enlaces:

Repositorio de Motocker — github.com/picadoh/motocker
Repositorio de Moto — github.com/spulec/moto
Documentación de Boto3 — boto3.amazonaws.com/v1/documentation/api/latest/index.html

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster