เจฎเฉ‹เจŸเฉ‹เฅค AWS เจฆเจพ เจฎเจœเจผเจพเจ• เจ‰เจกเจพ เจฐเจฟเจนเจพ เจนเฉˆ

เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจตเจฟเจ•เจพเจธ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเจพ เจ‡เฉฑเจ• เจ…เจจเจฟเฉฑเจ–เฉœเจตเจพเจ‚ เจ…เฉฐเจ— เจนเฉˆเฅค เจ…เจคเฉ‡ เจ•เจˆ เจตเจพเจฐ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจธเจฅเจพเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจŸเฉˆเจธเจŸ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค
เจœเฉ‡เจ•เจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฐเจคเจฆเฉ€ เจนเฉˆ เจเจฎเจพเจœเจผเจพเจจ เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฟเจธเจฟเจœเจผ, เจชเจพเจ‡เจฅเจจ เจฒเจพเจ‡เจฌเจฐเฉ‡เจฐเฉ€ เจฎเฉ‹เจŸเจฐเจธเจพเจˆเจ•เจฒ เจ‡เจธ เจฒเจˆ เจธเฉฐเจชเฉ‚เจฐเจฃ.
เจฎเฉ‹เจŸเฉ‹เฅค AWS เจฆเจพ เจฎเจœเจผเจพเจ• เจ‰เจกเจพ เจฐเจฟเจนเจพ เจนเฉˆ

เจธเจฐเฉ‹เจค เจ•เจตเจฐเฉ‡เจœ เจฆเฉ€ เจชเฉ‚เจฐเฉ€ เจธเฉ‚เจšเฉ€ เจตเฉ‡เจ–เฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ เจ‡เฉฑเจฅเฉ‡.
Github 'เจคเฉ‡ เจ‡เฉฑเจ• turnip เจนเฉˆ เจนเจฟเจŠเจ—เฉ‹ เจชเจฟเจ•เจพเจกเฉ‹ - เจฎเฉ‹เจŸเฉ‹-เจธเจฐเจตเจฐ. เจคเจฟเจ†เจฐ เจšเจฟเฉฑเจคเจฐ, เจฒเจพเจ‚เจš เจ…เจคเฉ‡ เจตเจฐเจคเฉ‹เจ‚เฅค เจธเจฟเจฐเจซ เจธเฉ‚เจ–เจฎเจคเจพ เจ‡เจน เจนเฉˆ เจ•เจฟ เจฒเจพเจ‚เจš เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจจเจนเฉ€เจ‚ เจชเฉเจฐเจธเจฅเจฟเจคเฉ€ เจ…เจœเฉ‡ เจคเฉฑเจ• เจ‰เฉฑเจฅเฉ‡ เจธเจฐเฉ‹เจค เจจเจนเฉ€เจ‚ เจฌเจฃเจพเจ เจ—เจ เจนเจจเฅค

เจ เฉ€เจ• เจนเฉˆ, เจœเฉ‹ เจ•เจฟ เจ เฉ€เจ• เจ•เจฐเจจ เจฒเจˆ เจ•เจพเจซเจผเฉ€ เจ†เจธเจพเจจ เจนเฉˆ.

เจœเจฆเฉ‹เจ‚ เจคเฉ‹เจ‚ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉ‡เจตเจพ เจฆเฉ€ เจ•เจฟเจธเจฎ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ (เจญเฉ‡เจœเฉ‹ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹