관리 메뉴

밤 늦게까지 여는 카페

[AWS 비용 절감] crontab을 이용해서 주말에는 서버 자동으로 내리기 본문

aws

[AWS 비용 절감] crontab을 이용해서 주말에는 서버 자동으로 내리기

Jㅐ둥이 2025. 2. 16. 00:41

안녕하세요. 오늘은 AWS 비용 절감을 위해 시도한 방안 중 하나를 기록하고자 합니다.

 

주말에는 사용하지 않는 서버를 내리는 정말 간단한 방안인데 적용하기까지는 시간이 오래 걸렸습니다.

 

crontab을 이용해서 deactivate.sh 스크립트를 금요일 밤에 실행하고

activate.sh를 월요일 아침에 실행하여 주말에는 사용하지 않는 서버 인스턴스들이 자동으로 내려가도록 설정했습니다.

 

  • crontab 예시
    • 0 9 * * 1 /home/user/script/activate.sh (월요일 오전 9시에 서버 활성화 시키기)
    • 0 20 * * 5 /home/user/script/deactivate.sh (금요일 오후 8시에 서버 비활성화 시키기)
  • activate.sh
더보기

#!/bin/bash

# 클러스터 이름 설정 (필요 시 수정)
CLUSTER_NAME="CLUSTER-NAME"
# DB 인스턴스 이름 설정 (필요 시 수정)
DB_ID="DB-ID

 

# DB가 실행되기 전에 서버가 먼저 실행되는 것을 막기 위함

resp=$(aws rds start-db-instance --db-instance-identifier $DB_ID)

echo $resp

sleep 300


# 모든 서비스 목록 가져오기
SERVICES=$(aws ecs list-services --cluster $CLUSTER_NAME --query "serviceArns[]" --output text)

# 서비스 목록이 비어 있지 않은 경우 실행
if [[ -n "$SERVICES" ]]; then
    for SERVICE_ARN in $SERVICES; do
        SERVICE_NAME=$(basename $SERVICE_ARN)
        echo "Stopping service: $SERVICE_NAME"

        # 서비스의 작업 수를 0으로 설정
        resp=$(aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE_NAME --desired-count 0)

        echo $resp
    done
    echo "All services in cluster '$CLUSTER_NAME' have been stopped."
else
    echo "No services found in cluster '$CLUSTER_NAME'."
fi

  • deactivate.sh
더보기

#!/bin/bash

# 클러스터 이름 설정 (필요 시 수정)
CLUSTER_NAME="CLUSTER-NAME"
# DB 인스턴스 이름 설정 (필요 시 수정)
DB_ID="DB-ID

# 모든 서비스 목록 가져오기
SERVICES=$(aws ecs list-services --cluster $CLUSTER_NAME --query "serviceArns[]" --output text)

# 서비스 목록이 비어 있지 않은 경우 실행
if [[ -n "$SERVICES" ]]; then
    for SERVICE_ARN in $SERVICES; do
        SERVICE_NAME=$(basename $SERVICE_ARN)
        echo "Stopping service: $SERVICE_NAME"

        # 서비스의 작업 수를 0으로 설정
        resp=$(aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE_NAME --desired-count 1)

        echo $resp
    done
    echo "All services in cluster '$CLUSTER_NAME' have been stopped."
else
    echo "No services found in cluster '$CLUSTER_NAME'."
fi

resp=$(aws rds stop-db-instance --db-instance-identifier $DB_ID)

echo $resp

 

서비스 운영 시간을 더 세밀하게 관리하는 방법도 있을텐데 준비해보겠습니다.

 

+++

처음으로 시도해봤는데 서버가 DB보다 먼저 실행되어서 패닉이 발생하더라고요...!

activate.sh 에서 DB 인스턴스 시작 순서를 앞당기는 것으로 조치했습니다.

 

예전에 비슷한 작업을 해봤어서 이번에는 매우 간단하게 처리할 수 있었던 것 같습니다 👍

🎁다른 AWS 비용 절감 관련 포스팅들 🎁

 

 

반응형