Moto. Мокаем AWS

Тестрането е неразривна част от процеса на разработка. Понякога разработчиците трябва да стартират тестовете локално, преди да ангажират промените.
Ако приложението използва Amazon Web Services, python библиотека moto перфектно отговаря на това.
Moto. Мокаем AWS

Пълен списък с покритие на ресурсите можете да видите тук.
На Github има репо Hugo Picado — moto-server. Готов образ, стартирайте и използвайте. Единственото объркване е, че след стартиране няма AWS ресурси там все още не са създадени.

Е, това е доста лесно да се поправи.

Тъй като трябва да зададете типа на услугата при стартиране (env променливата MOTO_SERVICE), остава само да опишем създаването на ресурса.

Нека променим малко start.sh:

Вместо

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

Вмъкваме:

if [ -f /opt/init/bootstrap.py ]; then
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Изпълнение на скрипта за стартиране." && python /opt/init/bootstrap.py)
else
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait

Крайният файл изглежда така:

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

Създаваме нов образ и го пускаме в собственото си хранилище.

След това ще напишем скрипт за инициализация на ресурса, например SWF домейн, използвайки библиотеката за работа с 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="Тестов SWF домейн",
        workflowExecutionRetentionPeriodInDays="10"
    )
except ClientError as e:
    print "Домейнът вече съществува: ", e.response.get("Error", {}).get("Code")

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

print 'Готов'

Логиката е следната:

  • Монтираме нашия скрипт при стартиране в /opt/init/bootstrap.py.
  • Ако файлът е монтиран — той ще бъде изпълнен.
  • Ако файла няма — ще се стартира просто голият moto-server.

И можем да имитираме целия ресурс, стартирайки един контейнер:

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

Опитваме в интерактивен режим:

Moto. Мокаем AWS

Работи!

По този начин можем да направим docker-compose.yml, който ще помогне за спестяване на време при тестването на промените:

docker-compose.yml

версия: '3'
услуги:
  s3:
    изображение: picadoh/motocker
    окружение:
      - MOTO_SERVICE=s3
      - MOTO_HOST=10.0.1.2
    порты:
      - "5002:5000"
    сети:
      motonet:
        ipv4_address: 10.0.1.2
    тома:
      - /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
  swf:
    изображение: picadoh/motocker
    окружение:
      - MOTO_SERVICE=swf
      - MOTO_HOST=10.0.1.3
    порты:
      - "5001:5000"
    сети:
      motonet:
        ipv4_address: 10.0.1.3
    тома:
      - /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
  ec2:
    изображение: picadoh/motocker
    окружение:
      - MOTO_SERVICE=ec2
      - MOTO_HOST=10.0.1.4
    порты:
      - "5003:5000"
    сети:
      motonet:
        ipv4_address: 10.0.1.4
    тома:
      - /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
сети:
  motonet:
    драйвер: bridge
    ipam:
      конфигурация:
        - подсеть: 10.0.0.0/16

Всъщност, такъв подход може да се използва не само на лаптопа на разработчика. Предварителните тестове с мокове след сборка ще помогнат да се избегнат евентуални проблеми при стартиране в dev* среди.

Връзки:

Repo на Motocker — github.com/picadoh/motocker
Repo на Moto — github.com/spulec/moto
Документация на Boto3 — boto3.amazonaws.com/v1/documentation/api/latest/index.html

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster