Moto. МокаСм AWS

ВСстовСтС са Π½Π΅Ρ€Π°Π·Ρ€ΠΈΠ²Π½ΠΎ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с процСса Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. Понякога Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ трябва Π΄Π° стартират тСстовСтС Π»ΠΎΠΊΠ°Π»Π½ΠΎ, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° ΠΊΠΎΠΌΠΈΡ‚Π½Π°Ρ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅.
Ако ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Amazon Web Services, python Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° moto ΠΏΠ΅Ρ€Ρ„Π΅ΠΊΡ‚Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠΆΠ΄Π° Π·Π° Ρ‚ΠΎΠ²Π°.
Moto. МокаСм AWS

ΠŸΡŠΠ»Π½ΠΈΡΡ‚ списък с ΠΏΠΎΠΊΡ€ΠΈΡ‚ΠΈ рСсурси ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Ρ‚ΡƒΠΊ.
На Github ΠΈΠΌΠ° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Hugo Picado β€” moto-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