แƒ›แƒแƒขแƒ. แƒ“แƒแƒ›แƒชแƒ˜แƒœแƒแƒ•แƒ˜ AWS

แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒ’แƒแƒœแƒฃแƒงแƒแƒคแƒ”แƒšแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒ. แƒ“แƒ แƒ–แƒแƒ’แƒฏแƒ”แƒ  แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒก แƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒแƒ›แƒ“แƒ”.
แƒ—แƒฃ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก Amazon แƒ•แƒ”แƒ‘ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ˜, แƒžแƒ˜แƒ—แƒแƒœแƒ˜ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ motorbike แƒ˜แƒ“แƒ”แƒแƒšแƒฃแƒ แƒ˜แƒ แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก.
แƒ›แƒแƒขแƒ. แƒ“แƒแƒ›แƒชแƒ˜แƒœแƒแƒ•แƒ˜ AWS

แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒกแƒ แƒฃแƒšแƒ˜ แƒกแƒ˜แƒ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒแƒฅ.
แƒ’แƒ˜แƒขแƒฐแƒฃแƒ‘แƒ–แƒ” แƒแƒ แƒ˜แƒก แƒขแƒฃแƒ แƒœแƒ˜แƒ™แƒ˜ แƒฃแƒ’แƒ แƒžแƒ˜แƒ™แƒแƒ“แƒ - แƒ›แƒแƒขแƒ-แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜. แƒ›แƒ–แƒ แƒกแƒฃแƒ แƒแƒ—แƒ˜, แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒ“แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ. แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜ แƒœแƒ˜แƒฃแƒแƒœแƒกแƒ˜ แƒแƒ แƒ˜แƒก แƒ˜แƒก, แƒ แƒแƒ› แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒแƒ แƒ AWS แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜ แƒ˜แƒฅ แƒฏแƒ”แƒ  แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜.

แƒ˜แƒกแƒ”, แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ.

แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒแƒ— แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜แƒก แƒขแƒ˜แƒžแƒ˜ (env แƒชแƒ•แƒšแƒแƒ“แƒ˜ MOTO_SERVICE), แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒฃแƒœแƒ“แƒ แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ.

แƒชแƒแƒขแƒ แƒจแƒ”แƒ•แƒชแƒ•แƒแƒšแƒแƒ— แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ.แƒจ:

แƒœแƒแƒชแƒ•แƒšแƒแƒ“

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

แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒคแƒแƒ˜แƒšแƒ˜ แƒแƒ แƒ˜แƒก:

แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ.แƒจ

#!/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 Docs - boto3.amazonaws.com/v1/documentation/api/latest/index.html

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ