Moto. Zombando da AWS

O teste é parte integrante do processo de desenvolvimento. E às vezes os desenvolvedores precisam executar testes localmente, antes de confirmar as alterações.
Se o aplicativo usar Amazon Web Services, python biblioteca motocicleta perfeito para isso.
Moto. Zombando da AWS

Uma lista completa da cobertura de recursos pode ser visualizada aqui.
Há um nabo no Github Hugo Picado - moto-servidor. Imagem pronta, lançamento e uso. A única ressalva é que após o lançamento, não AWS os recursos ainda não foram criados lá.

Bem, isso é fácil de consertar.

Pois ao iniciar você precisa especificar o tipo de serviço (env variável MOTO_SERVICE), só precisamos descrever a criação do recurso.

Vamos mudar um pouco iniciar.sh:

Em vez de

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 arquivo final é:

iniciar.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 uma nova imagem e a colocamos em nosso registro.

A seguir, vamos escrever um script de inicialização de recursos, por exemplo Domínio SWF, usando a biblioteca para trabalhar com 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ógica é esta:

  • Ao iniciar, montamos nosso script em /opt/init/bootstrap.py.
  • Se o arquivo estiver montado, ele será executado.
  • Se não houver nenhum arquivo, o moto-server simples será simplesmente iniciado.

E você pode simular um recurso inteiro lançando um contêiner:

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

Vamos tentar interativamente:

Moto. Zombando da AWS

Работает!

Portanto, podemos fazer docker-compose.yml, o que economizará tempo testando alterações:

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

Na verdade, essa abordagem não pode ser usada apenas no laptop de um desenvolvedor. Testes preliminares com simulações após a montagem ajudarão a eliminar possíveis problemas ao executar em ambientes dev*.

Links:

Repositório Motocker - github.com/picadoh/motocker
Repositório de moto - github.com/spulec/moto
Documentos do Boto3 - boto3.amazonaws.com/v1/documentation/api/latest/index.html

Fonte: habr.com

Adicionar um comentário