AWS Lambda を毎月1日 0:00 (JST)に実行する方法

AWS Lambda のトリガーに指定できる [CloudWatch Events - Schedule] で設定するcronは、UTC で設定する必要があります。
JSTの「毎月1日 0:00」は、UTCでは「前月末日 15:00」にあたります。
しかし、cron(単体) では「各月の末日のみ」を指定することができません。


そこで、以下のような方法を考えてみました。
まず、[CloudWatch Events - Schedule] の cron で、月の末日にあたる可能性のある日(28日~31日)の15:00を指定します。

cron(0 15 28-31 * ? *)


次に、前述の cron で起動させる Lambda で、月の末日(UTC)以外の場合は何もせず処理を終わらせ、月の末日(UTC)であれば実行したい処理を実行するようにします。


Node.js 4.3 の場合の例*1

月の末日(UTC)かどうかを、1日後(24時間後)が1日(UTC)かどうかで判断します。

exports.handler = (event, context, callback) => {
    if ((new Date(Date.now() + 24 * 3600 * 1000)).getUTCDate() !== 1) {
        return;
    }

    // … 実行したい処理 …
};

以上です。

*1:2017/1/18: タイムゾーンJSTにする設定(process.env.TZ = "Asia/Tokyo";)の有無にかかわらず使用できる方法に書き直しました。