CData Software Blog

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

APIServer AMI の設定情報を管理用DBに保持する方法

f:id:sennanvolar44:20210811083749p:plain こんにちは、テクニカルサポートの宮本です!

CData APIServer や CData Sync などのアプリケーション製品では、各種設定情報を内部で保持している Java DB(Derby) で保持しています。ただ、「同じ設定でオートスケールさせたい」、「コンテナサービスで利用したい」といったケースでは、設定情報を内部ではなく他の永続的に参照できる場所で保持することがあります。

そこで今回は外部の DB を管理 DB として扱い、APIServer AMI の設定情報を管理 DB に保存する方法をご紹介したいと思います。

手順

今回は APIServer AMI を使用していきます。まだお持ちでない方がいましたら、こちらのリンクから AMI 版を起動してみてください。

AWS Marketplace: CData API Server

AMI 版の進め方はこちらを参考にしてください。

www.cdatablog.jp

管理DB用のドライバーを配置

AMI の場合、デフォルトでは SQLServerOracle 用のドライバーが /opt/jetty/lib/ext/ に入っています。
f:id:sennanvolar44:20210811073551p:plain

もし上記以外のデータベースを管理 DB としたい場合は、同ディレクトリに API Server からドライバーをコピーして持ってきます。
なお、今回は MySQL を使っていきます。

[root@ip-172-31-23-186 ~]# cp -p /opt/apiserver/work/jetty-0.0.0.0-8443-apiserver.war-_-any-/webapp/WEB-INF/lib/cdata.jdbc.mysql.jar /opt/jetty/lib/ext/
[root@ip-172-31-23-186 ~]# ll /opt/jetty/lib/ext/
total 14792
-rw-r--r--. 1 jetty jetty 10327402 Oct 10  2020 cdata.jdbc.mysql.jar
-rw-r--r--. 1 jetty jetty  1111548 Dec  4  2020 mssql-jdbc-6.4.0.jre8.jar
-rw-r--r--. 1 jetty jetty  3698857 Dec  4  2020 ojdbc7.jar
[root@ip-172-31-23-186 ~]#

Jetty / APIServer のリソース定義

APIServer AMI では Jetty で JNDI を使って 外部DBの DataSource を取得しますので、Jetty および API Server の xml ファイルを更新して、API Server で保存するリソース情報を管理 DB に保存するようにしていきます。

それではまずは、Jetty 側の更新です。/opt/jetty/etc/jetty.xml に対して、APP_USERS、APP_LOGS、APP_DB のリソース定義を Configure タグ内に下記内容を追記します。※追記部分とした箇所

各設定内容
* APP_USERS:データソースへの接続情報
* APP_LOGS:ログ情報
* APP_DB:ライセンスキーなどAPIServerで設定している情報

    <!-- =========================================================== -->
    <!-- extra server options                                        -->
    <!-- =========================================================== -->
    <Set name="stopAtShutdown"><Property name="jetty.server.stopAtShutdown" default="true"/></Set>
    <Set name="stopTimeout"><Property name="jetty.server.stopTimeout" default="5000"/></Set>
    <Set name="dumpAfterStart"><Property name="jetty.server.dumpAfterStart" deprecated="jetty.dump.start" default="false"/></Set>
    <Set name="dumpBeforeStop"><Property name="jetty.server.dumpBeforeStop" deprecated="jetty.dump.stop" default="false"/></Set>

<!-- ↓↓追記部分 -->
    <New Id="AppUsers" class="org.eclipse.jetty.plus.jndi.Resource">
      <Arg></Arg>
      <Arg>jdbc/APP_USERS</Arg>
      <Arg>
        <New class="cdata.jdbc.mysql.MySQLDataSource">
          <Set name="url">jdbc:mysql:Server=xxxxxx
;Port=3306;Database=cdata;User=yyyyy;Password=zzzzzzz</Set>
        </New>
      </Arg>
    </New>

    <New Id="AppLogs" class="org.eclipse.jetty.plus.jndi.Resource">
      <Arg></Arg>
      <Arg>jdbc/APP_LOGS</Arg>
      <Arg>
        <New class="cdata.jdbc.mysql.MySQLDataSource">
          <Set name="url">jdbc:mysql:Server=xxxxxx
;Port=3306;Database=cdata;User=yyyyy;Password=zzzzzzz</Set>
        </New>
      </Arg>
    </New>

    <New Id="AppDB" class="org.eclipse.jetty.plus.jndi.Resource">
      <Arg></Arg>
      <Arg>jdbc/APP_DB</Arg>
      <Arg>
        <New class="cdata.jdbc.mysql.MySQLDataSource">
          <Set name="url">jdbc:mysql:Server=xxxxxx
;Port=3306;Database=cdata;User=yyyyy;Password=zzzzzzz</Set>
        </New>
      </Arg>
    </New>
<!-- ↑↑追記部分 -->
</Configure>

次にAPI Server の設定ファイルから Jetty で設定した DataSource を参照するよう設定します。
/opt/apiserver/work/jetty-0.0.0.0-8443-apiserver.war-_-any-/webapp/WEB-INF/web.xml に下記内容を追記します。※追記部分とした箇所

  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>
  <!--resource-ref>
    <description>App Security Datasource</description>
    <res-ref-name>jdbc/appLogs</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref-->

<!-- ↓↓追記部分 -->
  <resource-ref>
    <description>App Security Datasource</description>
    <res-ref-name>jdbc/APP_USERS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

  <resource-ref>
    <description>App Security Datasource</description>
    <res-ref-name>jdbc/APP_DB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

  <resource-ref>
    <description>App Security Datasource</description>
    <res-ref-name>jdbc/APP_LOGS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
<!-- ↑↑追記部分 -->
</web-app>

最後に API Server を再起動して設定自体は完了です。

API Server の接続情報を保存

API Server のコネクション設定にて対象となるデータソースへの接続情報を作成します。
管理用DB に保存する場合は、「Name」を入力し、「Master Connection」にチェックを入れたら一旦右上の「Save Changes」をクリックします。
f:id:sennanvolar44:20210811080201p:plain

そうしますと、「User registration URL」に URL が表示されますのでクリックします。
f:id:sennanvolar44:20210811080642p:plain

ここで表示された画面で接続情報を入力し、接続テストが完了したら保存します。
f:id:sennanvolar44:20210811080856p:plain

管理DBに保存されている確認

では、管理 DB の MySQL にいま入力した設定情報が保持されているか確認してみます。MySQL WorkBenchで DB に接続してみると、このように各種 API Server で使用する設定用テーブルが作成されているのが確認できます。
f:id:sennanvolar44:20210811081326p:plain

接続情報が保存されている app_user_connections にSelect してみると、先ほど登録した情報が表示されました。
f:id:sennanvolar44:20210811081618p:plain

おわりに

いかがでしたでしょうか。簡単に外部の DB に設定情報を保存することができました。この管理DBの手法を使って、API Server の複数構成やコンテナで利用するケースで是非ご利用ください。
次回は AMI 版ではなく、インストール型の API Server で行う管理DBの設定をご紹介いたします。

www.cdata.com