定期タイマー (cron) イベント・プロデューサーの使用

定期タイマー (cron) イベント・プロデューサーは、一定間隔でイベントを生成します。 この間隔は、分、時、日、月の単位で、または複数の異なる時間間隔の組み合わせでスケジュールできます。 Code Engine のアプリ、関数、ジョブをサブスクライブすることで、cronイベントを受信できます。

「定期タイマーイベントのサブスクリプション」では、間隔の詳細を指定するために標準のcrontab構文を使用します。形式は * * * * * となり、各フィールドは分、時、月の日、年の月、曜日の順を表します。 例えば、午前 0 時のイベントをスケジュールするには、0 0 * * * と指定します。 毎週金曜日の午前 0 時のイベントをスケジュールするには、0 0 * * 5 と指定します。

定期タイマーイベントプロデューサーをサブスクライブする際は、サブスクリプションの対象先(アプリ、関数、またはジョブ)と対象先タイプを指定する必要があります。 スケジュールを指定しない場合は、デフォルトの * * * * * (1 分ごと) が使用されます。

Code Engine プロジェクト内の「定期タイマー」サブスクリプションには割り当て枠があり、サブスクリプション数にも上限が設けられています。 Code Engine の制限について詳しくは、Code Engine の制限と割り当て量を参照してください。

アプリケーションの定期タイマー (cron) イベントのサブスクライブ

定期タイマーサブスクリプションは、コンソールまたはCLIから操作できます。

イベントは、HTTP POST 要求としてアプリケーションに送信されます。 イベントに含まれる情報について詳しくは、イベントの HTTP ヘッダーおよび本文の情報を参照してください。

コンソールでのアプリケーションの定期タイマー (cron) イベントのサブスクライブ

コンソールから、アプリケーションの定期タイマーイベントのサブスクリプションを作成および更新することができます。

開始前に

コンソールからアプリケーションの「定期タイマーイベント」サブスクリプションを作成および更新するには、以下の手順を実行してください。

  1. Code Engine プロジェクトページ から、自分のプロジェクトに移動します。

  2. 「概要」ページで、**「イベント・サブスクリプション (Event subscriptions)」**をクリックします。

  3. 「イベント・サブスクリプション (Event subscriptions)」ページで**「作成」**をクリックして、サブスクリプションを作成します。

  4. 「イベントのサブスクリプションを作成」ページで、以下の手順を実行してください:

    1. イベント・タイプの場合は、「定期的タイマー」タイルを選択します。 **「次へ」**をクリックします。
    2. **「一般」**に、定期タイマー・サブスクリプションの名前 (例えば myptimer) を入力します。 オプションで、イベント属性を指定できます。 定期タイマー・イベントのコンシューマーがアプリケーションの場合、使用できるイベント属性は HTTP ヘッダーとなることに注意してください。 イベントのコンシューマーがジョブの場合は、使用できるイベント属性は環境変数になります。 **「次へ」**をクリックして、先に進みます。
    3. **「スケジュール」**に、イベントのタイミングに関する情報を指定します。 「Periodic」タイマーイベントプロデューサーは、標準のcrontab構文を使用して間隔の詳細を指定します。 提供されているパターンから間隔を選択するか、0 0 * * * (これは、毎日午前 0 時にイベントを発生させることを指定している) などの独自のカスタム cron 式を入力します。 この例では、毎日、毎時、毎分のスケジュール・パターンを選択します。 cron 式が自動的に生成されることに注意してください。 日、時、分のパターンと cron 式は協定世界時 (UTC) で表されます。 スケジュールを指定しない場合、このイベント・サブスクリプションは 1 分ごとにイベントを送信します。 予定されているスケジュール済みのイベントのリストが表示されます。 これらのスケジュール済みイベントは、ご使用のタイム・ゾーンの形式で表示されることに注意してください。 **「次へ」**をクリックして、先に進みます。
    4. **「カスタム・イベント・データ (Custom event data)」**に、イベント・メッセージの本文に含めるデータを入力します。 メッセージは、プレーン・テキストまたは base64 形式で指定できます。 この例では、イベント・メッセージの本文として hello stranger というテキストを指定します。 メッセージが base64 形式の場合、イベントの送信時にメッセージをデコードすることを選択できます。 カスタム・イベント・データのコンテンツ・タイプを指定することもできます。 **「次へ」**をクリックして、先に進みます。
    5. **「イベント・コンシューマー (Event consumer)」**に、イベントを受信するアプリケーションまたはジョブを指定します。 定義済みのアプリケーションとジョブのリストから選択できることに注意してください。 この例では、icr.io/codeengine/cronイメージを参照するmyappアプリケーションを使用します。 まだアプリやジョブを作成していない場合は、定期タイマーサブスクリプションを作成した後で、アプリまたはジョブの名前を指定して、 アプリまたは ジョブを作成 することができます。 アプリケーションの場合のみ、オプションでパスを指定できます。 デフォルトでは、イベントは、宛先アプリケーションのルート URL にルーティングされます。 パスを指定すると、アプリ内の別の宛先にイベントを送信できます。 例えば、サブスクリプション・パスに/eventsが指定されている場合、イベントはhttps://<base application URL>/eventsに送信されます。 **「次へ」**をクリックして、先に進みます。
    6. **「サマリー」**で、定期タイマー・イベント・サブスクリプションの設定を確認し、必要に応じて変更を加えます。 準備ができたら、「 作成 」をクリックして、定期タイマーサブスクリプションを作成してください。
  5. 「Periodic」タイマーのサブスクリプションが作成されたので、「イベントサブスクリプション」ページに移動し、 定義済みのサブスクリプションの一覧を確認してください

  6. 定期タイマーの登録内容を更新するには、「定期タイマーの登録」ページにアクセスしてください。 イベント・サブスクリプションのページで、更新するサブスクリプションの名前をクリックします。

  7. 「定期タイマー」のサブスクリプションページから、イベントメッセージ内のデータを変更してください。 **「カスタム・イベント・データ (Custom event data)」**タブで、イベント・データを hello sunshine に変更します。 **「保存」**をクリックして変更を保存します。

  8. myappアプリケーションは、ログ・ファイルに情報を出力するサンプルcronアプリケーションを参照するため、ログを表示できます。 myapp イベント・コンシューマー・アプリケーションのアプリケーション・ログを表示し、イベント・メッセージが hello sunshine であることを確認します。 コンソールでのアプリのログの表示を参照してください。

CLI でのアプリケーションの定期タイマー (cron) イベントのサブスクライブ

開始前に

ibmcloud ce application create --name myapp --image icr.io/codeengine/cron

CLI を使用してアプリケーションを「Periodic」タイマーサブスクリプションに接続するには、 ibmcloud ce sub cron create コマンドを使用してください。

ibmcloud ce sub cron create --name NAME --destination-type APP --destination APPLICATION_NAME --schedule CRON

たとえば、毎日深夜0時に「 myapp 」というアプリにイベントを送信するcronサブスクリプションを作成するには、次のようにします:

ibmcloud ce sub cron create --name mycronevent --destination-type app --destination myapp --schedule '0 0 * * *'

スケジュール値は、単一ストリングとして処理されるように、引用符で囲む必要があります。

以下の表は、前述の例の sub cron create コマンドで使用されるオプションの要約です。 コマンドとそのオプションについて詳しくは、ibmcloud ce subscription cron create コマンドを参照してください。

コマンド・オプション
オプション 説明
--name cron イベント・ソースの名前。 この値は必須です。
--destination イベント・プロデューサーからイベントを受信する、現行プロジェクトの Code Engine アプリケーションまたはジョブの名前。 この値は必須です。
--destination-type destination のタイプ (この場合は app)。 デフォルト値はappです。
--schedule イベントをトリガーする頻度を、crontab 形式でスケジュールします。 例えば、2 分間隔は */2 * * * * (文字列形式) と指定します。 デフォルトでは、cron イベントは 1 分間隔でトリガーされ、UTC タイム・ゾーンに設定されます。 タイム・ゾーンを変更するには、--time-zone オプションを使用します。 この値はオプションです。
**sub cron**コマンドを使用するためのヒント
  • デフォルトでは、イベントは、宛先アプリケーションのルート URL にルーティングされます。 --path オプションを使用すると、アプリ内の異なる宛先にイベントを送信できます。 例えば、サブスクリプションで--path /eventsが指定されている場合、イベントはhttps://<base application URL>/eventsに送信されます。
  • 周期タイマーイベントのデータサイズは、最大4096バイトに制限されています。 したがって、--data オプションまたは --data-base64 オプションを使用する場合は、最大 4096 バイト送信できます。 詳しくは、Code Engine の制限と割り当て量を参照してください。
  • cron サブスクリプションでは、デフォルトでは UTC タイム・ゾーンが使用されます。 タイム・ゾーンを変更するには、--time-zone コマンドまたは sub cron create コマンドで sub cron update オプションを指定します。 有効なタイムゾーンの値については、 TZ データベースを参照してください。 kubectl を使用してサブスクリプションを作成する場合は、タイム・ゾーンを指定しないと、UTC タイム・ゾーンが割り当てられるので注意してください。
  • アプリまたはジョブ・イベント・コンシューマーをまだ作成していない場合は、**sub cron create**コマンドで--forceオプションを使用して、cron イベント・サブスクリプションを強制的に作成します。 アプリケーションまたはジョブの名前を指定し、cron サブスクリプションの作成後に、アプリケーションの作成または ジョブの作成を行うことができます。

cron サブスクリプションが正常に作成されたことを確認するには、ibmcloud ce sub cron get --name mycronevent コマンドを実行します。

出力例

Getting cron source 'mycronevent'...
OK
Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           2m21s
Created:       2021-03-14T13:37:51-05:00
Destination Type:  app
Destination:       myapp
Schedule:          0 0 * * *
Time Zone:         UTC
Ready:             true
Events:
    Type     Reason            Age        Source                 Messages
    Normal   FinalizerUpdate   12s        pingsource-controller  Updated "mycronevent" finalizers

この出力から、宛先アプリケーションが myapp、スケジュールが 0 0 * * * (毎日午前 0 時)、Ready 状態が true であることがわかります。

CLI を使用したcron サブスクリプションの更新

CLI を使用して cron サブスクリプションを更新するには、ibmcloud ce subscription cron update コマンドを使用します。 例えば、mycronevent サブスクリプションを更新して、myapp というアプリにイベントを 2 分ごとに送信するようにスケジュールを変更するには、次のようにします。

ibmcloud ce sub cron update --name mycronevent --schedule '*/2 * * * *'

cron サブスクリプションが正常に更新されたことを確認するには、ibmcloud ce sub cron get --name mycronevent コマンドを実行します。 サブスクリプションのスケジュールは更新されています。

出力例

Getting cron source 'mycronevent'...
OK
Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           2m21s
Created:       2021-08-31T16:00:49-04:00
Destination Type:  app
Destination:       myapp
Schedule:          */2 * * * *
Time Zone:         UTC
Ready:             true
Events:
  Type    Reason                       Age               Source                 Messages
  Normal  PingSourceSynchronized       7s (x3 over 13m)  pingsource-controller  PingSource adapter is synchronized

チュートリアルを試すには、 定期タイマー (cron) イベントのサブスクライブを参照してください。 コード・サンプルがさらに必要ですか? 「 IBM Cloud Code Engine 」のサンプルについては、 GitHub リポジトリをご覧ください。

コンソールでのアプリケーションのイベント情報の表示

イベント・サブスクリプションに関する情報を表示するには、次のようにします。

  1. Code Engine プロジェクトページ から、自分のプロジェクトに移動します。
  2. 「概要」ページで、**「イベント・サブスクリプション (Event subscriptions)」**をクリックし、定義済みのサブスクリプションのリストを表示します。

アプリケーションがサンプル cron アプリケーションのように情報をログ・ファイルに出力する場合は、イベント・コンシューマー・アプリケーションのログ・ファイルを表示します。 コンソールでのアプリのログの表示を参照してください。

CLI でのアプリケーションのイベント情報の表示

サンプル cron アプリケーションのように、アプリケーションが情報をログ・ファイルに出力する場合は、ibmcloud ce app logs CLI コマンドを使用してイベント・コンシューマー・アプリケーションのログ・ファイルを表示します。 例えば、前の例で作成したアプリケーションのログを表示するには、以下のようにします。

ibmcloud ce application logs --application myapp

出力例

Getting logs for all instances of application 'myapp'...
OK
myapp-mw25y-1-deployment-8579d868f4-ssfnr/user-container:
Listening on port 8080
2021-04-13 17:22:08 - Received:
URL: /
Header: Accept-Encoding=[gzip]
Header: Ce-Id=[d2faa29c-8088-410f-bb30-416085c52a0b]
Header: Ce-Source=[/apis/v1/namespaces/81fvkfqi3n6/pingsources/mycronevent]
Header: Ce-Specversion=[1.0]
Header: Ce-Time=[2021-04-13T17:22:00.059682656Z]
Header: Ce-Type=[dev.knative.sources.ping]
Header: Content-Length=[0]
Header: Forwarded=[for=172.30.136.209;proto=http, for=172.30.48.203]
Header: K-Proxy-Request=[activator]
Header: Traceparent=[00-b13196fe439b6d7d67f3205b2f655788-e9fee441cd41158c-00]
Header: User-Agent=[Go-http-client/1.1]
Header: X-B3-Sampled=[0]
Header: X-B3-Spanid=[1dd2d76079811204]
Header: X-B3-Traceid=[710b7c383682d0cd1dd2d76079811204]
Header: X-Envoy-Attempt-Count=[1]
Header: X-Envoy-Decorator-Operation=[myapp-mw25y-1.81fvkfqi3n6.svc.cluster.local:80/*]
Header: X-Envoy-Internal=[true]
Header: X-Envoy-Peer-Metadata=[ChQKDkFQUF9DT05UQUlORVJTEgIaAAoaCgpDTFVTVEVSX0lEEgwaCkt1YmVybmV0ZXMKGAoNSVNUSU9fVkVSU0lPThIHGgUxLjkuMQq+AwoGTEFCRUxTErMDKrADCh0KA2FwcBIWGhRpc3Rpby1pbmdyZXNzZ2F0ZXdheQoTCgVjaGFydBIKGghnYXRld2F5cwoUCghoZXJpdGFnZRIIGgZUaWxsZXIKNgopaW5zdGFsbC5vcGVyYXRvci5pc3Rpby5pby9vd25pbmctcmVzb3VyY2USCRoHdW5rbm93bgoZCgVpc3RpbxIQGg5pbmdyZXNzZ2F0ZXdheQoZCgxpc3Rpby5pby9yZXYSCRoHZGVmYXVsdAowChtvcGVyYXRvci5pc3Rpby5pby9jb21wb25lbnQSERoPSW5ncmVzc0dhdGV3YXlzCiAKEXBvZC10ZW1wbGF0ZS1oYXNoEgsaCTU1YjU0N2Y0ZgoSCgdyZWxlYXNlEgcaBWlzdGlvCjkKH3NlcnZpY2UuaXN0aW8uaW8vY2Fub25pY2FsLW5hbWUSFhoUaXN0aW8taW5ncmVzc2dhdGV3YXkKLwojc2VydmljZS5pc3Rpby5pby9jYW5vbmljYWwtcmV2aXNpb24SCBoGbGF0ZXN0CiIKF3NpZGVjYXIuaXN0aW8uaW8vaW5qZWN0EgcaBWZhbHNlChoKB01FU0hfSUQSDxoNY2x1c3Rlci5sb2NhbAouCgROQU1FEiYaJGlzdGlvLWluZ3Jlc3NnYXRld2F5LTU1YjU0N2Y0Zi10aHN4cAobCglOQU1FU1BBQ0USDhoMaXN0aW8tc3lzdGVtCl0KBU9XTkVSElQaUmt1YmVybmV0ZXM6Ly9hcGlzL2FwcHMvdjEvbmFtZXNwYWNlcy9pc3Rpby1zeXN0ZW0vZGVwbG95bWVudHMvaXN0aW8taW5ncmVzc2dhdGV3YXkKFwoRUExBVEZPUk1fTUVUQURBVEESAioACicKDVdPUktMT0FEX05BTUUSFhoUaXN0aW8taW5ncmVzc2dhdGV3YXk=]
Header: X-Envoy-Peer-Metadata-Id=[router~172.30.48.203~istio-ingressgateway-55b547f4f-thsxp.istio-system~istio-system.svc.cluster.local]
Header: X-Forwarded-For=[172.30.136.209, 172.30.48.203, 172.30.167.171]
Header: X-Forwarded-Proto=[http]
Header: X-Request-Id=[fe8d6cec-f0e4-47c2-b9ae-81764cb377bc]

ロギングについて詳しくは、ログの表示を参照してください。

コード・サンプルがさらに必要ですか? 「 IBM Cloud Code Engine 」のサンプルについては、 GitHub リポジトリをご覧ください。

アプリケーションに配信されるイベントの cron ヘッダーと本文の情報

アプリケーションに配信されるすべてのイベントは、HTTP POST メッセージとして受信されます。 イベントには特定の HTTP ヘッダーが含まれており、イベントの本文 (ビジネス・ロジック) を確認しなくても、イベントに関する重要な情報を素早く判別することができます。 詳細については、 CloudEvents 仕様 をご覧ください。

headers

次の表は、定期タイマー(cron)イベントのヘッダーについて説明したものです

イベントのヘッダーフィールド
ヘッダー 説明
ce-id イベントの固有 ID。ただし、イベントが再生された場合は、同じ ID が割り当てられます。
ce-source このイベントがイベント・プロデューサーから生成された場所を示す URI 参照。 cron イベントの場合、このヘッダーは、プロジェクトのサブドメインと cron サブスクリプションの名前が含まれた URI 参照で、/apis/v1/namespaces/[PROJECT_SUBDOMAIN]/pingsources/[SUBSCRIPTION_NAME] という形式になります。
ce-specversion CloudEvents 仕様のバージョン。 この値は常に 1.0 です。
ce-time イベントが生成された時刻。
ce-type イベントのタイプ。 cron イベントの場合、これは dev.knative.sources.ping です。

出力例

ce-id: c329ed76-5004-4383-a3cc-c7a9b82e3ac6
ce-source: /apis/v1/namespaces/6b0v3x9xek5/pingsources/mycronevent
ce-specversion: 1.0
ce-time: 2021-02-26T19:19:00.497637287Z
ce-type: dev.knative.sources.ping

HTTP 本文

HTTP 本文は、イベントそのものが入っており、サブスクリプションの作成時または更新時に指定した形式になります。

関数に対する定期的なタイマー(cron)イベントの購読

定期タイマーサブスクリプションは、コンソールまたはCLIから操作できます。

イベントは、 HTTP へのPOSTリクエストとして関数に送信されます。 イベントに含まれる情報について詳しくは、イベントの HTTP ヘッダーおよび本文の情報を参照してください。

コンソールから関数の定期タイマー(cron)イベントを購読する

コンソールから、関数に対する定期タイマーイベントのサブスクリプションを作成および更新できます。

開始前に

/**
 * The `main` function is the entry-point into the function.
 * It has one optional argument 'params', which carries all the
 * parameters the function was invoked with.
*/
async function main(params) {
  // add process environment variables
  params.env = process.env
  // print recognizable string to the log
  console.log('Function invocation via cron subscription');
  // log params object, so invocation can be observed in the logs
  console.dir(params);
  // craft a simple HTTP RC 200 response,
  // which also echos the params object
  response = {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    },
    body: params
  };
  return response
}

コンソールから関数の「定期タイマーイベント」サブスクリプションを作成および更新するには、以下の手順を実行してください。

  1. Code Engine プロジェクトページ から、自分のプロジェクトに移動します。

  2. 「概要」ページで、**「イベント・サブスクリプション (Event subscriptions)」**をクリックします。

  3. 「イベント・サブスクリプション (Event subscriptions)」ページで**「作成」**をクリックして、サブスクリプションを作成します。

  4. 「イベントのサブスクリプションを作成」ページで、以下の手順を実行してください:

    1. イベント・タイプの場合は、「定期的タイマー」タイルを選択します。 **「次へ」**をクリックします。
    2. **「一般」**に、定期タイマー・サブスクリプションの名前 (例えば myptimer) を入力します。 オプションで、イベント属性を指定できます。 定期タイマー・イベントのコンシューマーがアプリケーションの場合、使用できるイベント属性は HTTP ヘッダーとなることに注意してください。 イベント・コンシューマーが関数の場合、イベント属性は、 params オブジェクトの __ce_headers プロパティーでキーと値のペアとして使用できます。 **「次へ」**をクリックして、先に進みます。
    3. **「スケジュール」**に、イベントのタイミングに関する情報を指定します。 「Periodic」タイマーイベントプロデューサーは、標準のcrontab構文を使用して間隔の詳細を指定します。 提供されているパターンから間隔を選択するか、0 0 * * * (これは、毎日午前 0 時にイベントを発生させることを指定している) などの独自のカスタム cron 式を入力します。 この例では、毎日、毎時、毎分のスケジュール・パターンを選択します。 cron 式が自動的に生成されることに注意してください。 日、時、分のパターンと cron 式は協定世界時 (UTC) で表されます。 スケジュールを指定しない場合、このイベント・サブスクリプションは 1 分ごとにイベントを送信します。 予定されているスケジュール済みのイベントのリストが表示されます。 これらのスケジュール済みイベントは、ご使用のタイム・ゾーンの形式で表示されることに注意してください。 **「次へ」**をクリックして、先に進みます。
    4. **「カスタム・イベント・データ (Custom event data)」**に、イベント・メッセージの本文に含めるデータを入力します。 メッセージは、プレーン・テキストまたは base64 形式で指定できます。 この例では、イベント・メッセージの本文として hello stranger というテキストを指定します。 メッセージが base64 形式の場合、イベントの送信時にメッセージをデコードすることを選択できます。 カスタム・イベント・データのコンテンツ・タイプを指定することもできます。 **「次へ」**をクリックして、先に進みます。
    5. 「イベント・コンシューマー」 で、コンポーネント・タイプ Function を選択し、イベントを受信する関数を指定します。 定義済みの関数のリストから選択できることに注意してください。 この例では、サンプル・インライン・コードを使用する myfun 関数を使用します。 関数をまだ作成していない場合は、定期タイマー・サブスクリプションの作成後に、関数の名前と インライン・コードを使用した関数ワークロードの作成 を指定できます。 **「次へ」**をクリックして、先に進みます。
    6. **「サマリー」**で、定期タイマー・イベント・サブスクリプションの設定を確認し、必要に応じて変更を加えます。 準備ができたら、「 作成 」をクリックして、定期タイマーサブスクリプションを作成してください。
  5. 「Periodic」タイマーのサブスクリプションが作成されたので、「イベントサブスクリプション」ページに移動し、 定義済みのサブスクリプションの一覧を確認してください

  6. 定期タイマーの登録内容を更新するには、「定期タイマーの登録」ページにアクセスしてください。 イベント・サブスクリプションのページで、更新するサブスクリプションの名前をクリックします。

  7. 「定期タイマー」のサブスクリプションページから、イベントメッセージ内のデータを変更してください。 「カスタム・イベント・データ」 タブで、イベント・データを { "hello": "world" } に変更し、 「カスタム・イベント・データのコンテンツ・タイプ」 として application/json を選択します。 **「保存」**をクリックして変更を保存します。

  8. myfun 関数は、 params オブジェクト全体をログ・ファイルに出力するサンプル・インライン・コードを使用するため、ログを表示して、関数が呼び出されたことを確認できます。 myfun イベント・コンシューマー関数の関数ログを表示し、 params オブジェクトにキーと値のペア hello: world が含まれていることを確認します。 params オブジェクトの body フィールドに Base64 エンコード値が含まれていることも確認できます。 { "hello": "world" } コンソールからの機能ログの表示 を参照してください。

CLI を使用して、関数の定期的なタイマー(cron)イベントを登録する

開始前に

/**
 * The `main` function is the entry-point into the function.
 * It has one optional argument 'params', which carries all the
 * parameters the function was invoked with.
*/
async function main(params) {
  // add process environment variables
  params.env = process.env
  // print recognizable string to the log
  console.log('Function invocation via cron subscription');
  // log params object, so invocation can be observed in the logs
  console.dir(params);
  // craft a simple HTTP RC 200 response,
  // which also echos the params object
  response = {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    },
    body: params
  };
  return response
}

コードを sample_inline_code.js というファイルに保存し、以下のコマンドを使用して関数を作成します。

ibmcloud ce function create --name myfun --runtime nodejs --inline-code ./sample_inline_code.js

CLI を使用して関数を「Periodic」タイマーサブスクリプションに接続するには、 ibmcloud ce sub cron create コマンドを使用します:

ibmcloud ce sub cron create --name NAME --destination-type function --destination FUNCTION_NAME --schedule CRON

たとえば、毎日深夜0時に「 myfun 」というアプリにイベントを送信するcronサブスクリプションを作成するには、次のようにします:

ibmcloud ce sub cron create --name mycronevent --destination-type function --destination myfun --schedule '0 0 * * *'

スケジュール値は、単一ストリングとして処理されるように、引用符で囲む必要があります。

以下の表は、前述の例の sub cron create コマンドで使用されるオプションの要約です。 コマンドとそのオプションについて詳しくは、ibmcloud ce subscription cron create コマンドを参照してください。

コマンド・オプション
オプション 説明
--name cron イベント・ソースの名前。 この値は必須です。
--destination イベントプロデューサーからイベントを受信する、現在のプロジェクト内の Code Engine アプリケーション、関数、またはジョブの名前。 この値は必須です。
--destination-type destination のタイプ (この場合は function)。 デフォルト値はappです。
--schedule イベントをトリガーする頻度を、crontab 形式でスケジュールします。 例えば、2 分間隔は */2 * * * * (文字列形式) と指定します。 デフォルトでは、cron イベントは 1 分間隔でトリガーされ、UTC タイム・ゾーンに設定されます。 タイム・ゾーンを変更するには、--time-zone オプションを使用します。 この値はオプションです。
**sub cron**コマンドを使用するためのヒント
  • 周期タイマーイベントのデータサイズは、最大4096バイトに制限されています。 したがって、--data オプションまたは --data-base64 オプションを使用する場合は、最大 4096 バイト送信できます。 詳しくは、Code Engine の制限と割り当て量を参照してください。
  • cron サブスクリプションでは、デフォルトでは UTC タイム・ゾーンが使用されます。 タイム・ゾーンを変更するには、--time-zone コマンドまたは sub cron create コマンドで sub cron update オプションを指定します。 有効なタイムゾーンの値については、 TZ データベースを参照してください。 kubectl を使用してサブスクリプションを作成する場合は、タイム・ゾーンを指定しないと、UTC タイム・ゾーンが割り当てられるので注意してください。
  • アプリまたはジョブ・イベント・コンシューマーをまだ作成していない場合は、**sub cron create**コマンドで--forceオプションを使用して、cron イベント・サブスクリプションを強制的に作成します。 クーロン・サブスクリプションの作成後に、関数の名前を指定できます。 関数の作成

cron サブスクリプションが正常に作成されたことを確認するには、ibmcloud ce sub cron get --name mycronevent コマンドを実行します。

出力例

Getting cron event subscription 'mycronevent'...
OK
Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           2m21s
Created:       2024-03-14T13:37:51-05:00
Destination Type:  function
Destination:       myfun
Schedule:          0 0 * * *
Time Zone:         UTC
Ready:             true
Events:
  Type    Reason                  Age                Source                 Messages
  Normal  FinalizerUpdate         20s                pingsource-controller  Updated "mycronevent" finalizers
  Normal  PingSourceSynchronized  20s                pingsource-controller  PingSource adapter is synchronized

この出力から、宛先関数が myfun、スケジュールが ` `0 0 * * *` `(毎日深夜0時)、および「Ready」状態が ` `true であることがわかります。

CLI を使用したcron サブスクリプションの更新

CLI を使用して cron サブスクリプションを更新するには、ibmcloud ce subscription cron update コマンドを使用します。 たとえば、「 mycronevent 」サブスクリプションを更新して、2分ごとに「 myfun 」という関数にイベントを送信するようにスケジュールを変更します

ibmcloud ce sub cron update --name mycronevent --schedule '*/2 * * * *'

cron サブスクリプションが正常に更新されたことを確認するには、ibmcloud ce sub cron get --name mycronevent コマンドを実行します。 サブスクリプションのスケジュールは更新されています。

出力例

Getting cron event subscription 'mycronevent'...
OK
Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           37m41s
Created:       2024-03-14T14:04:51-05:00
Destination Type:  function
Destination:       myfun
Schedule:          */2 * * * *
Time Zone:         UTC
Ready:             true
Events:
  Type    Reason                  Age                Source                 Messages
  Normal  FinalizerUpdate         20s                pingsource-controller  Updated "mycronevent" finalizers
  Normal  PingSourceSynchronized  20s                pingsource-controller  PingSource adapter is synchronized

チュートリアルを試すには、 定期タイマー (cron) イベントのサブスクライブを参照してください。 コード・サンプルがさらに必要ですか? 「 IBM Cloud Code Engine 」のサンプルについては、 GitHub リポジトリをご覧ください。

コンソールから関数のイベント情報を表示する

イベントの購読に関する情報を確認するには:

  1. Code Engine プロジェクトページ から、自分のプロジェクトに移動します。
  2. 「概要」ページで、**「イベント・サブスクリプション (Event subscriptions)」**をクリックし、定義済みのサブスクリプションのリストを表示します。

サンプルの「 codeengine 」ジョブのように、関数がログファイルに情報を出力する場合は、その関数のログファイルを確認してください。 コンソールでのジョブのログの表示を参照してください。

関数に送信されるイベントのCronヘッダーおよび本文情報

関数に送信されるすべてのイベントは、 HTTP のPOSTメッセージとして受信されます。 イベントには、そのイベントに関する重要な情報を素早く把握するのに役立つ、特定の HTTP ヘッダーが含まれています。 HTTP ヘッダーは、この関数が呼び出される際に渡される params オブジェクトの __ce_headers プロパティに格納されます。 詳細については、 CloudEvents 仕様 をご覧ください。

headers

以下の表では、定期タイマー (cron) イベントの __ce_headers のキーと値のペアについて説明します。

イベント用ヘッダーファイル
ヘッダー 説明
Ce-Id イベントの固有 ID。ただし、イベントが再生された場合は、同じ ID が割り当てられます。
Ce-Source このイベントがイベント・プロデューサーから生成された場所を示す URI 参照。 cron イベントの場合、このヘッダーは、プロジェクトのサブドメインと cron サブスクリプションの名前が含まれた URI 参照で、/apis/v1/namespaces/[PROJECT_SUBDOMAIN]/pingsources/[SUBSCRIPTION_NAME] という形式になります。
Ce-Specversion CloudEvents 仕様のバージョン。 この値は常に 1.0 です。
Ce-Time イベントが生成された時刻。
Ce-Type イベントのタイプ。 cron イベントの場合、これは dev.knative.sources.ping です。

出力例

  __ce_headers: {
     "Ce-Id": "b861440f-0e17-44ab-9bab-826da0c9713f",
     "Ce-Source": "/apis/v1/namespaces/7iuw2furi55/pingsources/mycronevent",
     "Ce-Specversion": "1.0",
     "Ce-Time": "2024-06-02T10:56:00.062572905Z",
     "Ce-Type": "dev.knative.sources.ping"
  }

HTTP 本文

HTTP の本文には、カスタムイベントデータが含まれており、その形式は、サブスクリプションの作成または更新時に指定したものです。 カスタム・イベント・データには、 params オブジェクトの body プロパティーからアクセスできます。

カスタム・イベント・データが hello stranger に設定され、 「カスタム・イベント・データのコンテンツ・タイプ」text/plain に設定されたイベント呼び出しの params オブジェクトの例:

  {
    "__ce_headers": {
        "Ce-Id": "b861440f-0e17-44ab-9bab-826da0c9713f",
        "Ce-Source": "/apis/v1/namespaces/7iuw2furi55/pingsources/mycronevent",
        "Ce-Specversion": "1.0",
        "Ce-Time": "2024-06-02T10:56:00.062572905Z",
        "Ce-Type": "dev.knative.sources.ping",
        "Content-Length": "14",
        "Content-Type": "text/plain"
    },
    "body": "hello stranger"
  }

カスタムイベントデータのコンテンツタイプがapplication/json 」に設定されている場合、 body の値は Base64 エンコードされたものとなります。

ジョブの定期タイマー (cron) イベントのサブスクライブ

定期タイマーサブスクリプションは、コンソールまたはCLIから操作できます。

ジョブはイベントを環境変数として受け取ります。 cron によって送信される環境変数について詳しくは、イベントの環境変数を参照してください。

コンソールでのジョブの定期タイマー (cron) イベントのサブスクライブ

コンソールから、ジョブの定期タイマーイベントのサブスクリプションを作成および更新することができます。

開始前に

コンソールからジョブの「定期タイマーイベント」サブスクリプションを作成および更新するには、以下の手順を実行してください。

  1. Code Engine プロジェクトページ から、自分のプロジェクトに移動します。

  2. 「概要」ページで、**「イベント・サブスクリプション (Event subscriptions)」**をクリックします。

  3. 「イベント・サブスクリプション (Event subscriptions)」ページで**「作成」**をクリックして、サブスクリプションを作成します。

  4. 「イベントのサブスクリプションを作成」ページで、以下の手順を実行してください:

    1. **「一般」**に、定期タイマー・サブスクリプションの名前 (例えば myptimer2) を入力します。 オプションで、イベント属性を指定できます。 定期タイマー・イベントのコンシューマーがアプリケーションの場合、使用できるイベント属性は HTTP ヘッダーとなることに注意してください。 イベントのコンシューマーがジョブの場合は、使用できるイベント属性は環境変数になります。 **「次へ」**をクリックして、先に進みます。
    2. **「スケジュール」**に、イベントのタイミングに関する情報を指定します。 「Periodic」タイマーイベントプロデューサーは、標準のcrontab構文を使用して間隔の詳細を指定します。 提供されているパターンから間隔を選択するか、0 0 * * * (これは、毎日午前 0 時にイベントを発生させることを指定している) などの独自のカスタム cron 式を入力します。 この例では、毎日、毎時、毎分のスケジュール・パターンを選択します。 cron 式が自動的に生成されることに注意してください。 日、時、分のパターンと cron 式は協定世界時 (UTC) で表されます。 スケジュールを指定しない場合、このイベント・サブスクリプションは 1 分ごとにイベントを送信します。 予定されているスケジュール済みのイベントのリストが表示されます。 これらのスケジュール済みイベントは、ご使用のタイム・ゾーンの形式で表示されることに注意してください。 **「次へ」**をクリックして、先に進みます。
    3. **「カスタム・イベント・データ (Custom event data)」**に、イベント・メッセージの本文に含めるデータを入力します。 メッセージは、プレーン・テキストまたは base64 形式で指定できます。 この例では、イベント・メッセージの本文として hello stranger というテキストを指定します。 メッセージが base64 形式の場合、イベントの送信時にメッセージをデコードすることを選択できます。 カスタム・イベント・データのコンテンツ・タイプを指定することもできます。 **「次へ」**をクリックして、先に進みます。
    4. **「イベント・コンシューマー (Event consumer)」**に、イベントを受信するアプリケーションまたはジョブを指定します。 定義済みのアプリケーションとジョブのリストから選択できることに注意してください。 この例では、icr.io/codeengine/codeengineイメージを参照するmyjobジョブを使用します。 まだジョブを作成していない場合は、定期タイマーサブスクリプションを作成した後で、ジョブ名を指定して ジョブを作成 することができます。 **「次へ」**をクリックして、先に進みます。
    5. **「サマリー」**で、定期タイマー・イベント・サブスクリプションの設定を確認し、必要に応じて変更を加えます。 準備ができたら、「 作成 」をクリックして、定期タイマーサブスクリプションを作成してください。
  5. 「Periodic」タイマーのサブスクリプションが作成されたので、「イベントサブスクリプション」ページに移動し、 定義済みのサブスクリプションの一覧を確認してください

  6. 定期タイマーの登録内容を更新するには、「定期タイマーの登録」ページにアクセスしてください。 イベント・サブスクリプションのページで、更新するサブスクリプションの名前をクリックします。

  7. 「定期タイマー」のサブスクリプションページから、イベントメッセージ内のデータを変更してください。 **「カスタム・イベント・データ (Custom event data)」**タブで、イベント・データを hello sunshine に変更します。 **「保存」**をクリックして変更を保存します。

  8. myjob ジョブは、ログ・ファイルに情報を出力するサンプル codeengine アプリケーションを参照しているので、そのログを確認します。 myjob イベント・コンシューマー・ジョブのジョブ・ログを表示し、イベント・メッセージが hello sunshine であることを確認します。 コンソールでのジョブのログの表示を参照してください。

CLI でのジョブの定期タイマー (cron) イベントのサブスクライブ

開始前に

ibmcloud ce job create --name myjob --image icr.io/codeengine/codeengine

CLI を使用して、 ibmcloud ce sub cron create コマンドを使用します。

ibmcloud ce sub cron create --name NAME --destination-type job --destination JOB_NAME --schedule CRON

例えば、5 分間隔で myjob というジョブにイベントを送信する cron サブスクリプションを作成するには、次のようにします。

ibmcloud ce sub cron create --name mycronevent --destination-type job --destination myjob --schedule '*/5 * * * *' --data '{ "message": "Hello world!" }' --content-type application/json

スケジュール値は、単一ストリングとして処理されるように、引用符で囲む必要があります。

以下の表は、この例の sub cron create コマンドで使用されるオプションの要約です。 コマンドとそのオプションについて詳しくは、ibmcloud ce subscription cron create コマンドを参照してください。

コマンド・オプション
オプション 説明
--name cron イベント・ソースの名前。
--destination-type destination のタイプ (この場合は job)。
--destination イベント・プロデューサーからイベントを受信する、現行プロジェクトの Code Engine ジョブの名前。
--schedule イベントをトリガーする頻度を、crontab 形式でスケジュールします。 例えば、2 分間隔は */2 * * * * (文字列形式) と指定します。 デフォルトでは、cron イベントは 1 分間隔でトリガーされ、UTC タイム・ゾーンに設定されます。 タイム・ゾーンを変更するには、--time-zone オプションを使用します。 この値はオプションです。
**sub cron**コマンドを使用するためのヒント
  • 周期タイマーイベントのデータサイズは、最大4096バイトに制限されています。 したがって、--data オプションまたは --data-base64 オプションを使用する場合は、最大 4096 バイト送信できます。 詳しくは、Code Engine の制限と割り当て量を参照してください。
  • cron サブスクリプションでは、デフォルトでは UTC タイム・ゾーンが使用されます。 タイム・ゾーンを変更するには、--time-zone コマンドまたは sub cron create コマンドで sub cron update オプションを指定します。 有効なタイムゾーンの値については、 TZ データベースを参照してください。 kubectl を使用してサブスクリプションを作成する場合は、タイム・ゾーンを指定しないと、UTC タイム・ゾーンが割り当てられるので注意してください。
  • アプリまたはジョブ・イベント・コンシューマーをまだ作成していない場合は、**sub cron create**コマンドで--forceオプションを使用して、cron イベント・サブスクリプションを強制的に作成します。 アプリケーションまたはジョブの名前を指定し、cron サブスクリプションの作成後に、アプリケーションの作成または ジョブの作成を行うことができます。

cron サブスクリプションが正常に作成されたことを確認するには、ibmcloud ce sub cron get --name mycronevent を実行します。

出力例

Getting cron source 'mycronevent'...
OK
Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           54s
Created:       2021-04-13T11:38:50-05:00
Destination Type:  job
Destination:       myjob
Schedule:          */5 * * * *
Time Zone:         UTC
Content Type:      application/json
Data:              { "message": "Hello world!" }
Ready:             true
Events:
    Type     Reason            Age        Source                 Messages
    Normal   FinalizerUpdate   12s        pingsource-controller  Updated "mycronevent" finalizers

この出力から、宛先ジョブが myjob、スケジュールが */5 * * * * (5 分間隔)、Ready 状態が true であることがわかります。

サブスクリプションで作成されたジョブ実行は 10 分後に削除されます。

CLI (ジョブ) を使用した cron サブスクリプションの更新

CLI を使用して cron サブスクリプションを更新するには、ibmcloud ce subscription cron update コマンドを使用します。 例えば、mycronevent サブスクリプションを更新して、myapp というアプリにイベントを 2 分ごとに送信するようにスケジュールを変更するには、次のようにします。

ibmcloud ce sub cron update --name mycronevent --schedule '*/2 * * * *'

cron サブスクリプションが正常に更新されたことを確認するには、ibmcloud ce sub cron get --name mycronevent コマンドを実行します。 サブスクリプションのスケジュールは更新されています。

出力例

Getting cron source 'mycronevent'...
OK
Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           2m21s
Created:       2021-08-31T16:00:49-04:00
Destination Type:  job
Destination:       myjob
Schedule:          */2 * * * *
Time Zone:         UTC
Content Type:      application/json
Data:              { "message": "Hello world!" }
Ready:             true
Events:
  Type    Reason                       Age               Source                 Messages
  Normal  PingSourceSynchronized       7s (x3 over 13m)  pingsource-controller  PingSource adapter is synchronized

コンソールでのジョブのイベント情報の表示

イベント・サブスクリプションに関する情報を表示するには、次のようにします。

  1. Code Engine プロジェクトページ から、自分のプロジェクトに移動します。
  2. 「概要」ページで、**「イベント・サブスクリプション (Event subscriptions)」**をクリックし、定義済みのサブスクリプションのリストを表示します。

サンプル codeengine ジョブのように、ジョブが情報をログ・ファイルに出力する場合は、イベント・コンシューマー・ジョブのログ・ファイルを表示します。 コンソールでのジョブのログの表示を参照してください。

CLI でのジョブのイベント情報の表示

サンプル codeengine ジョブのように、ジョブが情報をログ・ファイルに出力する場合は、定期タイマー (cron) イベントから作成されたジョブ実行を見つけ、そのジョブ実行のログを確認することができます。 例えば、前の例のジョブのジョブ実行を見つけるには、以下のようにします。

ibmcloud ce jobrun list

出力例

Listing job runs...
OK
Name         Failed  Pending  Requested  Running  Succeeded  Unknown  Age
myjob-kd829  0       0        0          0        1          0        43s

ジョブ実行名を指定して、ジョブ実行のログを表示します。

ibmcloud ce jobrun logs --jobrun myjob-kd829

出力例

Hello from helloworld! I'm a batch job! Index: 0
Hello World from:
. ___  __  ____  ____
./ __)/  \(    \(  __)
( (__(  O )) D ( ) _)
.\___)\__/(____/(____)
.____  __ _   ___  __  __ _  ____
(  __)(  ( \ / __)(  )(  ( \(  __)
.) _) /    /( (_ \ )( /    / ) _)
(____)\_)__) \___/(__)\_)__)(____)
Some Env Vars:
--------------
CE_DATA={ "message": "Hello world!" }
CE_ID=abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
CE_SOURCE=/apis/v1/namespaces/1234abcd1a2/pingsources/mycroneventjob
CE_SPECVERSION=1.0
CE_TIME=2021-04-13T17:41:00.429658447Z
CE_TYPE=dev.knative.sources.ping
CONTENT_TYPE=application/json
HOME=/root
HOSTNAME=myjob-mpps4-0-0
JOB_INDEX=0
KUBERNETES_PORT=tcp://172.21.0.1:443
KUBERNETES_PORT_443_TCP=tcp://172.21.0.1:443
KUBERNETES_PORT_443_TCP_ADDR=172.21.0.1
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_HOST=172.21.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1

なお、ジョブの実行に関するログ情報は1時間しか保持されませんのでご注意ください。 ロギングについて詳しくは、ログの表示を参照してください。

cron によって送信される環境変数について詳しくは、イベントの環境変数を参照してください。

コード・サンプルがさらに必要ですか? 「 IBM Cloud Code Engine 」のサンプルについては、 GitHub リポジトリをご覧ください。

ジョブに配信されるイベントの環境変数

ジョブに配信されるすべてのイベントは、環境変数として受信されます。 これらの環境変数には「 CE_ 」というプレフィックスが付いており、 CloudEvents 仕様 に基づいています。

各イベントには、イベントがジョブに配信されるたびに表示されるいくつかの共通の環境変数が含まれています。 各イベントの実際の変数のセットには、これより多くのオプションが含まれる可能性があります。 詳細については、「 CloudEvent 」の属性を参照してください。

cron イベントに固有の環境変数について、以下の表で説明します。

イベントの環境変数
変数 説明
CE_DATA イベントのデータ (本文)。 クーロン・イベントについての CE_DATA を参照してください。
CE_ID イベントの固有 ID。ただし、イベントが再生された場合は、同じ ID が割り当てられます。
CE_SOURCE このイベントがイベント・プロデューサーから生成された場所を示す URI 参照。 cron イベントの場合、これは、プロジェクトのサブドメインと cron サブスクリプションの名前が含まれた URI 参照で、/apis/v1/namespaces/[PROJECT_SUBDOMAIN]/pingsources/[SUBSCRIPTION_NAME] という形式になります。
CE_SPECVERSION CloudEvents 仕様のバージョン。 この値は常に 1.0 です。
CE_TIME イベントが生成された時刻。
CE_TYPE イベントのタイプ。 cron イベントの場合、これは dev.knative.sources.ping です。

CE_DATA環境変数

定期的なタイマーイベントの場合、 CE_DATA 環境変数にはイベント自体が格納されており、その形式はサブスクリプションの作成または更新時に指定した形式となります。

出力例

CE_DATA={ "message": "Hello world!" }
CE_ID=abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
CE_SOURCE=/apis/v1/namespaces/1234abcd1a2/pingsources/mycroneventjob
CE_SPECVERSION=1.0
CE_TIME=2021-04-13T17:41:00.429658447Z
CE_TYPE=dev.knative.sources.ping

追加のイベント属性の定義

サブスクリプションを作成するときに、生成されるイベントに含める追加のイベント属性を定義できます。 これらのイベント属性は、イベント配信で他の CloudEvent 属性と同様に表示されます。 既存の CloudEvent 属性の名前を指定することにした場合、イベントに含まれていた元の値がオーバーライドされます。 詳しくは、他の CloudEvents 仕様を使用できますか? を参照してください。

コンソールでは、**「一般」**タブで、定期タイマー (cron) イベント・サブスクリプションに対しイベント属性をキーと値のペアとして指定できます。

CLI で追加の属性を定義するには、ibmcloud ce sub cron create CLI コマンドで--extensionオプションを使用します。

サブスクリプションの削除

不要になった定期タイマー (cron) サブスクリプションは削除できます。

コンソールからのサブスクリプションの削除

  1. Code Engine プロジェクトページ から、自分のプロジェクトに移動します。
  2. 「概要」ページで、**「イベント・サブスクリプション (Event subscriptions)」**をクリックし、定義済みのサブスクリプションのリストを表示します。
  3. アプリケーションまたはジョブから削除するサブスクリプションを、サブスクリプションのリストから削除します。

アプリまたはジョブを削除しても、サブスクリプションは削除されません。

CLI でのサブスクリプションの削除

ibmcloud ce sub cron delete コマンドまたは ibmcloud ce sub cos delete コマンドを実行してサブスクリプションを削除できます。

例えば、mycronevent2 という cron サブスクリプションを削除します。

ibmcloud ce subscription cron delete --name mycronevent2

アプリまたはジョブを削除しても、サブスクリプションは削除されません。 その代わりに、CLI で、サブスクリプションの Ready 状態が false になります。サブスクリプションは、アプリケーションまたはジョブが使用可能であることに依存しているからです。 そのアプリまたはジョブ (または同じ名前の別のアプリまたはジョブ) を再作成すると、サブスクリプションが再び関連付けられ、Ready 状態が true になります。