(2021/01/27更新) 本記事でご紹介しております「deploy.rst」を用いてデプロイパッケージを作成する機能ですが現在は提供しておりません。デプロイ先環境で利用するパッケージは、デプロイ元と同じものをご利用いただく方法をご推奨しております。詳細の手順はCData Japanサポートデスクまでお問い合わせください。
はじめに
CData技術ディレクター桑島です。本記事では、API開発用のCData API Server(以下、APIServer)でAPI公開マシン用のデプロイパッケージを作成して、API利用者用のAPIServerを別に構築する手順をご紹介します。これによりAPIServerの管理機能をAPI利用者には非公開にして、かつ、APIの利用状況に応じてAPI公開用マシンを複数台にスケールアウトするような構成を組むことができる様になります。
前提
本記事では、以下の構成で確認しています。
- Web Server : Apache Tomcat Version 8.5.24
- OS : MacOSで確認 ※Linux・Windowsでも手順は一緒です
- DB : MySQL 5.4 ※API定義・ユーザ・ログ情報を格納するDB、および、API公開するデータを格納するDBの2つが必要です
手順
API開発用APIServerの構築
Tomcatのconf配下のServer.xmlを開き、
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は環境にあわせた値をセットしてください。
<?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をダウンロードします。
ダウンロードファイルに含まれるapiserver.warファイルをwebappsフォルダ配下に配置してTomcatを起動します。本手順では、bin配下のstartup.shを直接起動しました。
Tomcatが起動したら管理コンソールにアクセスできるマシンから開きます。デフォルトではパッケージ名がapiserverなので「http(s)://{マシン名}:{ポート番号}/apiserver」でアクセス出来ます。下記のログイン画面が表示されたらtomcat-users.xmlで設定したusernameとpasswordをセットしてサインインしてください。
ログインが成功するとステータス画面が開きます。まだライセンスのアクティベーションを行なっていませんのでライセンスを認証する旨のメッセージが表示されています。
一旦、APIServerの管理コンソールを離れて、TomcatのServer.xmlで設定したMySQLのデータベース(本例では、apiserver)をMySQLWorkBenchなどで参照してみます。すると、「app_logs / app_request / app_scripts / app_settings / app_user_connections / app_users」というテーブルが作成されています(※作成されない場合は、Server.xmlなどの設定に問題があります)。
これらのテーブルには、APIServerの管理コンソールで定義したAPI定義情報やAPIへのアクセスユーザー、アクセスログ、そしてライセンス情報が格納されます。以下ポンチ絵の赤枠の通信となります。
API定義、および、アクセスユーザの定義
それでは、一度、APIServerの管理コンソールに戻り、APIServerのライセンスを認証します。情報 タブを開き、「新しいライセンスをインストール」をクリックします。
ライセンス情報を登録するウィンドウが表示されるので必要事項を登録して保存して、以下画面の様にプロダクトキーがセットされたことを確認してください。このプロダクトキーはMySQLのAPP_DB内に保存されます。
次にAPI公開データが格納されているMySQLへの接続情報を作成します。下のポンチ絵の赤枠の接続です。
設定 > 接続 タブを開き、「+接続の追加」ボタンをクリックします。
接続可能なDBの一覧が表示されるので今回はMySQLを選択します。
MySQLへの接続情報をセットして接続のテストを実施し接続に成功したことを確認したら変更を保存します。
次に設定 > リソース タブを開き、「リソースの追加」ボタンをクリックします。
リソースの追加ウィザードが開くので、MySQL内のAPIとして公開したいテーブルを選択します。本例では、MySQLのサンプルDBであるsakilaデータエース内のactor, city, customerを選択しました。
ウィザードが完了すると選択したテーブルがリソース一覧に表示されます。
続いてAPIにアクセス可能なユーザを追加していきます。設定 > ユーザータブを開き「+追加」ボタンをクリックします。
ユーザーを追加ウィザードが開きますので、ユーザ名と権限を付与します。本手順ではcdatauserというユーザに参照(GET)のみの権限を付与しました。変更を保存します。
ユーザの一覧に追加したユーザの認証トークンが表示されます。この値は、APIアクセス時に使用するので控えておいてください。
APIにアクセスするマシンを制限したい場合は、設定 > サーバ 内の信頼されたIPアドレスに追加してください。
以上でAPIのエンドポイントの作成、および、アクセスするための準備が完了しました。
管理コンソールのマシンからのAPIリクエストの確認
それでは、まずは、管理コンソールを開いているマシンからAPIリクエストを発行してみたいと思います。APIタブを開きます。リソースに上記手順で追加したMySQLのテーブルが追加されていることを確認します。その中のひとつのエンドポイントを選択します。本手順ではactorを選択しました。右側にactorのAPIリファレンスが表示されます。api.rsc/actor/ のリンクをクリックします。
actorテーブルのデータがJSONデータとなってレスポンスが返って来ることを確認します。管理コンソールにログインした状態だと認証は求められませんが、URL直リンクで開いた場合や別なツールからリクエストを発行する場合には、上記で取得したAPIアクセスのユーザ名と認証トークンをセットしてください。
デプロイパッケージの作成
API開発用のAPIServerからAPI公開用マシン用のデプロイパッケージを作成します。
こちらの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への接続文字列をセットします。接続テストを実行して成功したらデプロイボタンをクリックします。
デプロイパッケージの作成のプログレスバーが完了して成功することを確認します。
配布パス(本例では、/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に配置します。
ダウンロードファイルに含まれるapiserver.warファイルをwebappsフォルダ配下に配置してTomcatを起動します。本手順では、bin配下のstartup.shを直接起動しました。
API公開マシンのAPIへのアクセス確認
Tomcatが起動したらAPI利用者のマシンのブラウザからアクセスしてみます。
「http(s)://{マシン名}:{ポート番号}/apiserver_deploy/help/api.html」のURLにアクセスするとAPIリファレンスのページが開きます。
試しにリソースを選択(本例ではactor)を開いて、右側のHTTP GETメソッドのURL(本例ででは、 http://localhost:8080/apiserver_deploy/api.rsc/actor/ )にブラウザでアクセスしてみます。
※注意事項 「api.rsc/actor/」のリンクからだとURL中にタグが含まれてしまっておりアクセスが失敗します。現在、製品チームに確認中です。
認証ダイアログが表示されますので、APIアクセスユーザのユーザ名と認証トークンをセットします。
APIレスポンスとしてJSONデータが返って来ることを確認します。
アクセスログの確認
APIServerの管理コンソールに戻り、ステータスタブのアクセスログを参照してみます。作成したAPIアクセス用ユーザのリクエストが記録されていることが確認出来ます。
まとめ
本記事ではAPI開発用のAPIServerデプロイパッケージを作成して、API利用者用のAPIServerを別に構築する手順をご紹介しました。これによってAPI利用者にはAPIリファレンスとAPIエンドポイントのみのAPIServerを提供することが可能となります。また、API定義・ユーザー・ログといった管理用DBはMySQLに一元管理されているので、APIの利用状況に応じてAPI公開用マシンを複数台にスケールアウトするような構成を組むことができる様になります。