เชชเชฐเซเชเซเชทเชฃ เช เชตเชฟเชเชพเชธ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เช
เชญเชฟเชจเซเชจ เชญเชพเช เชเซ. เช
เชจเซ เชเซเชเชฒเซเชเชตเชพเชฐ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชจเซ เชซเซเชฐเชซเชพเชฐเซ เชเชฐเชคเชพ เชชเชนเซเชฒเชพ เชธเซเชฅเชพเชจเชฟเช เชธเซเชคเชฐเซ เชชเชฐเซเชเซเชทเชฃเซ เชเชฒเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเซ เชเซ.
เชเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชชเชฏเซเช เชเชฐเซ เชเซ เชเชฎเซเชเซเชจ เชตเซเชฌ เชธเซเชตเชพเช, เช
เชเชเชฐ เชชเซเชธเซเชคเชเชพเชฒเชฏ เชฎเซเชเซ เช เชฎเชพเชเซ เชชเชฐเชซเซเชเซเช.
เชธเชเชธเชพเชงเชจ เชเชตเชฐเซเชเชจเซ เชธเชเชชเซเชฐเซเชฃ เชธเซเชเชฟ เชเซเช เชถเชเชพเชฏ เชเซ
เชเซเชฅเชฌ เชชเชฐ เชธเชฒเชเชฎ เชเซ เชนเซเชฏเซเชเซ เชชเชฟเชเชพเชกเซ -
เช เซเช เชเซ, เชคเซ เช เซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชคเซเช เชธเชฐเชณ เชเซ.
เชถเชฐเซ เชเชฐเชคเซ เชตเชเชคเซ เชคเชฎเชพเชฐเซ เชธเซเชตเชพเชจเซ เชชเซเชฐเชเชพเชฐ เชธเซเชชเชทเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ (เชเชถเชฐเซ เชเชฒ 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 เชฌเชจเชพเชตเซ เชถเชเซเช เชเซเช, เชเซ เชชเชฐเซเชเซเชทเชฃ เชซเซเชฐเชซเชพเชฐเซเชจเซ เชธเชฎเชฏ เชฌเชเชพเชตเชถเซ:
เชกเซเชเชฐ-เชเชเชชเซเช.เชเชฎเชเชฎเชเชฒ
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