Moto. Mockar AWS

Testning Àr en vÀsentlig del av utvecklingsprocessen. Ibland behöver utvecklare köra tester lokalt före de gör en commit av Àndringar.
Om applikationen anvÀnder Amazon Web Services, python biblioteket moto Àr perfekt för detta.
Moto. Mockar AWS

Du kan se hela listan över resursövervakning ). Ett typiskt exempel pÄ anvÀndning:.
Det finns ett repo pĂ„ Github Hugo Picado — moto-server. En fĂ€rdig bild, starta och anvĂ€nd. Det enda som krĂ€vs Ă€r att efter uppstarten, inga AWS resurser har skapats dĂ€r Ă€nnu.

NÄvÀl, det Àr ganska lÀtt att lösa.

Eftersom det Àr nödvÀndigt att ange typen av tjÀnst (env variabeln MOTO_SERVICE), mÄste vi beskriva skapandet av resursen.

LÄt oss Àndra lite pÄ start.sh:

IstÀllet för

moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT

SĂ€tt in:

if [ -f /opt/init/bootstrap.py ]; then
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Kör bootstrap-skriptet." && python /opt/init/bootstrap.py)
else
  moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait

Den slutgiltiga filen blir:

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

Vi bygger en ny bild och pushar till vÄrt registry.

DĂ€refter skriver vi ett skript för att initiera resursen, till exempel SWF-domĂ€n, med hjĂ€lp av biblioteket för att arbeta med 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-domÀn",
        workflowExecutionRetentionPeriodInDays="10"
    )
except ClientError as e:
    print "DomÀnen finns redan: ", e.response.get("Error", {}).get("Code")

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

print 'Klar'

Logiken Àr följande:

  • Vi monterar vĂ„rt skript vid uppstart i /opt/init/bootstrap.py.
  • Om filen Ă€r monterad — kommer den att köras.
  • Om filen inte finns — kommer bara en ren moto-server att starta.

Och vi kan mocks en hel resurs genom att starta en enda container:

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

LÄt oss prova i interaktivt lÀge:

Moto. Mockar AWS

Det fungerar!

SÄ, vi kan skapa en docker-compose.yml, som hjÀlper till att spara tid pÄ att testa Àndringar:

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

Egentligen kan man inte bara anvÀnda en sÄdan metod pÄ utvecklarens bÀrbara dator. Förhandsprov med mocks efter bygget hjÀlper till att bli av med möjliga problem vid körning i dev* miljöer.

LĂ€nkar:

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

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster