Moto. Posmehovanje AWS

Testiranje je sestavni del razvojnega procesa. In včasih morajo razvijalci izvajati teste lokalno, preden potrdijo spremembe.
Če aplikacija uporablja Amazon Web Services, python библиотека moto kot nalašč za to.
Moto. Posmehovanje AWS

Ogledate si lahko celoten seznam pokritosti virov tukaj.
Na Githubu je repa Hugo Picado - moto-strežnik. Pripravljena slika, zagon in uporaba. Edina niansa je, da po zagonu št AWS viri tam še niso ustvarjeni.

No, to je enostavno popraviti.

Ker morate ob zagonu določiti vrsto storitve (env spremenljivka MOTO_SERVIS), opisati moramo le ustvarjanje vira.

Spremenimo ga malo start.sh:

Namesto

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Vstavi:

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

Končna datoteka je:

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

Izdelamo novo sliko in jo potisnemo v naš register.

Nato napišimo na primer skript za inicializacijo vira SWF domena, z uporabo knjižnice za delo z 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'

Logika je naslednja:

  • Ob zagonu priklopimo naš skript /opt/init/bootstrap.py.
  • Če je datoteka nameščena, bo izvedena.
  • Če datoteke ni, se bo goli moto-strežnik preprosto zagnal.

Poleg tega se lahko norčujete iz celotnega vira tako, da zaženete en vsebnik:

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

Poskusimo interaktivno:

Moto. Posmehovanje AWS

Deluje!

Tako lahko naredimo docker-compose.yml, kar bo prihranilo čas pri testiranju sprememb:

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

Pravzaprav je ta pristop mogoče uporabiti ne samo na prenosnem računalniku razvijalca. Preliminarni preizkusi z lažnimi različicami po sestavljanju bodo pomagali odpraviti morebitne težave pri izvajanju v razvijalskih* okoljih.

Reference:

Motocker repo - github.com/picadoh/motocker
Moto repo - github.com/spulec/moto
Dokumenti Boto3 - boto3.amazonaws.com/v1/documentation/api/latest/index.html

Vir: www.habr.com

Dodaj komentar