ASTERIA WarpからリモートのSQL ServerにHTTP経由でアクセス

ASTERIA WarpはJDBCドライバを利用して様々なデータベースにアクセスできます。もちろんSQL Serverへの接続も可能です。ただし、それは通常TDSプロトコル経由での接続を前提としており、接続対象のSQL Server環境はTCP1433番ポートを開けておく必要があります。

しかしセキュリティなどの理由により、SQL Server環境が外部に対して1433番ポートは開けられないといったケースがあります。この場合はTDSによる接続方法でSQL Server環境にアクセスできません。

そこで、今回はASTERIA Warpから**HTTP経由**でSQL Serverにアクセスする方法を試してみました。

HTTP経由でのアクセスは、SQL ServerのテーブルのAPI化により実現できます。今回はCData API ServerというツールでSQL ServerをAPI化し、ASTERIA WarpのRESTコンポーネントでアクセスします。

# シナリオ

今回実施したシナリオは以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/4428dc29-1b0b-713a-4585-facf0081aae7.png)


EC2上にSQL Serverが動いており、これにAPI Serverをインストールします。そしてSQL ServerのテーブルをAPI化し、外部からHTTPでアクセス可能にします。ASTERIA WarpからはRESTコンポーネントを利用してこのAPIにアクセスしてデータを取得します。

SQL Serverにはテストデータとして以下のproductsテーブルを用意しました。

**productsテーブル**

| id | code | name   |
| --- | --- | ------ |
| 1	| P001| Product 001| 
| 2	| P002| Product 002| 
| 3	| P003| Product 003| 

# SQL ServerのREST APIを作成

API化に利用したCData API Serverは様々なデータベースのREST APIをノーコードで作成できるツールです。今回は30日の無料評価版を利用します。

https://www.cdata.com/jp/apiserver/

API ServerでSQL ServerのAPIを作成する方法については[付録](#付録-api-serverの設定内容)に記載しましたのでご参考ください。
今回はAPI Serverで以下のAPIエンドポイントと認証ユーザを作成しました。

http://<サーバのアドレス>/api.rsc/SQLServer_Products 

ASTERIA Warpの環境からブラウザで上記エンドポイントにアクセスすると以下のようにSQL Serverのproductsテーブルの内容が取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/6ce9699f-d261-1a52-9bba-a0919b137df2.png)

# ASTERIA Warpの設定

それではASTERIA WarpのRESTコンポーネントでSQL Serverのデータを取得してみます。

## コネクションの作成

まず作成したAPIにアクセスするHTTPコネクションを作成します。コネクションの**[URL]**にはAPI Serverで作成したAPIのエンドポイントを指定します。また、**[ユーザ名]**にはAPI Serverでユーザを作成した際に指定したユーザ名を、**[パスワード]**にはAPI Serverで発行した認証トークンを指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/4b7d9003-1e8e-47af-c396-51b7a7c305c3.png)

## RESTコンポーネントの配置

RESTコンポーネントを配置し、コネクションとして先ほど作成したHTTPコネクションを指定します。配置したコンポーネントをダブルクリックするとテストダイアログが開き、ここで**[テストの実行]**をクリックすると受信テストが実行されます。実際にテストを実行すると以下のように正常なレスポンスが取得できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/e0f3a9ee-e30a-87da-0848-2d76a73f5897.png)

レスポンスボディはJSON形式で返されていますが、このデータをストリームに流すにはフィールドの定義が必要です。ここでRESTコンポーネントの「XMLフィールド定義のインポート」という超便利機能を利用します。**[XMLフィールド定義のインポート]**ボタンをクリックし、ストリームペインを見ると以下のようにフィールド定義が作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/1273b162-c117-578b-6b45-d263d9646fbd.png)


あとはRESTコンポーネントを通常のRDBコンポーネントのように扱うことができます。
今回は以下のように別のデータベース(MySQL)にデータを同期するフローを作成してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/c29b8e3f-955b-4b30-7289-89e1044c7ec7.png)

**Mapper**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/f3979bed-9f57-4b6c-fea7-2b5be8b115a2.png)


このフローを実行すると、ローカルのMySQLにSQL Serverのproductsテーブルの内容がコピーされていることを確認できました。

#付録 API Serverの設定内容

### 1. API Serverのインストールと評価版アクティベート

API Serverのインストーラをダウンロードし、SQL Serverにアクセス可能な環境にインストールします。今回はSQL Serverと同じ環境にインストールしました。インストールが完了したらAPI Serverの管理ページを開き、**[情報]**ページから評価版ライセンスをインストールしてください。

### 2. 接続の作成

SQL Serverへの接続を作成します。メニューの**[設定]**から**[接続]**タブを開き、**[接続の追加]**をクリックします。以下のようにSQL Serverへの接続設定画面が表示されますので、必要な情報を設定します。設定が完了したら**[接続のテスト]**をクリックして接続に成功するか確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/d950bc77-ffe7-6b09-814a-ccdd1a71a9a9.png)


### 3. リソースの作成

続いてAPIを作成します。メニューの**[設定]**から**[リソース]**タブを開き、**[リソースを追加]**をクリックしてウィザードを起動します。このウィザードでは接続、リソース名、API化するテーブルとカラムなどを設定します。はじめに接続として先ほど作成した接続を選択して**[次へ]**をクリックします。続いてAPI化するテーブル「products」を選択して**[次へ]**をクリックします。最後にリソース名と、公開する操作(HTTPメソッド)、カラムを選択し、**[保存]**をクリックします。リソース名はAPIのエンドポイントURLの一部となるので検討のうえ設定してください。今回はシンプルに「SQLServer_Products」としました。この場合エンドポイントは`http://xxxxxx/api.rsc/SQLServer_Products`となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/5806b727-5a55-6339-ec96-6a8bb54cb13c.png)


これでAPIの作成は完了です。

### 4. ユーザの作成

続いてAPIにアクセスするユーザを作成します。メニューの**[設定]**から**[ユーザー]**タブを開き、**[追加]**をクリックします。ユーザ名と権限を設定し、**[変更を保存]**をクリックします。ユーザが作成されると以下のように認証トークンが発行されます。ユーザと認証トークンは外部からアクセスする際のユーザ名／パスワードとなりますので控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/f843c2ff-ff51-e3d1-bd10-10640cf4820b.png)

これでAPIへのアクセス準備は完了です。

### 5. APIの確認

最後に作成したAPIの確認を行います。メニューの**[API]**を開き、**[リソース]**から作成したリソースをクリックします。GETに表示されているエンドポイントURLにアクセスし、SQL Serverのデータがレスポンスとして取得できることを確認してください。