Watson StudioのPipelineをJOBとして登録し、スケジュール実行とAPIから呼び出しを行う

# はじめに
この記事はIBM Watson Studio 内のベータ版機能Pipelineで作成したフローをJobとして登録し、スケジュール実行と実行環境からのAPI呼び出し2種類の方法で動かす方法をご紹介します。

***

## 前提
* IBM Watson StudioのPipelineによって実行可能なパイプラインフローを構築済みであること
    * パイプラインフローの構築手順については[こちら](https://qiita.com/tsota/private/46b5e46bc65b01271556)の記事をご参照ください。
* （実行環境からのAPI呼び出しを実行する場合）ローカルPCにてnotebookを実行できること

***

#1. Jobをスケジュール実行
1つ目の実行手段として、Jobのスケジュール実行手順をご紹介いたします。

***

##スケジュール付きJobの登録
1. パイプラインが完成したら、キャンバス左上の「実行」から「ジョブの作成」を選択します。
![スクリーンショット 2021-11-11 17.24.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/3b36bf5e-59dc-7d89-3226-25a1c56e9f8c.png)


2. 「詳細の定義」、「API鍵」を任意の設定で入力し「スケジュール」まで進みます。
3. 「スケジュール」にて「実行をスケジュール」を押下し、作成するJobのスケジュール設定を行います。
スケジュール設定では「開始」にてスケジュールの開始日時を、「繰り返し」にてスケジュールの実行間隔、除外日および終了日時を設定可能です。
設定が完了したら「次へ」を押下します。
![スクリーンショット 2021-11-11 13.35.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/e32c430e-c628-03b7-f7f7-76d7a5c76e92.png)
4. 「レビューして作成」まで進んだら、作成したスケジュール設定の内容を確認し「作成」を押下します。

***

##結果確認
プロジェクトのメイン画面から「ジョブ」タブを押下し、ジョブ一覧から作成したジョブを選択します。
ジョブの詳細画面からスケジュールの実行履歴を確認することができます。
![スクリーンショット 2021-11-11 17.21.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/a74a6903-2d9f-3f92-b898-175d707e242b.png)

***

#2. JobをAPI実行
2つ目の実行手段として、JobをAPI呼び出しにて実行する手順をご紹介します。
今回は実行環境としてローカルのJupyter notebookを想定しております。

***

##Jobの作成
1. スケジュール実行時と同じく、キャンバス左上の「実行」から「ジョブの作成」を選択します。
2. 今度はスケジュールの設定を行わずに、任意の設定でJobの作成を完了させます。

***

## 認証
### APIの設定
IBM Cloudダッシュボード画面からIBM Cloud APIの作成をします。（APIキーを既に作成しており、値がわかっている場合はAPIキーの新規作成は不要です。）

1. IBM Cloudダッシュボート右上の「管理」から「アクセス（IAM）」を選択し、左側メニューより「APIキー」を開きます。APIキー一覧画面の上の「IBM Cloud APIキーの作成」を押下します。

![スクリーンショット 2021-11-28 13.39.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/d2e0c869-cccd-d2e3-0a26-a8a1e6a1bfca.png)

2.適当なAPIキーの管理名を入力し、「作成」ボタンを押下します。
3.APIキーが新規に作成されたら、「コピー」または「ダウンロード」からAPIキーを保存します。

![スクリーンショット 2021-11-28 13.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/3cab1509-eb16-7a1c-84d9-ae980628ff26.png)

IBM Cloud APIキーが作成できたらnotebookにAPIキーを格納します。

```python:notebook
# APIKeyの設定
apikey = "<APIキー>"
```

### トークンの取得
先ほど取得したAPIキーを使用しaccessTokenを取得、格納します。

```python:notebook
import requests

# トークンの取得
def get_token(apikey):
    url = "https://iam.ng.bluemix.net/identity/token" 
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    data    = "apikey=" + apikey + "&grant_type=urn:ibm:params:oauth:grant-type:apikey"
    token = requests.post(url, headers=headers, data=data).json()['access_token']
    return token

token = get_token(apikey)
```

***

##プロジェクト一覧を取得
以降はWatson Data APIを使用して操作をしていきます。
まず、Pipelineから作成したjobを配置しているプロジェクトのIDを調べるために一覧を表示させます。
使用APIは[GET /v2/projects](https://cloud.ibm.com/apidocs/watson-data-api-cpd#projects-list)です。

```python:notebook
# 共通URLの設定
url = 'https://api.dataplatform.cloud.ibm.com'

# 共通ヘッダーの設定
headers = {
    'Authorization': 'Bearer ' + token,
    'Content-Type': 'application/json'
}

# プロジェクト一覧の出力
response_projects = requests.get(url+"/v2/projects", headers=headers, verify=False).json()
response_projects
# -output-
# {'total_results': 8,
#  'resources': [{'metadata': {'guid': '<プロジェクトID>',
#     'url': '/v2/projects/<プロジェクトID>',
#     'created_at': '2020-05-12T08:04:30.419Z',
#     'updated_at': '2020-05-12T08:10:01.773Z'},
#    'entity': {'name': 'projectName',

```

出力された一覧から目的のプロジェクトのIDを確認します(該当プロジェクトmetadataキー内の'guid'の値がプロジェクトIDになります)。

***

##Job一覧を取得
前ステップで取得したプロジェクトIDを格納し、Job一覧を表示させます。
使用APIは[GET /v2/jobs](https://cloud.ibm.com/apidocs/watson-data-api-cpd#jobs-list)です。

```python:notebook
# 対象projectIDの格納
project_id = "<プロジェクトID>"

# 対象project内のjob一覧
response_jobs = requests.get(url+"/v2/jobs?project_id="+project_id, headers=headers, verify=False).json()
response_jobs
# -output-
# {'total_rows': 4,
#  'results': [{'metadata': {'name': 'jobName',
#     'description': 'It's test job',
#     'asset_id': '<job ID>',
```
目的のJobの'asset_id'が目的のJob IDとなります。

***

##Jobを実行
前ステップで取得したJob IDを格納し、Jobを実行します。
また作成したフローにパイプラインパラメーターを設定している場合は、実行の前にJob実行時のパイプラインパラメーターの設定を行います。
使用APIは[POST /v2/jobs/{job_id}/runs](https://cloud.ibm.com/apidocs/watson-data-api-cpd#job-runs-create)です。

```python:notebook
# Job IDの格納
job_id='<Job ID>'

# 実行時のパイプラインパラメーター
jobrunpost = {
      "job_run": {
          "configuration" : {
              'parameter_set': {'parameters': [
                        {'name': 'deployment_name',
                         'value': 'deployment1'
                        }
              ]},
          }
      }
}

# jobの実行
response = requests.post(url+"/v2/jobs/"+job_id+"/runs?project_id="+project_id, headers=headers, json=jobrunpost, verify=False).json()
job_run_id = response['metadata']['asset_id']
job_run_id
# -output-
# 'e0cfc2fd-cf5a-4679-85a2-38855fdc67cb'
```

実行が成功した場合、Jobの実行IDが出力されます。

***

##Job実行ステータスを確認
出力されたJobの実行IDからJobの実行ステータスを確認することが可能です。
使用APIは[GET /v2/jobs/{job_id}/runs/{run_id}](https://cloud.ibm.com/apidocs/watson-data-api-cpd#job-runs-get)です。

```python:notebook
job_run_id = "<Jobの実行ID>"
# Job run status
response = requests.get(url+"/v2/jobs/"+job_id+"/runs/"+job_run_id+"?project_id="+project_id, headers=headers, verify=False).json()

response['entity']['job_run']['state']
# -output-
# 'Completed'
```

***

##結果確認
プロジェクトのメイン画面から「ジョブ」タブを押下し、ジョブ一覧から作成したジョブを選択します。
ジョブの詳細画面からスケジュールの実行履歴を確認することができます。
![スクリーンショット 2021-11-28 12.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/6a09b9c1-eb12-c006-9dc4-87711cca155a.png)

***

# さいごに
こちらの記事作成に際し、以下の記事を参考にさせていただきました。ありがとうございました。
[Cloud Pak for Dataの分析プロジェクトのJobを環境変数付きでAPI実行する](https://qiita.com/ttsuzuku/items/3a2267f90c9c184cf07a#job%E3%82%92api%E3%81%A7%E5%AE%9F%E8%A1%8C)