เชฎเซ‹เชŸเซ‹. AWS เชจเซ€ เชฎเชœเชพเช• เช‰เชกเชพเชตเซ€

เชชเชฐเซ€เช•เซเชทเชฃ เช เชตเชฟเช•เชพเชธ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‹ เช…เชญเชฟเชจเซเชจ เชญเชพเช— เช›เซ‡. เช…เชจเซ‡ เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ เชธเซเชฅเชพเชจเชฟเช• เชธเซเชคเชฐเซ‡ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ‡ เช›เซ‡.
เชœเซ‹ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เชเชฎเซ‡เชเซ‹เชจ เชตเซ‡เชฌ เชธเซ‡เชตเชพเช“, เช…เชœเช—เชฐ เชชเซเชธเซเชคเช•เชพเชฒเชฏ เชฎเซ‹เชŸเซ‹ เช† เชฎเชพเชŸเซ‡ เชชเชฐเชซเซ‡เช•เซเชŸ.
เชฎเซ‹เชŸเซ‹. AWS เชจเซ€ เชฎเชœเชพเช• เช‰เชกเชพเชตเซ€

เชธเช‚เชธเชพเชงเชจ เช•เชตเชฐเซ‡เชœเชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซ‚เชšเชฟ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡ เช…เชนเซ€เช‚.
เช—เซ€เชฅเชฌ เชชเชฐ เชธเชฒเช—เชฎ เช›เซ‡ เชนเซเชฏเซเช—เซ‹ เชชเชฟเช•เชพเชกเซ‹ - เชฎเซ‹เชŸเซ‹-เชธเชฐเซเชตเชฐ. เชคเซˆเชฏเชพเชฐ เช›เชฌเซ€, เชฒเซ‹เชจเซเชš เช…เชจเซ‡ เช‰เชชเชฏเซ‹เช—. เชเช•เชฎเชพเชคเซเชฐ เชธเซ‚เช•เซเชทเซเชฎเชคเชพ เช เช›เซ‡ เช•เซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชจเชพ 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 เชฌเชจเชพเชตเซ€ เชถเช•เซ€เช เช›เซ€เช, เชœเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‹ เชธเชฎเชฏ เชฌเชšเชพเชตเชถเซ‡:

เชกเซ‹เช•เชฐ-เช•เช‚เชชเซ‹เช.เชเชฎเชเชฎเชเชฒ

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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹