[Oracle Cloud] 誰もログインしていないサーバーを自動で停止する


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などでスクリプトをサービス化して
サーバーの起動と共にスクリプトが動くようにするかと思います。

この場合、無ログイン時間の閾値を誤って極端に短く設定してしまうと
サーバー起動⇒スクリプト自動起動⇒即時に閾値到達⇒停止処理 となって
ログインできず復旧が困難となる恐れがあるので注意が必要です。

6. 参考

Oracle Cloud Infrastructure CLI Command Reference