【Lambda】cron式の曜日指定でUTC時刻を考慮していなかった…。

はじめに

slackで1日の天気予報を通知してみた。」の記事で紹介した天気予報を通知してくれるLambdaの関数はCloudWatchEventsのcron式をトリガーにして平日の毎朝8時に実行しています。

しかし、なぜか土曜日に天気予報の通知が来て、「おや?」と思っていたら月曜日は通知が来ませんでした。

cron式で平日に実行されるように設定していたはずなのに火曜日から土曜日に実行されてしまっていたのです。

今回はこの問題の原因と対処法について書いていきます。

cron式

平日の朝8時に実行してほしかったので以下のようなcron式を書いていました。

cron(0 23 ? * MON-FRI *)

原因

前回の記事、「日付を取得したらUTCだった…。」に引き続き原因はUTCでした…。cron式はUTCだとわかっていたのですが、曜日を指定する時にUTCを考慮しなかったことが原因でした。

ちょっと考えればわかるのですが、UTC時刻が月曜日の23時のときのJST(東京)時刻は火曜日の8時です。また、UTC時刻で金曜日の23時であればJST(東京)時刻は土曜日の8時になってしまいます。

平日だからcron式の曜日部分はMON-FRIで、8時に実行したいから日時部分は0 23 ?だな。と安直に考えた結果として起こった事態でした。

対処法

日本が平日のときのUTCの曜日をcron式で設定してあげればよいのでcron式を以下のように書き換えました。

cron(0 23 ? * SUN-THU *)

さいごに

cron式でもdatetimeでも日時を扱う際はUTCを意識しなければいけないと実感しました。これからUTCには気をつけたいと思います。