เดฎเต‹เดŸเตเดŸเต‹. AWS-เดจเต† เดชเดฐเดฟเดนเดธเดฟเด•เตเด•เตเดจเตเดจเต

เดตเดฟเด•เดธเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเดŸเต† เด…เดตเดฟเดญเดพเดœเตเดฏ เด˜เดŸเด•เดฎเดพเดฃเต เดชเดฐเดฟเดถเต‹เดงเดจ. เดšเดฟเดฒเดชเตเดชเต‹เตพ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดจเดŸเดคเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.
เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ เด†เดฎเดธเต‡เดพเตบ เดตเต†เดฌเต เดธเตผเดตเต€เดธเตเด•เตพ, เดชเตˆเดคเตเดคเตบ เดฒเตˆเดฌเตเดฐเดฑเดฟ เดฎเต‡เดพเดŸเตเดŸเต‡เดพเดฐเต เดธเตˆเด•เตเด•เดฟเดณเต เด‡เดคเดฟเดจเต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฃเต.
เดฎเต‹เดŸเตเดŸเต‹. AWS-เดจเต† เดชเดฐเดฟเดนเดธเดฟเด•เตเด•เตเดจเตเดจเต

เดฑเดฟเดธเต‹เดดเตเดธเต เด•เดตเดฑเต‡เดœเดฟเดจเตเดฑเต† เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดฒเดฟเดธเตเดฑเตเดฑเต เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚ เด‡เดตเดฟเดŸเต†.
Github-เตฝ เด’เดฐเต เดŸเต‡เดฃเดฟเดชเตเดชเต เด‰เดฃเตเดŸเต เดนเตเดฏเต‚เด—เต‹ เดชเดฟเด•เตเด•เดพเดกเต‹ - เดฎเต‹เดŸเตเดŸเต‹-เดธเต†เตผเดตเตผ. เดฑเต†เดกเดฟ เด‡เดฎเต‡เดœเต, เดฒเต‹เดžเตเดšเต, เด‰เดชเดฏเต‹เด—เด‚. เดตเดฟเด•เตเดทเต‡เดชเดฃเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚ เด‡เดฒเตเดฒ เดŽเดจเตเดจเดคเดพเดฃเต เดเด• เดจเตเดฏเต‚เดจเตปเดธเต 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.
  • เดซเดฏเตฝ เดฎเตŒเดฃเตเดŸเต เดšเต†เดฏเตเดคเดพเตฝ, เด…เดคเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเด‚.
  • เดซเดฏเดฒเตŠเดจเตเดจเตเด‚ เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดตเต†เดฑเตเด‚ เดฎเต‹เดŸเตเดŸเต‹-เดธเต†เตผเดตเตผ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด‚.

เด•เต‚เดŸเดพเดคเต†, เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดธเดฎเดพเดฐเด‚เดญเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดฎเตเดดเตเดตเตป เด‰เดฑเดตเดฟเดŸเดคเตเดคเต†เดฏเตเด‚ เดชเดฐเดฟเดนเดธเดฟเด•เตเด•เดพเด‚:

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 เด‰เดฃเตเดŸเดพเด•เตเด•เดพเด‚, เด‡เดคเต เดธเดฎเดฏ เดชเดฐเดฟเดถเต‹เดงเดจเดพ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดฒเดพเดญเดฟเด•เตเด•เตเด‚:

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* เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด‰เดฃเตเดŸเดพเด•เดพเดตเตเดจเตเดจ เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเตเด•เตเดคเดฟ เดจเต‡เดŸเดพเตป เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚.

เดฑเต†เดซเดฑเตปเดธเตเด•เตพ:

เดฎเต‹เดŸเตเดŸเต‹เด•เตเด•เตผ เดฑเดฟเดชเตเดชเต‹ - github.com/picadoh/motocker
เดฎเต‹เดŸเตเดŸเต‹ เดฑเดฟเดชเตเดชเต‹ - github.com/spulec/moto
Boto3 เดกเต‹เด•เตโ€Œเดธเต - boto3.amazonaws.com/v1/documentation/api/latest/index.html

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•