موتو. السخرية من AWS

يعد الاختبار جزءًا لا يتجزأ من عملية التطوير. وفي بعض الأحيان يحتاج المطورون إلى إجراء اختبارات محليًا، قبل إجراء التغييرات.
إذا كان التطبيق يستخدم أمازون ويب سيرفيسز, الثعبان библиотека دراجة نارية مثالي لهذا.
موتو. السخرية من AWS

يمكن الاطلاع على قائمة كاملة لتغطية الموارد هنا.
هناك اللفت على جيثب هوجو بيكادو - خادم الدراجات النارية. صورة جاهزة، إطلاق واستخدام. الفارق الدقيق الوحيد هو أنه بعد الإطلاق، لا AWS لم يتم إنشاء الموارد هناك بعد.

حسنا، هذا سهل بما فيه الكفاية لإصلاحه.

لأنه عند البدء تحتاج إلى تحديد نوع الخدمة (الحياة الفطرية عامل خدمة 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 "Executing bootstrap script." && 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="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 العاري ببساطة.

ويمكنك الاستهزاء بمورد بأكمله عن طريق تشغيل حاوية واحدة:

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

دعونا نحاول ذلك بشكل تفاعلي:

موتو. السخرية من AWS

Работает!

حتى نتمكن من إنشاء docker-compose.yml، مما سيوفر الوقت في اختبار التغييرات:

عامل ميناء-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

في الواقع، يمكن استخدام هذا الأسلوب ليس فقط على الكمبيوتر المحمول الخاص بالمطور. ستساعد الاختبارات الأولية مع النماذج بعد التجميع في التخلص من المشكلات المحتملة عند التشغيل على بيئات التطوير*.

المراجع:

موتوكر ريبو - github.com/picadoh/ Motocker
موتو الريبو - github.com/spulec/moto
مستندات Boto3 - boto3.amazonaws.com/v1/documentation/api/latest/index.html

المصدر: www.habr.com

إضافة تعليق