๋ชจํ† . AWS ์กฐ๋กฑ

ํ…Œ์ŠคํŠธ๋Š” ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์˜ ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Amazon Web Services, ํŒŒ์ด์ฌ ะฑะธะฑะปะธะพั‚ะตะบะฐ ๋ชจํ„ฐ ์‚ฌ์ดํด ์ด๊ฒƒ์— ๋”ฑ ๋งž์Šต๋‹ˆ๋‹ค.
๋ชจํ† . AWS ์กฐ๋กฑ

๋ฆฌ์†Œ์Šค ์ ์šฉ ๋ฒ”์œ„์˜ ์ „์ฒด ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.
Github์— ์ˆœ๋ฌด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ํœด๊ณ  ํ”ผ์นด๋„ - ๋ชจํ† ์„œ๋ฒ„. ์ด๋ฏธ์ง€ ์ค€๋น„, ์‹คํ–‰ ๋ฐ ์‚ฌ์šฉ ์œ ์ผํ•œ ๋‰˜์•™์Šค๋Š” ์ถœ์‹œ ํ›„ AWS ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๊ทธ๊ฑด ๊ณ ์น  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•  ๋•Œ ์„œ๋น„์Šค ์œ ํ˜•(ํ™˜๊ฒฝ ๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด MOTO_SERVICE), ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ์„ ์„ค๋ช…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์กฐ๊ธˆ ๋ฐ”๊ฟ”๋ณด์ž ์‹œ์ž‘.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

์ตœ์ข… ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘.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

์‹ค์ œ๋กœ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ž์˜ ๋…ธํŠธ๋ถ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ๋ฆฝ ํ›„ ๋ชจํ˜•์„ ์‚ฌ์šฉํ•œ ์˜ˆ๋น„ ํ…Œ์ŠคํŠธ๋Š” ๊ฐœ๋ฐœ* ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋งํฌ :

Motocker ๋ ˆํฌ - github.com/picadoh/motocker
๋ชจํ†  ๋ ˆํฌ - github.com/spulec/moto
Boto3 ๋ฌธ์„œ - boto3.amazonaws.com/v1/documentation/api/latest/index.html

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€