Rails가 실행중인 검증 서버 (EC2)를 AWSLambda로 지정된 시간 동안 시작하여 비용을 절감합니다.

소개



서비스를 운용하고 있으면 반드시 과제가 되는 「인프라 코스트」. 가능하면 가능한 한 돈을 쓰고 싶지 않은 곳이군요.
이번에는 Rails가 움직이고 있는 검증용 서버를 AWSLambda를 사용해 필요할 때만 기동하도록(듯이) 했습니다.

이번 신세를 진 참고 사이트



AWSLambda 설정
htp : //에서 v.ぁsss d. jp / c ぉ d / s 치 ぇ ぇ d_와 _ s rt _ ns s 단세 _ f 여 m ぁ mb이다 /

unicorn 자동 시작
htp : // bg. 츳코 rp. 이. jp/bぉg/2015/10/23/우니코 r-아우토-s rt/

delayed_job 자동 시작
htp : // bg. 짱 삐에레. 코m/1037

매우 참고가 되었습니다. 고맙습니다.

주의사항



이번 인스턴스 ID를 지정하여 서버를 자동 시작 및 중지합니다. 인스턴스 ID를 지정할 때 검증 서버인지 확인하십시오.

환경




환경
버전


우분투
14.04

루비
2.1.2

Rails
4.0.2

capistrano
3.2.1

delayed_job
4.0.6


이번에는 위 구성의 서버를 대상으로 검증하고 있습니다.
또한 Ruby 설치에는 rbenv를 사용합니다.

AWSLambda 설정



AWS에 로그인한 후 아래 그림과 같이 Lambda를 선택합니다.



서버 자동 시작 스크립트 작성



Create aLambda function 선택





스크립트 템플릿에서 hello-world-python을 선택





Lambda function code에 스크립트 작성





시작 스크립트
import boto3

def lambda_handler(event, context):
    client = boto3.client('ec2')
    response = client.start_instances(
        InstanceIds=[
            'インスタンスID',
        ]
    )
    print response

Role 만들기



페이지 중앙에 "Role"항목이 있으므로 아래 그림과 같이 선택



선택이 끝나면 다른 탭이 열리므로 아래 그림을 참고로 입력



역할 스크립트
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Resource": [
        "arn:aws:logs:*:*:*",
        "arn:aws:ec2:*:*:*"
      ]
    }
  ]
}

생성이 끝나면 원래 탭으로 돌아가서 다시 "Role"을 선택하고 방금 만든 롤을 선택합니다.
이상이 끝나면 Next를 눌러 확인 화면으로



시작 시간 설정



Fucntion이 가능하면 기동 시간을 설정합니다.
상단의 탭에서 「Event sources」 => 「Add event source」를 선택하면 아래 그림과 같이 됩니다.



여기서 CloudWatch Events - Schedule을 선택합니다.

그러면 아래 그림과 같이 됩니다. 이번에는 월요일부터 금요일 9시에 시작하도록 설정합니다.
*cron의 설정은 UTC이므로 주의하십시오.



이것으로 완료됩니다.

서버 자동 중지 스크립트 작성



기본적으로는 기동과 같은 순서입니다만 일부 스크립트를 재기록합니다.

정지 스크립트
import boto3

def lambda_handler(event, context):
    client = boto3.client('ec2')
    response = client.stop_instances(
        InstanceIds=[
            'インスタンスID',
        ]
    )
    print response



이것으로 람다 측이 완료되었습니다.

검증용 서버



서버가 시작될 때 unicorn과 delayed_job을 자동으로 시작합니다.

자동 시작 도구 설치



우분투의 경우 chkconfig를 사용할 수 없으므로 sysv-rc-conf를 설치합니다.

설치
sudo apt-get install sysv-rc-conf

unicorn 자동 시작



unicorn 시작 스크립트 만들기


etc/init.d/ 아래에 unicorn 파일 만들기

etc/init.d/
sudo touch unicorn

unicorn 파일 권한을 755로 변경

권한 변경
sudo chmod 755 unicorn

unicorn 파일에 다음을 설명

etc/init.d/unicorn
#!/bin/sh

#description:unicorn shell

NAME="Unicorn"
ENV=staging
USER=ubuntu

# 環境にあわせてください
ROOT_DIR="/var/www/vhosts/app/current"

GEMFILE="${ROOT_DIR}/Gemfile"
PID="${ROOT_DIR}/tmp/pids/unicorn.pid"
CONF="${ROOT_DIR}/config/unicorn/${ENV}.rb"
OPTIONS=""

start()
{
  if [ -e $PID ]; then
    echo "$NAME already started"
    exit 1
  fi
  echo "start $NAME"
  cd $ROOT_DIR
  su - ${USER} -c "cd ${ROOT_RIR} && BUNDLE_GEMFILE=${GEMFILE} bundle exec unicorn -c ${CONF} -E ${ENV} -D ${OPTIONS}"
}

stop()
{
  if [ ! -e $PID ]; then
    echo "$NAME not started"
    exit 1
  fi
  echo "stop $NAME"
  kill -QUIT `cat ${PID}`
}

force_stop()
{
  if [ ! -e $PID ]; then
    echo "$NAME not started"
    exit 1
  fi
  echo "stop $NAME"
  kill -INT `cat ${PID}`
}

reload()
{
  if [ ! -e $PID ]; then
    echo "$NAME not started"
    start
    exit 0
  fi
  echo "reload $NAME"
  kill -HUP `cat ${PID}`
}

restart()
{
  stop
  sleep 3
  start
}

case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  force-stop)
  force_stop
  ;;
  reload)
  reload
  ;;
  restart)
  restart
  ;;
  *)
  echo "Syntax Error: release [start|stop|force-stop|reload|restart]"
  ;;
esac


위에서 만든 스크립트를 서버 시작시 자동 시작하도록 설정하십시오.

unicorn 자동 시작
sudo sysv-rc-conf unicorn on

delayed_job 자동 시작



rails 프로젝트 내에 스크립트 작성


sudo touch /var/www/vhosts/app/shared/config/delayed_job.monitrc
  • 프로젝트 경로는 환경에 맞춰야합니다

  • delayed_job.monitrc
    check process delayed_job
      with pidfile /var/www/vhosts/app/shared/pids/delayed_job.pid
      start program = "/bin/su - ubuntu -c 'cd /var/www/vhosts/app/current; PATH=/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.2 RAILS_ENV=staging ~/.rbenv/bin/rbenv exec bundle exec bin/delayed_job -n 2 --queues=mailer,tracking --prefix=reports --pool=mailer:2 --pool=tracking:1 --pool=*:2 start'"
      stop program = "/bin/su - ubuntu -c 'cd /var/www/vhosts/app/current; PATH=/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.2 RAILS_ENV=staging ~/.rbenv/bin/rbenv exec bundle exec bin/delayed_job -n 2 --queues=mailer,tracking --prefix=reports --pool=mailer:2 --pool=tracking:1 --pool=*:2 stop'"
    
    

    monit 설치



    설치
     sudo apt-get install monit
    

    자동 시작 설정



    자동 시작
    sudo sysv-rc-conf monit on
    

    monit 파일 편집


    /etc/monit/ 아래의 monitrc를 아래와 같이 다시 씁니다.

    /etc/monit/monitrc
    set daemon 120
    set logfile /var/log/monit.log
    
    set idfile /var/lib/monit/id
    set statefile /var/lib/monit/state
    set eventqueue
        basedir /var/lib/monit/events
        slots 100
    set httpd port 2812 and
      allow localhost
    
    ###############################################################################
    ## Includes
    ###############################################################################
       include /etc/monit/conf.d/*
        # 環境に合わせてください
       include /var/www/vhosts/app/shared/config/delayed_job.monitrc
    

    권한을 루트 사용자 700으로 설정하십시오.

    권한 변경
    sudo chmod 700 monitrc
    

    이상입니다. 이것으로 검증용 서버가 월요일~금요일의 9시~23시까지 기동하게 됩니다.

    좋은 웹페이지 즐겨찾기