الدراجات النارية. يبكي AWS

الاختبار جزء لا يتجزأ من عملية التطوير. وأحيانًا يحتاج المطورون إلى تشغيل الاختبارات محليًا ، حتى يلتزم التغيير.
إذا كان التطبيق يستخدم Amazon Web Services ، فإن مكتبة python moto تعتبر مثالية لهذا الغرض.


يمكن الاطلاع هنا على قائمة كاملة بتغطية الموارد.
Github لديه اللفت هوغو بيكادو - موتو خادم . صورة جاهزة ، تشغيل واستخدام. الفرق الوحيد هو أنه بعد الإطلاق ، لم يتم إنشاء موارد 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 "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 (eg 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 .
  • إذا تم تحميل الملف ، فسيتم تنفيذه.
  • إذا لم يكن هناك ملف ، فسيبدأ تشغيل خادم الدراجات العارية ببساطة.

ويمكنك تخصيص مورد بالكامل من خلال تشغيل حاوية واحدة:

 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 

نحن نحاول في الوضع التفاعلي:



إنه يعمل!

وبالتالي ، يمكننا أن نجعل 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 


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

المراجع:

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

Source: https://habr.com/ru/post/ar454334/


All Articles