āĻŽā§‹āĻŸā§‹ āĻ‰āĻĒāĻšāĻžāĻ¸ AWS

āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ‰āĻ¨ā§āĻ¨āĻ¯āĻŧāĻ¨ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻŦāĻŋāĻšā§āĻ›ā§‡āĻĻā§āĻ¯ āĻ…āĻ‚āĻļāĨ¤ āĻāĻŦāĻ‚ āĻ•āĻ–āĻ¨āĻ“ āĻ•āĻ–āĻ¨āĻ“ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻžāĻ° āĻ†āĻ—ā§‡ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧāĨ¤
āĻ¯āĻĻāĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻŽāĻžāĻœāĻ¨ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ¸āĻžāĻ°ā§āĻ­āĻŋāĻ¸ā§‡āĻ¸, āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻ—ā§āĻ°āĻ¨ā§āĻĨāĻžāĻ—āĻžāĻ° Moto āĻāĻ‡ āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ–ā§āĻāĻ¤āĨ¤
āĻŽā§‹āĻŸā§‹ āĻ‰āĻĒāĻšāĻžāĻ¸ 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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨