dbtジョブをAPIで呼び出す方法（実行から結果確認まで）

# はじめに
dbt Cloudで作成したジョブをAPIで呼び出し、結果を確認する方法です。

## 準備するもの
・**ジョブ**
　→既に作成されていることを前提に進めます。
 　ジョブの作り方については[こちらの記事](https://qiita.com/Himeka_Kawaguchi/items/d7c144f3bbcd7a75a979)を参考にしてください！
  
https://qiita.com/Himeka_Kawaguchi/items/d7c144f3bbcd7a75a979
    
・**パーソナルアクセストークン**
　→作成から入るので今の段階で準備していなくて大丈夫です。
・**PostmanやHULFT SquareなどAPIを呼び出すツール**
　→今回はPostmanを使用します。

# 1.dbtでパーソナルアクセストークンを作成

画面左下の名前をクリック＞「Your Profile」＞「API Tokens」＞「Personal access tokens」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/fb2ce1dd-ff80-2b39-e00c-54d45455126c.png)

API呼び出しに必要です。大切に保管してください。

# 2.API実行に必要な情報を集める
APIによって様々ですがジョブに関する基本的な情報は「</> API trigger」から確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/b7f7155f-6ef8-c776-f4d8-74be9e31ce3d.png)

# 3.ジョブを実行する
### Trigger Job Run

```
/api/v2/accounts/{account_id}/jobs/{job_id}/run/
```

https://docs.getdbt.com/dbt-cloud/api-v2#/operations/Trigger%20Job%20Run

:::note warn
注意点
　・URL ```https://cloud.getdbt.com``` は個人のdbt CloudのURLに変更
　・``{id}``はジョブIDを選択
　・ヘダーには「"Authorization": "Token <your-api-key>" 」で認証
　・ボディには「"cause": "Triggered via API"」
:::
実行した結果 ▼

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/30cba145-ed38-00aa-f628-383a693c8cb2.png)


### ジョブが起動したことをdbt上でも確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/5dff068e-4c6c-0c83-3d35-d91a107f38cf.png)


# 4.ジョブの結果を確認する
### Retrieve Run

```
/api/v2/accounts/{account_id}/runs/{id}/?include_related='run_steps'
```

https://docs.getdbt.com/dbt-cloud/api-v2#/operations/Retrieve%20Run

:::note warn
**注意点**
　・URL ```https://cloud.getdbt.com``` は個人のdbt CloudのURLに変更
　・``{id}``にはジョブの実行IDを選択
　・パラメータにはinclude_relatedに'run_steps'を指定
　・GET
　・ヘダーには「"Authorization": "Token <your-api-key>" 」で認証
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/af95cbf2-ad69-0bf8-d8e9-cccafa061bf0.png)


### include_relatedに'run_steps'
このパラメータを指定することでジョブの成功/失敗だけでなくエラーの内容まで確認できるようになります。

### 実行結果
status=10でありジョブが成功している事が分かります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/ec31e369-1b65-b036-411a-c377e8b19912.png)

:::note
**ステータスコードについて**
Starting = 1
Running = 3
Success = 10
Error = 20
Canceled = 30
Skipped = 40
[参考]（https://docs.getdbt.com/reference/commands/run）
:::

### ジョブが成功していることをdbt上でも確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/e40848f8-d448-56c9-9a40-b8e3d27a955b.png)

## 5.エラーメッセージの確認方法
ジョブが失敗した場合のエラーエラーメッセージを確認する方法です。

### Retrieve Runの結果を確認してジョブが失敗していることを確認

・data配下のstatus=20でジョブ自体がエラーになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/d321469d-66c3-1630-6cc8-324a06c64071.png)


dbt画面でエラーを確認する場合は以下のようにSnowflakeのGUIと同じエラーメッセージが確認できます。

参考
・dbt画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/e8cf15ec-a077-0270-e92b-be1255de13da.png)
・Snowflake画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/25259d55-255e-f70a-35af-9bc42fca38bc.png)

### include_relatedに指定した'run_steps'の内容を確認する
ジョブではいくつかのステップごとに処理が走ります。
dbt画面からみるとステップが理解しやすく、以下の場合は4つ目のステップでエラーになっていることが分かります。（1~3目のステップはdefaultです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/b3bf126b-30e5-1fb3-c3c9-486132155f8b.png)

### APIのレスポンスに戻って確認
run_stepはステップごとにindexが振り分けられています。ステップごとにステータスコードがあるので、どのステップでエラーになったのかが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/d8af3d20-1d37-e9f0-3676-4f5bc2b53776.png)

4つ目のステップであった「dbt build --select +customers.sql」はindex=4になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/47864ff3-6d10-6c0f-2d47-9dae9228ada8.png)

力技にはなりますが、APIレスポンスのうち「data」＞「run_steps」＞「index:4」の「truncated_debug_logs"」を見ればエラーメッセージが確認できました。

## 最後に
dbtジョブをAPIで呼び出すユースケースは多いかと思います。
エラーメッセージの取得方法についてもっとスマートな方法があれば教えて下さい。
HULFT Squareを使ってジョブを実行する方法も試してみたので記事にしようと思います。
参考になれば嬉しいです。