O teste é uma parte importante do processo de desenvolvimento. E, às vezes, os desenvolvedores precisam executar testes localmente, antes de confirmar as alterações.
Se seu aplicativo usa o
Amazon Web Services , a biblioteca
python moto é a coisa perfeita para isso.

A lista completa da cobertura da implementação está
aqui .
Encontrei o repositório de
Hugo Picado no Github -
moto-server . Pronto para começar a usar a imagem. A única nuance é que, após o lançamento, nenhum recurso da
AWS será criado.
Bem, é muito fácil corrigi-lo.
Enquanto devemos definir a variável de ambiente
MOTO_SERVICE para especificar o tipo de recurso no lançamento, tudo o que resta é definir a criação de recursos.
Atualize
start.sh :
Substitua
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
com
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 deve ser como:
Crie uma nova imagem e envie-a para o seu registro.
Além disso, vamos criar um script de inicialização de recursos, usando a biblioteca para trabalhar com a AWS - boto3. Por exemplo,
domínio SWF :
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'
Logicamente:
- Monte nosso script de inicialização em /opt/init/bootstrap.py
- Se o arquivo estiver montado - ele será executado
- Caso contrário, o único servidor de moto será lançado
Portanto, podemos zombar de todo o recurso executando apenas 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 no modo interativo:

Isso funciona!
Assim, podemos criar o docker-compose.yml, que pode ajudar a economizar tempo para testar 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
A propósito, podemos usar essa abordagem não apenas no laptop do desenvolvedor. Testes preliminares com zombarias após a compilação nos ajudarão a eliminar possíveis problemas nos ambientes dev *.
Ligações:
Repositório do
Motocker -
github.com/picadoh/motockerRepo moto -
github.com/spulec/motoDocumentos do
Boto3 -
boto3.amazonaws.com/v1/documentation/api/latest/index.html