Moto. Мокаем AWS

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

Пълният списък с покрити ресурси може да се види тук.
На Github има репозиторий Hugo Picadomoto-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:
    драйвер: мост
    ipam:
      конфигурация:
        - подсет: 10.0.0.0/16

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

Линкове:

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

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

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