āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ¨ā§āĻ¨āĻ¯āĻŧāĻ¨ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻāĻāĻāĻŋ āĻ
āĻŦāĻŋāĻā§āĻā§āĻĻā§āĻ¯ āĻ
āĻāĻļāĨ¤ āĻāĻŦāĻ āĻāĻāĻ¨āĻ āĻāĻāĻ¨āĻ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāĻ°ā§āĻĻā§āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻžāĻ° āĻāĻā§ āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧāĻāĻžāĻŦā§ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻžāĻ˛āĻžāĻ¨ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻ¯āĻŧāĨ¤
āĻ¯āĻĻāĻŋ āĻ
ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ
ā§āĻ¯āĻžāĻŽāĻžāĻāĻ¨ āĻāĻ¯āĻŧā§āĻŦ āĻ¸āĻžāĻ°ā§āĻāĻŋāĻ¸ā§āĻ¸, āĻĒāĻžāĻāĻĨāĻ¨ āĻā§āĻ°āĻ¨ā§āĻĨāĻžāĻāĻžāĻ° Moto āĻāĻ āĻāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻā§āĻāĻ¤āĨ¤
āĻ¸āĻŽā§āĻĒāĻĻ āĻāĻāĻžāĻ°ā§āĻ āĻāĻāĻāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ¤āĻžāĻ˛āĻŋāĻāĻž āĻĻā§āĻāĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§
Github āĻāĻāĻāĻŋ āĻļāĻžāĻ˛āĻāĻŽ āĻāĻā§ āĻšā§āĻā§ āĻĒāĻŋāĻāĻžāĻĄā§ -
āĻ āĻŋāĻ āĻāĻā§, āĻāĻāĻŋ āĻ āĻŋāĻ āĻāĻ°āĻž āĻ¯āĻĨā§āĻˇā§āĻ āĻ¸āĻšāĻāĨ¤
āĻ¯ā§āĻšā§āĻ¤ā§ āĻļā§āĻ°ā§ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻĒāĻ¨āĻžāĻā§ āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻžāĻ° āĻ§āĻ°āĻ¨ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ (āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§āĻ˛ 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.
- āĻĢāĻžāĻāĻ˛āĻāĻŋ āĻŽāĻžāĻāĻ¨ā§āĻ āĻāĻ°āĻž āĻšāĻ˛ā§, āĻāĻāĻŋ āĻāĻžāĻ°ā§āĻ¯āĻāĻ° āĻāĻ°āĻž āĻšāĻŦā§āĨ¤
- āĻ¯āĻĻāĻŋ āĻā§āĻ¨ āĻĢāĻžāĻāĻ˛ āĻ¨āĻž āĻĨāĻžāĻā§, āĻŦā§āĻ¯āĻŧāĻžāĻ° āĻŽā§āĻā§ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ¸āĻšāĻāĻāĻžāĻŦā§ āĻļā§āĻ°ā§ āĻšāĻŦā§āĨ¤
āĻāĻŦāĻ, āĻāĻĒāĻ¨āĻŋ āĻāĻāĻāĻŋ āĻ§āĻžāĻ°āĻ āĻāĻžāĻ˛ā§ āĻāĻ°ā§ āĻāĻāĻāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨ āĻāĻĒāĻšāĻžāĻ¸ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨:
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 āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋ, āĻ¯āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻŦāĻžāĻāĻāĻžāĻŦā§:
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* āĻĒāĻ°āĻŋāĻŦā§āĻļā§ āĻāĻ˛āĻžāĻāĻžāĻ˛ā§āĻ¨ āĻ¸āĻŽā§āĻāĻžāĻŦā§āĻ¯ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻĨā§āĻā§ āĻŽā§āĻā§āĻ¤āĻŋ āĻĒā§āĻ¤ā§ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ¤āĻž āĻāĻ°āĻŦā§āĨ¤
āĻ°ā§āĻĢāĻžāĻ°ā§āĻ¨ā§āĻ¸:
āĻŽāĻāĻāĻžāĻ° āĻ°ā§āĻĒā§ -
āĻŽā§āĻā§ āĻ°ā§āĻĒā§ -
Boto3 āĻĄāĻā§āĻ¸ -
āĻāĻ¤ā§āĻ¸: www.habr.com