Moto. Мокаємо AWS

Тестування – це невід'ємна частина процесу розробки. І іноді розробникам потрібно запустити тести локально до того моменту комміту змін.
Якщо програма використовує Amazon Web Services, пітон бібліотека мото ідеально для цього підходить.
Moto. Мокаємо AWS

Повний список покриття ресурсів можна переглянути тут.
На Github є ріпа Hugo Picado - moto-server. Готовий образ, запускай та використовуй. Нюанс тільки в тому, що після запуску ніяких AWS ресурсів там ще створено.

Що ж, це досить просто виправити.

Оскільки під час запуску необхідно вказати тип сервісу (env змінної MOTO_SERVICE), нам залишається описати створення ресурсу.

Трохи змінимо початок.ш:

замість

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 "Executing bootstrap script." && python /opt/init/bootstrap.py)
else
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait

Підсумковий файл виходить:

початок.ш

#!/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

Білдимо новий образ і пушимо у свій registre.

Далі, напишемо скрипт ініціалізації ресурсу, наприклад SWF domain, використовуючи бібліотеку для роботи з 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'

Логіка така:

  • Монтуємо при запуску наш скрипт у /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, який допоможе заощадити час на тестування змін:

докер-компост.імл

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

Власне, не тільки на ноутбуці розробника можна використовувати такий підхід. Попередні тести з моками після збирання допоможуть позбутися можливих проблем при запуску на dev* оточеннях.

Посилання:

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

Джерело: habr.com

Додати коментар або відгук