1. 本記事について
開発・検証などの用途でクラウド環境を用意していて、
課金額の節約のためにしばらく誰もサーバーにログインしてない時は
自動で停止するスクリプトを書いてみました。
課金額を節約するという観点では、9:00~17:00など定刻で起動停止するように
設定するのも手ですが、もう少し柔軟に対応したい時に使えるかもしれません。
2. 前提
UnixベースのOSがインストールされたサーバー(インスタンス)であること。
OCICLI(Oracle Cloudのコマンドラインインターフェース)が対象サーバーに
セットアップ済であること。
・[参考] OCICLIのセットアップ手順
Oracle Cloud : コマンド・ライン・インタフェース(CLI) をインストールしてみた
3. スクリプト
ログインしているユーザー数を定期確認して、
指定時間ログインがなければ停止します。
バックグラウンドで流しておいて使うイメージです。
"DEST_OCID"に対象サーバーの識別用のIDを指定します。
・Computeインスタンス用
# !/bin/bash
# 対象インスタンスOCID
DEST_OCID="ocid1.instance.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxx"
# シャットダウンまでの無ログイン時間(秒)
SHUTDOWN_THRESHOLD=3600
# ログインユーザ数チェック間隔(秒)
CHECK_INTERVAL=600
# ログインユーザ監視処理
while [ $((COUNT * CHECK_INTERVAL)) -lt ${SHUTDOWN_THRESHOLD} ];
do
LOGIN_USER_COUNT=`who | wc -l`
if [ ${LOGIN_USER_COUNT} = 0 ]; then
COUNT=$(( COUNT + 1 ))
else
COUNT=0
fi
sleep ${CHECK_INTERVAL}
done
# インスタンス停止コマンド発行
echo "閾値に達したためインスタンスを停止します"
oci compute instance action --instance-id ${DEST_OCID} --action stop
・Database Cloud用
# !/bin/bash
# 対象インスタンスOCID
DEST_OCID="ocid1.dbnode.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxx"
# シャットダウンまでの無ログイン時間(秒)
SHUTDOWN_THRESHOLD=3600
# ログインユーザ数チェック間隔(秒)
CHECK_INTERVAL=600
# ログインユーザ監視処理
while [ $((COUNT * CHECK_INTERVAL)) -lt ${SHUTDOWN_THRESHOLD} ];
do
LOGIN_USER_COUNT=`who | wc -l`
if [ ${LOGIN_USER_COUNT} = 0 ]; then
COUNT=$(( COUNT + 1 ))
else
COUNT=0
fi
sleep ${CHECK_INTERVAL}
done
# インスタンス停止コマンド発行
echo "閾値に達したためインスタンスを停止します"
oci db node stop --db-node-id ${DEST_OCID} --action stop
4. OCIDの確認方法
・Computeインスタンスの場合
Oracle Cloudの管理コンソール画面から
[コンピュート]⇒[インスタンス]⇒[インスタンスの詳細]
・Database Cloudの場合
[Oracle Database]⇒[ベア・メタル、VMおよびExadata]⇒[DBシステム]⇒[DBシステムの詳細]⇒[ノード]
5. 注意点
実際に使用する場合はsystemdなどでスクリプトをサービス化して
サーバーの起動と共にスクリプトが動くようにするかと思います。
この場合、無ログイン時間の閾値を誤って極端に短く設定してしまうと
サーバー起動⇒スクリプト自動起動⇒即時に閾値到達⇒停止処理 となって
ログインできず復旧が困難となる恐れがあるので注意が必要です。