แž˜แŸ‰แžผแžแžผแŸ” แž…แŸ†แžขแž€ AWS

แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแž‚แžบแž‡แžถแž•แŸ’แž“แŸ‚แž€แžŸแŸ†แžแžถแž“แŸ‹แž˜แžฝแž™แž“แŸƒแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸแŸ” แž แžพแž™แž–แŸแž›แžแŸ’แž›แŸ‡แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแžแŸ’แžšแžผแžœแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแž€แŸ’แž“แžปแž„แžŸแŸ’แžšแžปแž€ แž˜แžปแž“แž–แŸแž›แž’แŸ’แžœแžพแž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแŸ”
แž”แŸ’แžšแžŸแžทแž“แž”แžพแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž”แŸ’แžšแžพ แž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“Amazon Web Services, แž–แžŸแŸ‹แžแŸ’แž›แžถแž“แŸ‹ แž”แžŽแŸ’แžŽแžถแž›แŸแž™ แž˜แŸ‰แžผแžแžผ แž›แŸ’แžขแžฅแžแžแŸ’แž…แŸ„แŸ‡แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžšแžฟแž„แž“แŸแŸ‡แŸ”
แž˜แŸ‰แžผแžแžผแŸ” แž…แŸ†แžขแž€ AWS

แž”แž‰แŸ’แž‡แžธแž–แŸแž‰แž›แŸแž‰แž“แŸƒแž€แžถแžšแž‚แŸ’แžšแž”แžŠแžŽแŸ’แžแž”แŸ‹แž’แž“แž’แžถแž“แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž˜แžพแž› แž“แŸ…แž‘แžธแž“แŸแŸ‡.
แž˜แžถแž“ turnip แž“แŸ…แž›แžพ Github แž แŸŠแžผแž แŸ’แž‚แŸ„ แž—แžธแž€แžถแžŠแžผ - แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž˜แŸ‰แžผแžแžผ. แžšแžผแž”แž—แžถแž–แžšแžฝแž…แžšแžถแž›แŸ‹ แž”แžพแž€แžŠแŸ†แžŽแžพแžšแž€แžถแžš แž“แžทแž„แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แŸ” nuance แžแŸ‚แž˜แžฝแž™แž‚แžแŸ‹แž‚แžบแžแžถแž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž€แžถแžšแž”แžพแž€แžŠแŸ†แžŽแžพแžšแž€แžถแžš, แž‘แŸแŸ” AWS แž’แž“แž’แžถแž“แž˜แžทแž“แž‘แžถแž“แŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแž“แŸ…แž‘แžธแž“แŸ„แŸ‡แž‘แŸแŸ”

แž‡แžถแž€แžถแžšแž”แŸ’แžšแžŸแžพแžšแžŽแžถแžŸแŸ‹, แžœแžถแž„แžถแž™แžŸแŸ’แžšแžฝแž›แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹แž€แŸ’แž“แžปแž„แž€แžถแžšแž‡แžฝแžŸแž‡แžปแž›แŸ”

แž…แžถแž”แŸ‹แžแžถแŸ†แž„แž–แžธแž–แŸแž›แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž”แž‰แŸ’แž‡แžถแž€แŸ‹แž”แŸ’แžšแž—แŸแž‘แžŸแŸแžœแžถแž€แž˜แŸ’แž˜ (env แžขแžแŸแžš 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

แž‘แžทแž‰แž€แžถแžšแž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS, แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS ๐Ÿ”ฅ แž‘แžทแž‰แžŸแŸแžœแžถแž”แž„แŸ’แž แŸ„แŸ‡แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS แž“แžทแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS | ProHoster