Moto. Burlándose de AWS

As probas son parte integrante do proceso de desenvolvemento. E ás veces os desenvolvedores precisan realizar probas localmente antes de realizar cambios.
Se a aplicación usa Servizos web de Amazon, python biblioteca moto perfecto para isto.
Moto. Burlándose de AWS

Pódese ver unha lista completa da cobertura de recursos aquí.
Hai un nabo en Github Hugo Picado - moto-servidor. Imaxe lista, lanzamento e uso. O único matiz é que despois do lanzamento, non AWS alí aínda non se crearon recursos.

Ben, iso é o suficientemente sinxelo de arranxar.

Xa que ao comezar cómpre especificar o tipo de servizo (aprox variable MOTO_SERVICE), só temos que describir a creación do recurso.

Cambiémolo un pouco comezar.sh:

Pola contra

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Inserir:

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

O ficheiro final é:

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

Construímos unha nova imaxe e introducímola no noso rexistro.

A continuación, imos escribir un script de inicialización de recursos, por exemplo dominio SWF, usando a biblioteca para traballar 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'

A lóxica é esta:

  • Ao comezar, montamos o noso script /opt/init/bootstrap.py.
  • Se o ficheiro está montado, executarase.
  • Se non hai ficheiros, o servidor moto-servidor simple iniciarase.

E podes burlarte dun recurso enteiro lanzando un contedor:

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émolo de forma interactiva:

Moto. Burlándose de AWS

Funciona!

Así, podemos facer docker-compose.yml, o que aforrará tempo probando os 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 realidade, este enfoque pódese usar non só no portátil dun programador. As probas preliminares con simulacros despois da montaxe axudarán a desfacerse dos posibles problemas ao executar en ambientes de desenvolvemento*.

Referencias:

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

Fonte: www.habr.com

Engadir un comentario