こちらのアドベントカレンダーの最終日の記事となります.
最後の記事がこのような記事で申し訳ないですがやっていきます.
chkconfig で処理の実行 -> シャットダウン をしようという記事です.
そもそもなぜそんなことをするの?
機械学習で AWS を使用しようとしましたが付けっ放しにするにはあまりにも高かったためです.
推奨インスタンスタイプ: p2.xlarge
時間単価: 0.900 USD/h
0.900 USD/h = 72,000 JPY/month
下手すると2ヶ月でGPU積んだパソコンが買えてしまい, 半日消し忘れでも 1,200 JPY.
物忘れが激しいので, 消し忘れを防止するために今回は処理 -> シャットダウンを仕組みに組み込みます.
実装
chkconfig
というランレベルに応じて設定されたプログラムを実行するサービスを使用します.
まずは設定するスクリプトを作成します.
#!/bin/bash
# chkconfig 4 99 10
# description: 処理したらオサラバ
# processname: run-script
cd /path/to/project
sudo -u ec2-user git pull
./script.sh
if [[ ! -f ./blocking_file ]]; then
shutdown 0
fi
2 行目の # chkconfig 4 99 10
は chkconfig のファイルとして扱うための文言です.
-
4
がこのスクリプトを実行するランレベル -
99
が起動時の優先度(小さいほど優先される) -
10
が終了時の優先度(今回関係なし)
です.
sudo -u ec2-user
は ssh の設定を ec2-user のものを使用するためです.
git に使わせる鍵を ec2-user のものにしています.
if
は設定ミスの時にシャットダウンを防止して, サーバへアクセスする手段を残すものです.
今回はリポジトリに blocking_file
というファイルが存在した場合, シャットダウンされないようにしております.
僕は何度か失敗したのでインスタンスをいくつも潰す羽目になりました.
(後で書きます).
これに symlink を張って chkconfig に追加すれば chkconfig 側の設定は終了です.
$ ln -s /path/to/project/run-script /etc/init.d/
$ chkconfig --list | grep run-script
$ chkconfig --add /etc/init.d/run-script
$ chkconfig --list | grep run-script
> run-script 0:off 1:off 2:off 3:off 4:on 5:off 6:off
最後に ssh の設定, git clone などを済ませて終了です.
blocking_file を追加したり, 削除したりして動作が実行されていることをご確認ください.
結局何を間違えたの?
主にこの2つのミスを同時にやらかし失敗しました.
- if 文つけ忘れ
- git pull の失敗
if 文のつけ忘れに関しては最初の段階で気をつけねば〜と思っていたのですが,
つけて再起動すればサーバのコードも更新されて済むだろと軽い気持ちで考えておりました.
しかし git pull が失敗しておりサーバのコードに更新がかからずアクセス不能になりました.
chkconfig は root ユーザで実行されます.
なので git で ec2-user の鍵を使いたい場合はユーザを変更するか, 鍵を頑張って指定するかになります.
僕は両者どちらも忘れていたため, git pull が不発に終わり作ったサーバにサヨナラバイバイする羽目になりました.
run-script が sudo -u ec2-user git pull
になっているのはそのためです.
root で鍵作っても動くかと思います.
参考
chkconfig で起動順序と終了順序を指定する
EC2起動時にスクリプトを実行する
最後に
初めて記事を書き間違いも多いかと思いますので, これ危ないよ, ここ間違ってるぞという場合は何卒ご指摘お願いいたします.