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
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
환경
버전
우분투
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
import boto3
def lambda_handler(event, context):
    client = boto3.client('ec2')
    response = client.start_instances(
        InstanceIds=[
            'インスタンスID',
        ]
    )
    print response
{
  "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:*:*:*"
      ]
    }
  ]
}
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시까지 기동하게 됩니다.
Reference
이 문제에 관하여(Rails가 실행중인 검증 서버 (EC2)를 AWSLambda로 지정된 시간 동안 시작하여 비용을 절감합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kakky0418/items/54ad436fef7f0e83c517텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)