IBM Cloud Functions alarm package の cron 秒フィールドの注意点


はじめに

IBM Cloud Functions で定期的にトリガーを起こしたくて alarm package を利用しました。
1分間に複数回発生するトリガーは強制的に停止されるので、注意してください。

Alarm package ドキュメント/リポジトリ

3種類の feeds

OpenWhisk alarm package には、トリガーの feed が3種類あります。

  • Interval (/whisk.system/alarms/interval)
    • 最短1分間隔。
    • startDate, stopDate オプション指定可能。
  • Once (/whisk.system/alarms/once)
    • 指定の日時。
    • deleteAfterFire オプション指定可能。
  • Alarm (/whisk.system/alarms/alarm)
    • cron 指定。「秒」フィールドの指定も可能。
      • IBM Cloud Docs には 6 fields 記法について言及ありませんが、使えました。
    • startDate, stopDate オプション指定可能。
    • maxTriggers オプションは deprecated で間もなく廃止。デフォルトは -1 (制限なし)
      • IBM Cloud Docs には maxTriggers についての記述は既に削除済み。

interval を使うか alarm を使うか

定期的にトリガーを起こすのは intervalalarm feed がありますが、分間隔しか指定できない interval に対して、 cron で柔軟な指定ができて秒間隔も指定できてオプションもほとんど同じな alarm だけ使えば事足りるように見えます。

ただし maxTriggers オプション廃止後の動きは気になります。(制限なしの仕様が続くのかどうか)

Alarm feed (cron) を使ってみた (*/20 * * * * *)

20秒間隔のトリガーを試しました。(1分間に3回発生)

手順

以下のサンプルから maxTriggers オプションを除いて実行しました。
最新の OpenWhisk の仕様によれば、 maxTriggers 省略時は最大実行回数制限なしです。

$ ibmcloud fn action create handler handler.js
$ ibmcloud fn trigger create every-20-seconds \
  --feed  /whisk.system/alarms/alarm \
  --param cron '*/20 * * * * *'
$ ibmcloud fn rule create \
  invoke-periodically \
  every-20-seconds \
  handler

結果

トリガーを作成したのは 2018-09-28 の 16:25 (日本時間)でした。

$ ibmcloud fn trigger get --summary every-20-seconds | jq .response.result.status
{
  "active": true,
  "dateChanged": 1538119522935,
  "dateChangedISO": "2018-09-28T07:25:22Z"
}

2018-09-29 の 05:45:20 (日本時間)を最後に終わってる…

ADMIN より Trigger frequency is not supported との理由で無効化されておりました。

$ ibmcloud fn trigger get --summary every-20-seconds | jq .response.result.status
{
  "active": false,
  "dateChanged": 1538119522935,
  "dateChangedISO": "2018-09-28T07:25:22Z",
  "reason": {
    "kind": "ADMIN",
    "message": "Trigger frequency is not supported"
  }
}

Alarm feed (cron) を使ってみた (20 * * * * *)

毎分20秒に発生するトリガーを試しました。(1分間に1回発生)

手順

トリガー名を every-20-second (secondsより変更)に変更し、 cron20 * * * * * に修正しました。

$ ibmcloud fn action create handler handler.js
$ ibmcloud fn trigger create every-20-second \
  --feed  /whisk.system/alarms/alarm \
  --param cron '20 * * * * *'
$ ibmcloud fn rule create \
  invoke-periodically \
  every-20-second \
  handler

結果

トリガーを作成したのは 2018-09-29 の 23:30 (日本時間)でした。

$ ibmcloud fn trigger get --summary every-20-second | jq .response.result.status
{
  "active": true,
  "dateChanged": 1538231425486,
  "dateChangedISO": "2018-09-29T14:30:25Z"
}

2018-09-30 の 15:27:20 (日本時間)でもちゃんと動き続けています。

考察

OpenWhisk では1分間に複数回発生するトリガーも設定できる仕様ですが、 IBM Cloud Function では一時的には動作しますが、しばらくすると強制停止されてしまいます。
ただし、毎分特定の秒数にトリガーを起こすことはできる( cron の秒フィールド自体はサポートされる)ので、同じ action を複数のトリガーと紐付ければ1分間に複数回発生させることは難しくなさそうです。
(例えば、毎分0秒、毎分20秒、毎分40秒のそれぞれのトリガーを作成しておく。)