HULFT Square で作成したサービスを Web APIとして公開して、外部サーバから HTTPリクエストで実行してみた

## はじめに
こんにちは、すぎもんです:grinning:

<strong>Web API</strong>は、インターネットを介して使えるAPIで、Web上のAPIの受け口に対して外部から指定したURLにリクエスト（HTTPリクエスト）を送ることでAPIの機能を使う仕組みのことです。

:::note warn
DataSpiderのHTTPトリガー機能を使うと、疑似的にWeb APIを作ることもできましたが、HULFT Squareでは <strong>API Management</strong>という機能の中で、外部アプリケーションから作成したサービスを実行することができます。
:::

APIは、システムやプログラム間のシームレスな連携といった観点から、企業での利用も増えていますが、それと同時に、APIの利用状況を把握したり、誰に、どこからアクセスさせるのかなど、セキュリティの観点からの管理も必要になってきます。

そこで、今回は、誰にアクセスさせてよいか、どこからアクセスさせるかといったセキュリティ部分にも触れながら HULFT Square で Webサービスを作成して、実際に外部からHTTPリクエストを実行してみたいと思います。

## HULFT SquareのAPI Managementとは

大きく言うと HULFT Square で作成したサービスをWeb APIとして公開するのに必要な構成要素の総称で、これらを設定することで外部からのリクエストを受ける口が作成され、HULFT Square のサービスを外部から実行することができるようになります。

##### ■HULFT SquareのAPI Managementを構成する3つの要素
<strong>①APIプロジェクト</strong>
　　・Web API のエンドポイントとなる基本パスの作成　
　　・リクエストにより実行するサービスの紐づけ　
　　・リクエストパラメータ設定　
　　・レスポンス設定

<strong>②APIクライアント</strong>
　　作成した API に対し、誰にどこへアクセスさせてよいか、どこのサーバーからアクセスできるかといったセキュリティ部分を制御

<strong>③REST APIジョブ</strong>
　　①と②を紐付けて、実行環境の選択、アプリケーションで使用するエンドポイントの URL の発行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a9d69e73-1af3-0df0-e3cf-7e35a819f857.png)

APIプロジェクト、APIクライアント、REST APIジョブ、それぞれ役割が分かれていますが、分かれていることにより柔軟な使い方ができるようになっています。

:::note warn
例えば、同じセキュリティポリシー（APIクライアント）を他の Web API にも適用させたい場合、既存のAPIクライアントを流用することができます。
それぞれに役割を持たせることで、新たにAPIクライアントを作成することなく、セキュリティポリシー管理における煩雑化を防ぎます。
:::

## API ManagementとHULFT Squareで作成するサービスとの関係性
ここまで API Management の構成要素について説明しましたが、外部からのリクエストにより実行するサービスを含めて、少し整理します。

API Management とHULFT Squareで作成するサービスとの関係図は下記の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/abe629c9-b879-b913-5041-208861ccaeff.png)
HULFT Squareでは、様々なデータ処理（プログラムのようなもの）を１つのスクリプトとして作成し、サービスとして公開することができます。



このスクリプトをAPI Management機能を使ってWebAPIとして外部に公開してみます。機能詳細については[HULFT Squareマニュアル](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Home_Top.htm)をご参照ください。

## 今回やること
HULFT Square で作成したサービスを Web API として公開して、外部サーバから HTTPリクエストで実行してみたいと思います。

今回は、HTTPリクエストを元に特定のデータ処理を行ってHTTPレスポンスとして返すスクリプトを用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/46af2ecd-94b4-e0b8-81bc-775a93db6638.png)

## 設定の流れ
下記の手順で設定を進めます。

<strong>１）外部からのHTTPリクエストで実行するスクリプトの作成</strong>

<strong>２）APIプロジェクト作成</strong>
　　　・1）のスクリプトの紐づけ、
　　　・Web APIのエンドポイントとなる基本パスの作成
　　　・リクエストパラメータやレスポンス設定を行います。

<strong>３）APIクライアント作成</strong>
　　APIにアクセスできるユーザ、サーバのIPアドレスを設定します。

<strong>４）REST APIジョブ作成</strong>
　　APIプロジェクトとAPIクライアントを紐づけて、外部からのHTTPリクエストで使用するエンドポイントとなるURLを生成します。

<strong>５）アクセストークンの取得</strong>
　　APIクライアントでアクセスできるユーザを設定した場合には、HTTPリクエスト時にアクセストークンを使ってユーザ認証します。

<strong>６）外部サーバからHTTPリクエストの実行、確認</strong>
　　外部サーバからcurlによるHTTPリクエストを実施して、結果を確認します。

## 各設定項目の相関関係について
実際に設定を始める前に各設定項目の相関関係について、改めて整理してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/96c3fe89-ca3e-23fd-b5b5-1f76bbddbd73.png)
それでは、実際に設定していきます。

## １）外部からのHTTPリクエストで実行するスクリプトの作成

今回は、HULFT Square のストレージ上にあるCSVファイルを読み取って、スクリプト変数「json」を使って、JSON形式でデータを出力するスクリプトを作成します。

スクリプト作成時には、下記のようなノンコーディングの開発画面が表示されるので、画面右のツールパレットから対象となるアイコンをドラック＆ドロップで配置し、処理を作成します。下記の通り作成します。

　　　・プロジェクト名　：　`CSV_read`
　　　・スクリプト名　　：　`csv_read_script`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6aa9ac5c-bc74-6404-b40a-693f970023f6.png)
実際に読み取るCSVファイルには、9行のデータが入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/58e590fc-ab64-1a65-5aeb-4a9d11005c0d.png)

## ２）APIプロジェクト作成
１）で作成したプロジェクトを、Web APIとして公開するための設定として、APIプロジェクトでは、下記の項目を順に設定します。

　　①Web APIのエンドポイントとなる基本パス
　　②HTTPメソッドの種類
　　③HTTPリクエストで実行するスクリプト
　　④リクエスト設定　<font color= blue>※今回はGET実行のため省略。</font>
　　⑤レスポンス設定　　　　

##### ①Web APIのエンドポイントとなる基本パスの作成
HULFT Square管理画面の左側メニューの「メインメニュー ＞ APIマネジメント ＞ APIプロジェクト」からAPIプロジェクトを作成します。

　　　・名前　　　：　`TEST_API_CSV_READ`
　　　・基本パス　：　`test_api_csv_read`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/c628cf9e-21fc-82ba-5852-1a160d34bdd3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/74784841-4865-e47a-058e-497f51f94fdb.png)

##### ②HTTPメソッドの種類を設定
①で作成したAPIプロジェクトにリソースを作成してHTTPメソッドを設定します。
作成したAPIプロジェクトのリソースを選択します。（赤枠）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/68f2e7be-4b1d-63e5-8ce3-d0f54d961af3.png)
リソースに「HTTPメソッドを追加 > GET」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d6a84281-3305-11a9-91f6-0d30cd91e695.png)

##### ③HTTPリクエストで実行するスクリプトの設定
　＜実行スクリプト＞
　プロジェクト　：　`CSV_read`　　　　　※１）で作成したプロジェクト
　バージョン　　：　`※最新バージョン`　　
　スクリプト　　：　`csv_read_Script`　 ※１）で作成したスクリプト

##### ⑤レスポンスの設定
今回は、１）で作成したスクリプトでCSVのデータをJSON形式で出力する処理を作成した際に設定した変数 json を指定します。

　レスポンス本文：　`変数`　`JSON`　ー　`json`　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/741fa2cd-0943-6ca5-840d-22566faf1b69.png)
１）で作成したスクリプト変数「json」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/fe9d5931-821e-bd64-ff80-e8d0e090feee.png)
作成したプロジェクトを、Web APIとして公開するためのAPIプロジェクトの作成が完了しました。

:::note
APIプロジェクトの「新規追加」または「編集」の後、実行スクリプトのプロジェクトを更新すると、バージョンが更新されます。
APIプロジェクトで指定する実行スクリプトのプロジェクトも最新バージョンに変更することを忘れないようにしましょう。
:::

## ３）APIクライアント作成

ここでは、２）で作成したAPIにアクセスできる<strong>メンバー</strong>（※1）の設定や、<strong>IPアドレス許可リスト</strong>（※2）を設定します。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++
HULFT Squareでは、複数の環境（開発環境、テスト環境、本番環境など）ごとに異なるリソース（ファイルやデータベース、接続するクラウドサービスのアカウントなど）を紐づけることができます。また、これらのリソースごとに、アクセスできるユーザーを制限することができます。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
APIクライアントは、APIにアクセスできるユーザーを限定する設定なので、APIからアクセスできる環境（＝リソース）も限定する、といった形でセキュリティを確保する仕組みとなっています。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
　※1　<strong>メンバー</strong>
　　　　２）で作成したAPIジョブのAPIにアクセスできるユーザ
　※2　<strong>IPアドレス許可リスト</strong>
　　　　HTTP RESTリクエストを実行する外部サーバのIPアドレス
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

HULFT Square管理画面の左側メニューの「メインメニュー ＞ APIマネジメント ＞ APIクライアント」から APIクライアントを作成します。

今回は、実行するユーザに自分を設定し、IPアドレス許可リストにはHTTPリクエストを実行する外部サーバのIPアドレスを設定します。

　　　　　　　　　名前　：　`API_Client_test_SE`
　　　　　　　メンバー　：　`※自分のアカウント`
 　 IPアドレス許可リスト：　`HTTP RESTリクエストをする外部サーバのIPアドレス`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f30eba9e-b89b-985e-b9ed-6a11541e84ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/5bafc2ae-bcef-ce5c-87d4-7f023f2bdf97.png)

:::note
APIクライアントでメンバーを設定した場合は、HTTPリクエストを実行する際にアクセストークンが必要になります。アクセストークンの取得については、「５）アクセストークンの取得」で説明します。
:::

下記の通り、APIクライアントの設定が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ad4a18cb-9064-59f2-efb0-ecd02eb745c4.png)

## ４）REST APIジョブ作成
２）で設定したAPIプロジェクトを、外部からのHTTPリクエストで実行するREST APIジョブを作成します。

REST APIジョブでは、主に下記の項目を設定していきます。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
　①２）APIプロジェクトと３）APIクライアントの紐づけ
　②HTTPリクエストで使用するエンドポイントとなるURLの取得
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

##### ①２）APIプロジェクトと３）APIクライアントの紐づけ
HULFT Square管理画面の左側メニューの「メインメニュー ＞ ジョブ ＞ REST APIジョブ」からREST APIジョブを作成します。

　APIプロジェクト　：　`TEST_API_CSV_READ`
　APIプロジェクトバージョン　：　`※最新バージョン`　
　APIクライアント　：　`API_Client_test_SE`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/48d8cb5e-e962-b0a3-c0b1-a62890033da2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/021ebf39-a49a-52ca-95a1-6e65af2196a7.png)

:::note
APIジョブの「新規追加」または「編集」の後、APIクライアントを更新した場合、APIジョブと新しいAPIクライアントの紐づけをしなおす必要があります。この場合、ジョブを無効化をしてから再度ジョブを有効化をしてください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/dfd9c46f-cc91-b44f-e806-c74aff9af9ef.png)
設定内容を確認して、完了を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/72992104-07a7-9eff-f3c6-e0b60f7c8d65.png)
APIジョブの設定が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/bad0600b-f7e6-f042-b67d-582a21f4a148.png)
APIジョブの設定が完了すると、HTTPリクエストで使用するエンドポイントとなるURLが自動生成されます。

上記のREST APIジョブの一覧から、作成した「TEST_API_CSV_READ」の情報を表示して、URLを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/64766be4-9fc1-1dc3-2aaf-cfa7d2e15495.png)

:::note warn
URLは、「６）外部サーバからHTTPリクエストの実行、確認」で必要になるので、控えておきましょう。
:::

## ５）アクセストークンの取得
HTTPリクエスト時に必要な、アクセストークンの取得を行います。

:::note 
アクセストークンは、HTTPリクエストでWeb APIに接続するためのユーザ認証として必要な情報です。
:::

３）APIクライアント作成の「メンバー」で、Web APIへアクセスできるユーザを設定しましたので、メンバーに設定したユーザでアクセストークンの生成、取得が必要になります。

HULFT Square管理画面の右上にあるユーザ情報の「個人設定」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/412d239f-4dbc-9917-38a7-d870e8051a9b.png)
「個人設定＞アクセストークン」の「アクセストークン」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/5daaaaec-14c0-5777-9f97-9df7b298f775.png)
生成されたアクセストークンをcopyボタンから控えておきます。（赤枠）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/c03def96-dc20-6acd-9229-ef907e89605d.png)

:::note warn 
アクセストークンには、有効期限があります。継続的にHTTPリクエストを実行したい場合は、リフレッシュトークンによるアクセストークンの更新をしましょう。
:::

## ６）外部サーバからHTTPリクエストの実行、確認
外部サーバからHTTPリクエストを実行します。
今回は、curlで実行してみたいと思います。

＜実行コマンド＞

    curl -X GET --header "Authorization: Bearer <５）で取得したアクセストークン>" "４）で取得したGETメソッドのURL"

下記の通り、コマンドプロンプトからcurl実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6cc25645-c4cd-5199-9737-ca572a51ac9c.png)
１）で載せたCSV9行分のデータが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8c6ec388-c70a-faef-5aea-73758afd3cce.png)
（参考）スクリプト内で読み取ったCSVファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4fedf737-e25d-858f-b50f-5b83fd04083c.png)

実際にスクリプトが実行されているか、HULFT Square管理画面でも確認してみます。

HULFT Square管理画面の左側メニューの「モニタリング ＞ アプリケーション ＞ HULFT Integrate」を選択します。

今回、作成したプロジェクト「CSV_resd + スクリプト：csv_read_script」の実行履歴が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/fd98c16a-8627-0a77-da67-038401233e72.png)
上記から詳細を確認すると、１）で作成したcsv_resd_script のスクリプトが実行され、9行のデータが抽出できたことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/55201e49-7ea2-ed94-5a95-f36fd04326b7.png)

## 最後に
いかがでしたでしょうか。

今回は、HULFT Squareで作成したプロジェクトをWeb APIとして公開し、外部サーバからHTTPリクエストしてみました。

HULFT Squareには、APIプロジェクト、APIクライアント、REST APIジョブと３つの機能があるのでそれぞれの役割の整理が必要でしたが、整理した上で一つ一つ紐解いていき理解を深められたかと思います。

今回はCurlを使ってHULFT Square のストレージ上にあるCSVのデータを取得してみましたが、
　・リクエストに応じて、DBからデータを抽出してレスポンスを返したり
　・社内のWebシステムからデータを入手してレスポンスを返したり
と、様々な連携で活用できそうですね。

最後まで読んでいただき、ありがとうございました。それでは、また！