Amazon Linux AMI cronの設定について

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日Amazon EC2でスケジュールされたイベント通知が来た という事で弊社で稼働しているEC2インスタンスの再起動を行うことにした。

まぁインスタンスの再起動だけなので、気にすることなく再起動を行いました。

その翌日に時間指定で起動と停止を行うシェルスクリプトをクーロンで走らせていたのですが、本来起動していなければならないインスタンスが起動していないことが判明しました。

クーロンの設定では

毎日5:00にスナップショットの取るシェルスクリプトを設定
毎日6:00にインスタンスを立ち上げるシェルスクリプト設定
毎日21:00にインスタンスを停止するシェルスクリプトを設定

と設定しています。

今まで何の問題もなくEC2インスタンスの起動と停止ができていたのに、何故がAWSから通知があった後のEC2インスタンス再起動後にできなくなっていました。取り急ぎAWS ManagementConsoleで該当するインスタンスの起動とEIPの紐づけを行い、まずは暫定的に回避。早速調査に入りサーバのログ等を見てみましたが、どうやらシェルスクリプト自体は実行はされているようだった。なので、その日の夜に停止のシェルスクリプトが実行されて正しく停止されるかを見守ることにしました。

結果、指定の時間にインスタンスが停止していなかった。その日はそのままEC2インスタンスの起動をさせたままで様子を見ることにしました。その翌日の朝、インスタンスが起動したままかの確認をしてみると今度はインスタンスが停止していました。これではサービス提供に障害が出るので再度AWS ManagementConsoleで該当するインスタンスの起動とEIPの紐づけを行い暫定的に回避。

上記の動きからクーロンで指定している実行時間にずれがある様に見受けられたので、サーバのlocaltimeを見てみるとUTC0になっていた。これが再起動する前からこの状態だったのかは初期設定を行った人にしか分からないので、取り急ぎタイムゾーンをTokyoに設定変更することにしました。

まずはオリジナルのファイルを退避し、タイムゾーンを日本(東京)にしてみることにしました。

$ mv /etc/localtime /etc/localtime.org
$ ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

この設定を行ったので、再度その日の夜にEC2インスタンスが停止するかを様子見することにしました。見事にEC2インスタンスが停止してくれていました。ホッとしたところで、明日の朝EC2インスタンスが正常に起動されているかを確認して、起動されているようであればlocaltimeによるクーロンの時差起動が原因であることになります。で、今朝EC2インスタンスが起動しているかを確認したところ、問題なく起動されていました。

ちなみにサーバのクーロンログは以下のようになっています。(抜粋)

Dec 14 12:00:01 ip-10-150-191-222 CROND[10538]: (test) CMD (/home/test/shell/autoboo
t.sh stop)
Dec 14 20:01:01 ip-10-150-191-222 run-parts(/etc/cron.hourly)[12058]: finished 0anacron
Dec 14 21:00:01 ip-10-150-191-222 CROND[12398]: (test) CMD (/home/test/shell/autoboo
t.sh start)
Dec 14 21:01:01 ip-10-150-191-222 CROND[12438]: (root) CMD (run-parts /etc/cron.hourly)

タイムスタンプだけ見ると停止スクリプトが12:00に実行され、起動スクリプトが21:00に実行されていますが、本来は夜21:00に停止、朝6:00に起動している必要があります。タイムスタンプが9時間ずつずれていますね。。。

ということで、時差起動されることが分かりました。今後はこの辺りを考慮し忘れないように設定しておかなければと言うことで備忘録として書き留めておきます。

しかしこのままでは気持ち悪いので、クーロンログのタイムスタンプが日本時間で21:00、6:00になるように設定しなければ、、、