Technical Articles
SAP Business Technology Platform – SAP Job Scheduling service概要
はじめに
本ブログではSAP Business Technology Platformで利用可能なSAP Job Scheduling serviceの概要と、簡単なデモをご紹介いたします。本ブログをお読みいただくことで、SAP Job Scheduling serviceを用いた定期的なAPIコールと、Cloud Foundryタスクの実行方法をご習得いただけます。また、ご紹介する手順はトライアル環境でもお試しいただくことが可能です。
前提知識
前提知識がなくても、本ブログの内容はご理解いただけるようになっています。途中でNode.jsを用いたプログラミングを行う手順がありますが、ソースコードをコピペするだけで進めていただけます。
目次
- SAP Job Scheduling serviceとは
- 概要
- アーキテクチャ
- デモ準備
- 環境セットアップ
- バッキングサービスのセットアップ
- SAP Job Scheduling service
- XSUAA
- デモ① – APIコール
- 実行対象となるアプリケーションのデプロイ
- SAP Job Scheduling serviceでのジョブの作成
- デモ② – Cloud Foundryタスク
- 実行対象となるタスクのデプロイ
- SAP Job Scheduling serviceでのジョブの作成
1. SAP Job Scheduling serviceとは
1-1. 概要
SAP Job Scheduling serviceは、SAP Business Technology Platform(SAP BTP)が提供するバッキングサービスの1つで、”ジョブ”とそのジョブの”スケジュール”の定義および管理を行うツールです。SAP Job Scheduling serviceを利用することで、バッチ処理などの時間をトリガーにしたプロセスをSAP BTP上で実現することができます。
注意点として、SAP Job Scheduling serviceはあくまでツールであり、アプリケーションとは独立したサービスになります。
ジョブ
ジョブには「何を実行するか」を定義します。本ブログ執筆時点(2021年12月)では、以下の2種類のジョブを定義することができます。
APIコール
Cloud Foundry上で起動しているアプリケーションのエンドポイントを呼び出します。
Cloud Foundryタスクの実行
Cloud Foundryタスク(CFタスク)としてデプロイしたアプリケーションを実行します。
スケジュール
スケジュールには、作成したジョブに対してそれを「いつ実行するか」を定義します。「毎日23:50に実行」のように定期的なスケジュールを定義できるほか、「今から30分後に1回だけ実行」のように単発のスケジュールを定義することができます。
1-2. アーキテクチャ
SAP Job Scheduling serviceを用いた最もシンプルなアーキテクチャは以下のようになります。SAP Job Scheduling serviceとアプリケーションの関係は、ここまででご説明してきた通りです。
ここで、新たにSAP Authorization and Trust Management service(XSUAA)と呼ばれるCloud Foundry環境における認証、認可を司るバッキングサービスが登場しています。SAP Job Scheduling serviceはアプリケーションに認証、認可の仕組みが実装されているかどうかにかかわらず、呼び出し先のアプリケーションのXSUAAから認可の設定を参照する仕組みになっています。そのため、アプリケーションはSAP Job Scheduling serviceだけでなく、XSUAAもバインドしておく必要があります。
2. デモ準備
2-1. 開発環境のセットアップ
アプリケーションの開発を行う環境を準備します。Visual Studio CodeなどのローカルなIDEを利用できるほか、SAPが提供するブラウザベースのオンラインIDEであるSAP Business Application Studioも利用できます。
Visual Studio Codeを用いて開発する場合は、アプリケーションをデプロイするためのコマンドラインクライアントである”cf CLI”をインストールしてください。(cf CLIのインストール方法はこちらをご参照ください。)
SAP Business Application Studioにはcf CLIを含む、開発に必要なモジュールがすでにプリインストールされています。(詳しい利用方法は、こちらのブログポストをご参照ください。)
どちらの場合も、”cf login”コマンドでSAP BTPにログインする必要があります。(ログイン方法はこちらのブログポストをご参照ください。)
※開発ツールを使わず、SAP BTP cockpitからGUIでデプロイすることも可能です。
2-2. バッキングサービスのセットアップ
2-2-1. SAP Job Scheduling service
デモでデプロイするアプリケーションがSAP Job Scheduling serviceを利用できる状態にするために、サービスインスタンスを作成します。
いずれのバッキングサービスもSAP BTP cockpitの”Service Marketplace”からインスタンスを作成できます。cockpitから”Service Marketplace”にアクセスし、”Job Scheduling Service”で検索してください。画像のように”Create”をクリックしてください。
※もし”Service Marketplace”にJob Scheduling Serviceが現れない場合は、サブアカウントにEntitlementを追加してください。(Entitlementの追加方法はこちらのブログポストのStep1. – Step8.をご参照ください。)
インスタンス作成画面が表示されます。
“Instance Name”にはお好みの名前を付けてください。(SAP Job Scheduling serviceのインスタンスは他のユーザが作成したものを含む複数のジョブ、スケジュールを管理できるので、他のユーザも使いやすいような汎用的な名前にすると便利かもしれません。)
※画像の環境はトライアル環境なので、Planが”lite”となっております。トライアル環境でない環境で実施いただいている方は、Planが”standard”に固定されます。(”lite”の場合は”standard”と比較して、定義可能なスケジュール数と定期的なスケジュールに設定できる頻度に制限があります。)
次の画面では、パラメータとして以下を入力してください。
{
"enable-xsuaa-support": true
}
“Create”をクリックすると、インスタンスが作成されます。
“Instances and Subscription”画面で、作成したインスタンスのStatusが”Created”になればインスタンス作成は完了です。
2-2-2. XSUAA
SAP Job Scheduling serviceと同様の手順でインスタンスを作成してください。注意するポイントは以下の2つです。
- “Basic Info”画面で、Planに”application”もしくは”broker”を選ぶ
- “Parameters”画面では何も入力せず”Next”をクリックする
以上で、バッキングサービスのセットアップは完了です。
3. デモ① – APIコール
APIをコールするジョブを実際に作成して、動かしてみます。まずはAPIを公開する簡単なアプリケーションをCloud Foundryにデプロイし、SAP Job Scheduling serviceからジョブを実行します。
3-1. 実行対象となるアプリケーションのデプロイ
呼び出すとテキストが返ってくるだけのエンドポイントを持つ簡単なアプリケーションをNode.jsを用いて実装します。
プロジェクトの作成
まずは、お好みのフォルダに下記の構成となるようにファイルおよびフォルダを作成してください。(下記の例では”TMP”というフォルダにプロジェクトを作成しています。)
作成したファイルに中身を記述していきます。
manifest.yml
プロジェクトフォルダ(simpleApp)直下にあるファイルで、デプロイのために設定を記述します。下記の内容をファイルにコピーしてください。
---
applications:
- name: simpleApp
path: app
memory: 128M
buildpacks:
- nodejs_buildpack
services:
- xsuaa_sample
- job_scheduling_service_sample
ここで重要なポイントは”services”以下に記述されている、このアプリケーションがバインドする2つのサービスです。まず、サービス名は”2-2. バッキングサービスのセットアップ”で作成した際のインスタンス名に置き換えてください。
そして、バインドする順番がXSUAA -> SAP Job Scheduling serviceとなるように、上記のmanifest.ymlの例のように記述してください。これは冒頭でも述べたSAP Job Scheduling serviceとXSUAAの関係性によるもので、先にXSUAAをバインドしておかないと、SAP Job Scheduling serviceはXSUAAを参照できず、デプロイ時にエラーになります。
server.js
appフォルダにあるファイルで、アプリケーションのロジックを記述します。下記の内容をファイルにコピーしてください。
const express = require('express');
const app = express();
app.get('/runElegantJob', function (req, res) {
console.log('==> [APP JOB LOG] Elegant job is running . . .');
res.send('Finished elegant job');
});
const port = process.env.PORT || 3000;
app.listen(port, function () {
console.log('listening');
})
ポート3000で開かれた”/runElegantJob”というエンドポイントに対し、GETリクエストを受け付けてメッセージを返すだけのシンプルなアプリケーションです。
package.json
appフォルダにあるファイルで、依存するモジュールとアプリケーション起動時に最初に実行されるJavaScriptファイルを指定します。下記の内容をファイルにコピーしてください。
{
"main": "server.js",
"dependencies": {
"express": "^4.17.1"
}
}
起動するJavaScriptファイルを上記で作成した”server.js”に指定し、server.jsで利用しているexpressモジュールを依存モジュールとして指定しています。
デプロイ
まず、ターミナルからpackage.jsonで指定したモジュールをローカルインストールします。appフォルダに移動し、下記コマンドを実行してください。
% cd /XXXXX/simpleApp/app
% npm install
コマンドを実行するとモジュールがインストールされ、画像のようなフォルダ構成になります。
モジュールのインストールが完了したら、Cloud Foundryにアプリケーションをデプロイします。プロジェクトフォルダ(simpleApp)に移動し、下記コマンドを実行してください。
% cd ..
% cf push
“cf push”の結果、画像のようにアプリケーションの情報が表示されればデプロイは完了となります。
結果の中で、”routes”と書かれている部分はこのアプリケーションにアクセスするためのURLです。ジョブ作成時に利用するので、どこかに記録しておくか、このターミナルを閉じずに次に進んでください。
3-2. SAP Job Scheduling serviceでのジョブの作成
3-1.でデプロイしたアプリケーションのエンドポイントにアクセスするジョブを作成します。
ダッシュボードへのアクセス
SAP BTP cockpitからSAP Job Scheduling serviceインスタンスのダッシュボードにアクセスしてください。
ログインすると、SAP Job Scheduling serviceのダッシュボードが表示されます。
ジョブの作成
まずは「何を実行するか」を定義するジョブを作成します。左のカラムから”Jobs”をクリックし、遷移したジョブ管理画面から”Create Job”をクリックしてください。
ジョブ作成画面にて下記のように入力し、”Save”をクリックしてください。
- Name
- お好みの名前
- Target Application
- プルダウンから作成したアプリケーションを選択
- ※プルダウンにはこのSAP Job Scheduling serviceインスタンスをバインドしたアプリケーションが表示されます。
- Action
- https://<アプリケーションのURL>/runElegantJob
- ※アプリケーションのURLは”cf push”した際の”routes”に記載されています。
- HTTP Method
- GET
ジョブが作成されました。ジョブをクリックすると、詳細画面に遷移します。
スケジュールの作成
ジョブを作成して「何を実行するか」を定義したら、残すはスケジュールを作成して「いつ実行するか」を定義するだけです。ジョブ詳細画面の左のカラムから”Schedules”をクリックし、遷移したスケジュール管理画面から”Create Schedule”をクリックしてください。
スケジュール作成画面にて下記のように入力し、”save”をクリックしてください。
- Pattern
- “One Time”
- Value
- “10 seconds from now”
※Valueには「いつ実行するか」を定義しますが、上記のような自然言語ベース以外にもいくつかフォーマットがあり、お好きなフォーマットで記述いただけます。下記の記載例をご参照ください。また、詳しくはこちらをご参照ください。
- 自然言語ベース
- 10 hours from now
- 20 minutes from now
- tomorrow at 4pm
- next week monday at 5am
- 9pm tonight
- 3.30pm
- ISO 8601ベース
- 1994-11-05T08:15:30-05:00
- 2021-12-18T23:59:59+09:00
- RFC 2822ベース
- 05 Nov 1994 08:15:30 -0500
- 18 Dec 2021 23:59:59 +0900
これで「作成10秒後に1回だけ実行される」スケジュールが作成されます。10秒待ってみましょう。
実行結果の確認
10秒待ってから画面をリロードすると、作成したスケジュールのステータスが緑色の”ACTIVE”から赤色の”INACTIVE”に変わっていることが確認できます。これは成功失敗に関わらず、「作成10秒後に1回だけ実行される」というスケジュールに従ってジョブの実行が完了したことを示します。
※定期的なスケジュールの場合は、繰り返し期間中はステータスは”Active”のままです。
では、ジョブが成功したのかどうかを確認しましょう。スケジュールをクリックして遷移するスケジュール詳細画面から、”Run Logs”をクリックしてください。
ここから実行ログを確認できます。ステータスが”COMPLETED/SUCCESS”となっているので、直感的にジョブが成功したことがわかります。ちなみに、このステータスは「HTTPレスポンスコードが200番台だったかどうか」で成功/失敗を判定しています。
右にあるメガネマークをクリックすると、より詳細なログが確認できます。簡単なアプリケーションなので行数が少ないですが、下記のような実行の流れが確認できます。
- スケジュールが作成される
- 10秒後にジョブが実行される
- アプリケーションから応答を得る
参考:定期的なスケジュールの作成
ここまでで、「作成後に1回だけ実行されるスケジュール」を定義するやり方をご紹介しましたが、もちろん定期的に実行するスケジュールも作成可能です。スケジュール作成画面の”Pattern”にて選択でき、入力フォーマットごとに以下の3種類があります。
- Recurring – Cron
- 定期スケジュールをcronフォーマットで定義するパターン
- “Value”には下記のようなcronフォーマットで日時を入力してください
- 2021 12 18 * * 50 *:2021年12月18日に毎時50分にジョブを実行
- * * * mon 23 0 0:毎週金曜日23時にジョブを実行
- * * * * * */10 *:10分おきにジョブを実行
- Recurring – Repeat At
- 定期スケジュールを定刻に実行するように定義するパターン
- “Value”には下記のように時刻を入力してください
- 3:30pm
- 18:40
- Recurring – Repeat Interval
- 定期スケジュールをインターバルで定義するパターン
- “Value”には下記のようにインターバルの期間を入力してください
- 10 hours
- 2 days
また、定期実行スケジュールの有効期間を”Start Time”と”End Time”で設定することもできます。
4. デモ② – Cloud Foundryタスク
4-1. 実行対象となるCloud Foundryタスクのデプロイ
標準出力にメッセージを出力するだけの簡単なCloud Foundryタスク(CFタスク)をNode.jsを用いて実装します。
プロジェクトの作成
まずは、お好みのフォルダに下記の構成となるようにファイルおよびフォルダを作成してください。(下記の例では”TMP”という、3-1.でも利用したフォルダにプロジェクトを作成しています。)
作成したファイルに中身を記述していきます。
manifest.yml
下記の内容をファイルにコピーしてください。
---
applications:
- name: simpleTask
path: app
memory: 128M
buildpacks:
- nodejs_buildpack
services:
- xsuaa_sample
- job_scheduling_service_sample
名前以外は3-1.でデプロイしたアプリケーションと同じです。
task.js
下記の内容をファイルにコピーしてください。
console.log('==> [TASK JOB LOG] Elegant job has been executed.');
標準出力にテキストを出力するだけのタスクなので、非常にシンプルです。
package.json
下記の内容をファイルにコピーしてください。
{
"scripts": {
"start": "node task.js"
}
}
依存するモジュールもないので、起動スクリプトを記述するだけです。
デプロイ
appフォルダに移動し、下記コマンドを実行してください。
% cd /XXXXX/simpleTask/app
% npm install
コマンドを実行するとモジュールがインストールされるので、プロジェクトフォルダ(simpleApp)に移動し、下記コマンドを実行してください。
% cd ..
% cf push --task
CFタスクをデプロイする際は”–task”オプションを付けることに注意してください。エラーが表示されなければデプロイは完了となります。
4-2. SAP Job Scheduling serviceでのジョブの作成
上記でデプロイしたCFタスクを実行するジョブを作成します。やり方は3-2.とほとんど変わりません。まずはダッシュボードにアクセスしてください。
タスクの作成
CFタスクを実行するジョブは、SAP Job Scheduling service上では”タスク”と表現されます。
ダッシュボードにアクセスしたら、左のカラムから”Tasks”をクリックし、タスク管理画面から”Create Task”をクリックしてください。
タスク作成画面にて下記のように入力し、”Save”をクリックしてください。
- Name
- お好みの名前
- Application
- プルダウンから作成したアプリケーション(CFタスク)を選択
- ※プルダウンにはこのSAP Job Scheduling serviceインスタンスをバインドしたアプリケーションが表示されます。
- Action
- npm start
タスクが作成されました。
スケジュールの作成〜実行結果の確認
ここから先の手順は先ほどと全く変わりません。スケジュールを作成して、タスクが実行されたらログを見てみましょう。
ログから、タスクが正常に実行できたことを確認できます。
おわりに
本ブログではSAP Business Technology Platformが提供するバッキングサービスの1つである、SAP Job Scheduling serviceの機能をご紹介し、アプリケーションのエンドポイントにアクセスする”ジョブ”と、Cloud Foundryタスクを実行する”タスク”の作成方法をご紹介しました。
ご質問やご不明点がございましたら、ぜひこちらからQ&Aをご投稿ください。
参考リンク
- Using Job Scheduler in SAP Cloud Platform [1]: First simple scenario
- 本ブログの執筆においては、こちらのブログポストの内容を参照しております。Part2以降ではOAuthによる認証認可やApp Routerを利用したケースの紹介もしているので、興味のある方はぜひご覧になってください。
- cf CLIインストール手順
- cf CLIのインストール方法をご参照いただけます。
- SAP Business Application Studio概要
- SAP Business Application Studioの利用方法をご参照いただけます。
- cf CLIを使用したSAP Cloud Platformへの接続
- cf CLIでのSAP BTPへのログイン方法をご参照いただけます。
- Add a Service or Entitlement in SAP BTP Trial Account
- バッキングサービスを利用するために必要なEntitlementの設定方法をご参照いただけます。英語で記載されていますが、キャプチャベースのStep-by-Stepで紹介されています。
- Schedule Formats
- スケジュールに設定できる日時フォーマットをご確認いただけます。
- SAP Community
- SAP BTPのコミュニティページにアクセスいただけます。