SAP Integration Suite を bashで触ってみよう

# はじめに
この記事は [SAP Advent Calendar 2021](https://adventar.org/calendars/6252) の12月17日分の記事として執筆しています。

皆様、SAP Integration Suite で遊んでおられますでしょうか。
実行したのは良いけども、Web から 実行結果のステータスを確認するのが面倒くさいとお嘆きの貴方のため
今回は日本全国で1億人を超える方々が大好きな bash を使って、SAP Integration Suite を触りたいと思います。
また、以前投稿した[SAP Integration Suite でかんたんな WebAPI を作ってみた
](https://qiita.com/pe_no_hito/items/10bcc5be38190f25b2f7) の続き記事となります。

## 必要なもの
今回の bash では、以下２つを使用します。
事前のインストールをお願いします。

- curl
- jq

また 以下の環境で作成しています。

```
MacBook-Pro:git hiroakiueda$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.
```

## 事前準備
まずは対象の SAP Integration Suite を準備してください。
準備の仕方は、[コチラ](https://qiita.com/pe_no_hito/items/10bcc5be38190f25b2f7)をご覧ください。
参照： [SAP Integration Suite でかんたんな WebAPI を作ってみた
](https://qiita.com/pe_no_hito/items/10bcc5be38190f25b2f7)

SAP Integration Suite で WebAPI の作成と実行は出来ましたね？
ここからは、前回記事で実行したWebAPI の実行ステータスを bash から確認しましょう。 

## 使用するAPI の紹介
では、実行ステータスを確認するためのAPI を紹介します。

今回は、`Message Processing Logs` を使用したいと思います。
API の 詳細は SAP API Business Hub をご参照ください。


https://api.sap.com/api/MessageProcessingLogs/overview


## ServiceKey の発行
SAP API Business Hub にて提供されているAPI 呼び出しに必要な認証情報を準備していきます。
以前と同じく、 Process Integration Runtime を作成するのですが、 SAP API Business Hub のAPIを呼ぶためには
インスタンス作成時の 指定Plan の設定が異なることを注意してください。

![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303235/b7fa52a2-3304-a33a-7f20-46b3c5bb9f18.png)
![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303235/be6a1f1f-e4cd-2135-5f6f-796e8e782aba.png)
![img3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303235/640822cc-466f-4326-2e50-b7bb61c6358a.png)
![img4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303235/b7fdf58b-827a-58b1-80a1-388d6c084f8c.png)
![img5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303235/40a6d4c5-3c79-3cfb-52f0-49abe68152d0.png)
![img6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303235/45e2c11d-73bd-b108-ce67-be4f9df139a4.png)
作成した ServiceKey の情報を確認します。
赤枠で囲った箇所は、後ほど使用します。
![img7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303235/c59d6018-e3f7-110e-9762-a86034975439.png)



## Bash の作成

それではAPI の呼び出しに必要な ServiceKey とURL が揃ったので、　Bash のスクリプト作成に入ります。

```bash
#!/bin/bash

# config
cpi_token_url='<ここに ServiceKey の tokenurl>?grant_type=client_credentials'
cpi_client_id='<ここに ServiceKey の clientid>'
cpi_client_sec='<ここに ServiceKey の clientseqret>'

# get access token
res_acctoken=$(curl -X POST $cpi_token_url \
    -d "client_id=${cpi_client_id}&client_secret=${cpi_client_sec}"
)

if echo $res_acctoken | grep -q 'access_token'; then
    cpi_oauth_token=$(echo $res_acctoken | jq -j '.access_token')
else
    echo $res_acctoken | jq -r '.error + " error:\n" + .error_description'
    exit 1
fi

# call MessageProcessingLogs
logurl='<ここに ServiceKey の url>/api/v1/MessageProcessingLogs?$format=json'

res_log=$(curl --location --request GET $logurl \
    --header "Authorization: Bearer $cpi_oauth_token" 
)
echo $res_log | jq .

```

### bashの詳細
#### Access Token 取得
API は OAuth2 の認可制御化で呼び出しが可能です。
認可制御のためには、 Access Token の取得が必要です。
Access Token を使用することで、認可された API の実行が出来るようになります。


```bash
# get access token
res_acctoken=$(curl -X POST $cpi_token_url \
    -d "client_id=${cpi_client_id}&client_secret=${cpi_client_sec}"
)
```

ここでは、SAP BTP Cockpit で作成した情報を用いて、Access Token をサーバから取得しています。

### Access Token の取り出し
Access Token の取得通信は、Json 形式でAccess Token を受け取るので、jq を使用して切り出します。

```bash
if echo $res_acctoken | grep -q 'access_token'; then
    cpi_oauth_token=$(echo $res_acctoken | jq -j '.access_token')
else
    echo $res_acctoken | jq -r '.error + " error:\n" + .error_description'
    exit 1
fi
```


### API の呼び出し
先程取得してきた Access Token を使用して、本命のAPI を呼び出します。
SAP API Business Hub を利用した API 呼び出しでは、Bearer認証で Token を渡します。

```bash
# call MessageProcessingLogs
logurl='<ここに ServiceKey の url>/api/v1/MessageProcessingLogs?$format=json'

res_log=$(curl --location --request GET $logurl \
    --header "Authorization: Bearer $cpi_oauth_token" 
)
```
APIは、SAP API Business Hub を見ていただけばわかるのですが、OData でのリクエストが可能です。
諸条件を指定する場合は、URLEncode済 の文字列を logurl へ指定する必要があります。

## 最後に
今回は実行ログを取得する仕組みを紹介いたしました。
今後の拡張として 取得結果を slack などのツールへ投稿する等のな使い方が出来ます。
皆様の次の構想を広げるお手伝いが出来ればと思います。