CData Software Blog

クラウド連携のCData Software の技術ブログです。

CData API Server デプロイ機能を使ったパッケージ作成&利用手順

(2021/01/27更新) 本記事でご紹介しております「deploy.rst」を用いてデプロイパッケージを作成する機能ですが現在は提供しておりません。デプロイ先環境で利用するパッケージは、デプロイ元と同じものをご利用いただく方法をご推奨しております。詳細の手順はCData Japanサポートデスクまでお問い合わせください。

はじめに

CData技術ディレクター桑島です。本記事では、API開発用のCData API Server(以下、APIServer)でAPI公開マシン用のデプロイパッケージを作成して、API利用者用のAPIServerを別に構築する手順をご紹介します。これによりAPIServerの管理機能をAPI利用者には非公開にして、かつ、APIの利用状況に応じてAPI公開用マシンを複数台にスケールアウトするような構成を組むことができる様になります。

f:id:kuwazzy:20200313132733p:plain

前提

本記事では、以下の構成で確認しています。

  • Web Server : Apache Tomcat Version 8.5.24
  • OS : MacOSで確認 ※LinuxWindowsでも手順は一緒です
  • DB : MySQL 5.4 ※API定義・ユーザ・ログ情報を格納するDB、および、API公開するデータを格納するDBの2つが必要です

手順

API開発用APIServerの構築

Tomcatのconf配下のServer.xmlを開き、配下にを以下の通り追加します。これにより、API開発用APIServerで設定したライセンス情報・API定義・ユーザ・ログデータがMySQLなどのデータベースに永続化して保管することができる様になります。

Server.xml

<?xml version="1.0" encoding="UTF-8"?>

〜(省略)〜

       <Context path="/apiserver">
          <Resource name="jdbc/APP_DB" auth="Container" type="javax.sql.DataSource"
                maxActive="100" maxIdle="30" maxWait="10000"
                driverClassName="cdata.jdbc.mysql.MySQLDriver"
                url="jdbc:cdata:mysql:User=xxxxx;Password=xxxxx;Database=xxxxx;Server=xxxxx;Port=3306;"/>
          <Resource name="jdbc/APP_USERS" auth="Container" type="javax.sql.DataSource"
                maxActive="100" maxIdle="30" maxWait="10000"
                driverClassName="cdata.jdbc.mysql.MySQLDriver"
                url="jdbc:cdata:mysql:User=xxxxx;Password=xxxxx;Database=xxxxx;Server=xxxxx;Port=3306;"/>
          <Resource name="jdbc/APP_LOGS" auth="Container" type="javax.sql.DataSource"
                maxActive="100" maxIdle="30" maxWait="10000"
                driverClassName="cdata.jdbc.mysql.MySQLDriver"
                url="jdbc:cdata:mysql:User=xxxxx;Password=xxxxx;Database=xxxxx;Server=xxxxx;Port=3306;"/>
        </Context>
                       
      </Host>
    </Engine>
  </Service>
</Server>

MySQLへの接続情報は環境にあわせた文字列をセットしてください。MySQLへの接続で必要なCData MySQL JDBC DriverはAPIServerにバンドルされています。

次に、同じパス配下のtomcat-users.xmlを開きます。ユーザに「cdata_admin」ロールを付与することでAPIServer管理コンソールへのログインユーザを作成することが出来ます。なお、passwordは環境にあわせた値をセットしてください。

tomcat-users.xml

<?xml version="1.0" encoding="UTF-8"?>

〜(省略)〜

<user name="admin" password="xxxxx" roles="cdata_admin,rssbus_admin,admin-gui,manager-gui,
manager-status,manager-script,manager-jmx" />
</tomcat-users>

下記のサイトからCross-Platform (Java Edition)版のAPIServerをダウンロードします。

www.cdata.com

ダウンロードファイルに含まれるapiserver.warファイルをwebappsフォルダ配下に配置してTomcatを起動します。本手順では、bin配下のstartup.shを直接起動しました。

Tomcatが起動したら管理コンソールにアクセスできるマシンから開きます。デフォルトではパッケージ名がapiserverなので「http(s)://{マシン名}:{ポート番号}/apiserver」でアクセス出来ます。下記のログイン画面が表示されたらtomcat-users.xmlで設定したusernameとpasswordをセットしてサインインしてください。

f:id:kuwazzy:20200313140954p:plain

ログインが成功するとステータス画面が開きます。まだライセンスのアクティベーションを行なっていませんのでライセンスを認証する旨のメッセージが表示されています。

f:id:kuwazzy:20200313141623p:plain

一旦、APIServerの管理コンソールを離れて、TomcatのServer.xmlで設定したMySQLのデータベース(本例では、apiserver)をMySQLWorkBenchなどで参照してみます。すると、「app_logs / app_request / app_scripts / app_settings / app_user_connections / app_users」というテーブルが作成されています(※作成されない場合は、Server.xmlなどの設定に問題があります)。

f:id:kuwazzy:20200313141805p:plain

これらのテーブルには、APIServerの管理コンソールで定義したAPI定義情報やAPIへのアクセスユーザー、アクセスログ、そしてライセンス情報が格納されます。以下ポンチ絵の赤枠の通信となります。

f:id:kuwazzy:20200313142147p:plain

API定義、および、アクセスユーザの定義

それでは、一度、APIServerの管理コンソールに戻り、APIServerのライセンスを認証します。情報 タブを開き、「新しいライセンスをインストール」をクリックします。

f:id:kuwazzy:20200313145658p:plain

ライセンス情報を登録するウィンドウが表示されるので必要事項を登録して保存して、以下画面の様にプロダクトキーがセットされたことを確認してください。このプロダクトキーはMySQLのAPP_DB内に保存されます。

f:id:kuwazzy:20200313145906p:plain

次にAPI公開データが格納されているMySQLへの接続情報を作成します。下のポンチ絵の赤枠の接続です。

f:id:kuwazzy:20200313150439p:plain

設定 > 接続 タブを開き、「+接続の追加」ボタンをクリックします。

f:id:kuwazzy:20200313150014p:plain

接続可能なDBの一覧が表示されるので今回はMySQLを選択します。

f:id:kuwazzy:20200313151044p:plain

MySQLへの接続情報をセットして接続のテストを実施し接続に成功したことを確認したら変更を保存します。

f:id:kuwazzy:20200313150735p:plain

次に設定 > リソース タブを開き、「リソースの追加」ボタンをクリックします。

f:id:kuwazzy:20200313151138p:plain

リソースの追加ウィザードが開くので、MySQL内のAPIとして公開したいテーブルを選択します。本例では、MySQLのサンプルDBであるsakilaデータエース内のactor, city, customerを選択しました。

f:id:kuwazzy:20200313152318p:plain

ウィザードが完了すると選択したテーブルがリソース一覧に表示されます。

f:id:kuwazzy:20200313152711p:plain

続いてAPIにアクセス可能なユーザを追加していきます。設定 > ユーザータブを開き「+追加」ボタンをクリックします。

f:id:kuwazzy:20200313152809p:plain

ユーザーを追加ウィザードが開きますので、ユーザ名と権限を付与します。本手順ではcdatauserというユーザに参照(GET)のみの権限を付与しました。変更を保存します。

f:id:kuwazzy:20200313152925p:plain

ユーザの一覧に追加したユーザの認証トークンが表示されます。この値は、APIアクセス時に使用するので控えておいてください。

f:id:kuwazzy:20200313153001p:plain

APIにアクセスするマシンを制限したい場合は、設定 > サーバ 内の信頼されたIPアドレスに追加してください。

f:id:kuwazzy:20200313153229p:plain

以上でAPIのエンドポイントの作成、および、アクセスするための準備が完了しました。

管理コンソールのマシンからのAPIリクエストの確認

それでは、まずは、管理コンソールを開いているマシンからAPIリクエストを発行してみたいと思います。APIタブを開きます。リソースに上記手順で追加したMySQLのテーブルが追加されていることを確認します。その中のひとつのエンドポイントを選択します。本手順ではactorを選択しました。右側にactorのAPIリファレンスが表示されます。api.rsc/actor/ のリンクをクリックします。

f:id:kuwazzy:20200313162931p:plain

actorテーブルのデータがJSONデータとなってレスポンスが返って来ることを確認します。管理コンソールにログインした状態だと認証は求められませんが、URL直リンクで開いた場合や別なツールからリクエストを発行する場合には、上記で取得したAPIアクセスのユーザ名と認証トークンをセットしてください。

f:id:kuwazzy:20200313163109p:plain

デプロイパッケージの作成

API開発用のAPIServerからAPI公開用マシン用のデプロイパッケージを作成します。

f:id:kuwazzy:20200313163803p:plain

こちらのURLよりdeploy.rst ファイルをダウンロードしてAPI開発用APIServer展開済みパッケージ(本例ではapiserver)直下に追加してください。

/usr/local/apache-tomcat-8.5.24/webapps/apiserver $ ll
total 88
drwxr-x---   4 user1  staff    128  3 13 14:05 META-INF
drwxr-x---   4 user1  staff    128  3 13 14:05 WEB-INF
drwxr-x---   9 user1  staff    288  3 13 14:05 admin
-rw-r-----   1 user1  staff    305 11  2 10:55 admin.rsc
drwxr-x---   2 user1  staff     64  3 13 14:05 api
-rw-r-----   1 user1  staff    288 12 10 14:16 api.rsc
drwxr-x---   4 user1  staff    128  3 13 14:05 app_data
-rw-r--r--@  1 user1  staff    523  2 25 16:02 deploy.rst  <--- 追加
-rw-r-----   1 user1  staff  17542 11  2 10:46 favicon.ico
drwxr-x---   3 user1  staff     96  3 13 14:05 help
drwxr-x---   2 user1  staff     64  3 13 14:05 includes
-rw-r-----   1 user1  staff     43 11  2 10:55 index.jsp
-rw-r-----   1 user1  staff    361 11  2 10:55 logout.jsp
drwxr-x---   2 user1  staff     64  3 13 14:05 pub
-rw-r-----   1 user1  staff    554 12 10 14:16 query.rsc
drwxr-x---   2 user1  staff     64  3 13 14:05 src
drwxr-x---  14 user1  staff    448  3 13 14:05 ui
/usr/local/apache-tomcat-8.5.24/webapps/apiserver $ 

管理コンソールから以下のURLでdeploy.rstを直リンクで開きます。

http(s)://{マシン名}:{ポート番号}/{パッケージ名}/deploy.rst

下記のDeployタブの画面が開くので、プラットフォームをJava、配布パスにファイルの書き込み権限があるパス(本例では、/Applications/CData/deploy/apiserver_deploy )、ユーザーデータベースにはMySQLを選択してTomcatのServer.xmlに追加した管理用のMySQLへの接続文字列をセットします。接続テストを実行して成功したらデプロイボタンをクリックします。

f:id:kuwazzy:20200313165055p:plain

デプロイパッケージの作成のプログレスバーが完了して成功することを確認します。

f:id:kuwazzy:20200313165424p:plain

配布パス(本例では、/Applications/CData/deploy/apiserver_deploy)に移動してファイルが出力されていることを確認します。

/Applications/CData/deploy/apiserver_deploy $ cd /Applications/CData/deploy/apiserver_deploy
/Applications/CData/deploy/apiserver_deploy $ ll
total 32
drwxr-x---   5 user1  admin   160  3 13 16:53 WEB-INF
-rw-r-----   1 user1  admin  1591  3 13 16:53 actor.jsp
-rw-r-----   1 user1  admin  2297  3 13 16:53 api.jsp
-rw-r-----   1 user1  admin  1567  3 13 16:53 city.jsp
-rw-r-----   1 user1  admin  2065  3 13 16:53 customer.jsp
drwxr-x---  10 user1  admin   320  3 13 16:53 help
/Applications/CData/deploy/apiserver_deploy $ 

apiserver_deployフォルダ配下のファイルをzip化して拡張子をwarに変更してデプロイ用パッケージを作成します。今回はapiserver_deploy.warというパッケージ名にしました。

デプロイパッケージをAPI公開マシンに配置

上記手順で作成したAPI公開用デプロイパッケージ(apiserver_deploy.war)を別なマシンのTomcatに配置します。

f:id:kuwazzy:20200313170323p:plain

ダウンロードファイルに含まれるapiserver.warファイルをwebappsフォルダ配下に配置してTomcatを起動します。本手順では、bin配下のstartup.shを直接起動しました。

API公開マシンのAPIへのアクセス確認

Tomcatが起動したらAPI利用者のマシンのブラウザからアクセスしてみます。

f:id:kuwazzy:20200313171149p:plain

「http(s)://{マシン名}:{ポート番号}/apiserver_deploy/help/api.html」のURLにアクセスするとAPIリファレンスのページが開きます。

f:id:kuwazzy:20200313170842p:plain

試しにリソースを選択(本例ではactor)を開いて、右側のHTTP GETメソッドのURL(本例ででは、 http://localhost:8080/apiserver_deploy/api.rsc/actor/ )にブラウザでアクセスしてみます。

f:id:kuwazzy:20200313171012p:plain

※注意事項 「api.rsc/actor/」のリンクからだとURL中にタグが含まれてしまっておりアクセスが失敗します。現在、製品チームに確認中です。

認証ダイアログが表示されますので、APIアクセスユーザのユーザ名と認証トークンをセットします。

f:id:kuwazzy:20200313171618p:plain

APIレスポンスとしてJSONデータが返って来ることを確認します。

f:id:kuwazzy:20200313171839p:plain

アクセスログの確認

APIServerの管理コンソールに戻り、ステータスタブのアクセスログを参照してみます。作成したAPIアクセス用ユーザのリクエストが記録されていることが確認出来ます。

f:id:kuwazzy:20200313172136p:plain

まとめ

本記事ではAPI開発用のAPIServerデプロイパッケージを作成して、API利用者用のAPIServerを別に構築する手順をご紹介しました。これによってAPI利用者にはAPIリファレンスとAPIエンドポイントのみのAPIServerを提供することが可能となります。また、API定義・ユーザー・ログといった管理用DBはMySQLに一元管理されているので、APIの利用状況に応じてAPI公開用マシンを複数台にスケールアウトするような構成を組むことができる様になります。