by 庄司 里菜 | July 03, 2018

AWSとCDataで実現するスケーラブルなWebAPIサーバーの構築手順

はじめに

CData API Server(以下、APIServer)は、ポイント&クリック操作だけで超高速にMySQLやSQLServerなどのデータベースからWebAPIを自動生成出来る製品です。本製品は、オンプレのサーバー環境やAWS、Azureや、Herokuなどのクラウド環境にデプロイして利用することが出来ます。本記事では、ローカルマシンで設定したCData API ServerをAWSのEC2環境へデプロイして、オートスケーリングの設定を行ったスケーラブルなWebAPIサーバー環境の構築手順と留意点についてご紹介します。

構成イメージ

本手順で構築するシステム構成は、以下の通りです。

  • 本番環境はEC2上のAmazonLinux、デプロイ(兼、API開発・監視)環境はローカルのMacOS上に構築
  • WebアプリケーションサーバーにはTomcatを使用
  • AmazonRDS上のMySQLとSQLServerをWebAPIとして公開
  • CData APIServer用の管理データベースは、Amazon RDS上のSQLServerに構築
  • 本番環境は、オートスケーリングの設定として、ELBで負荷分散


前提

  • AWSの各種サービス(EC2,RDS,ELB)のマネジメントコンソールを利用出来ること
  • AWSのEC2インスタンス(AmazonLinux)が準備されていること
  • AWSのRDSにAPI公開するデータが格納されたSQLServer、および、MySQLのデータベースがあること
  • AWSのRDS(SQLServer)にAPIServer用の管理データベースを作成出来ること
  • デプロイ(兼、API開発)環境、本番環境にてTomcatがインストールされて動作すること
  • デプロイ(兼、API開発)環境からは、本番用のAmazon RDS上のMySQLとSQLServerへはアクセス可能
  • CData API Serverのクラウド基盤での利用が可能なエンタープライズライセンスを保有していること

手順

主な流れ

  1. APIServerのデプロイ環境を構築 【デプロイ機】
  2. APIのエンドポイント・アクセスユーザーを作成 【デプロイ機】
  3. デプロイ環境でのAPIアクセスの動作確認 【ブラウザ】
  4. デプロイ用パッケージを作成 【デプロイ機】
  5. 本番環境へAPIServerをデプロイ 【本番機】
  6. 本番機のAMIを作成 【AWSのマネジメントコンソール】
  7. ELB、および、オートスケーリング環境を構築 【AWSのマネジメントコンソール】
  8. 本番環境でのAPIアクセスの動作確認 【ブラウザ】

1. APIServerのデプロイ環境を構築 【デプロイ機】

CData API Server のダウンロード

こちらのページからCData API Serverをダウンロードします。setup.zipを解凍して apiserver.war を取り出します。

Tomcatのtomcat-users.xmlの編集

本設定により、管理者用のアカウントを追加します。Tomcatを停止して{TomcatHome}/conf配下のtomcat-users.xmlをエディタ等で開きます。

<tomcat-users>配下に<user>を追加します。

<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
                      :
<user name="admin" password="xxxxx" roles="cdata_admin,admin-gui,manager-gui,manager-status,manager-script,manager-jmx" />
</tomcat-users>

※ Passwordは任意の文字列に変更ください。

Tomcatへの.warの配備、および、起動確認

webapps配下にapiserver.warを配置します。配置したらTomcatを起動してください。

ブラウザから下記のURLにアクセスします。

http://localhost:8080/apiserver/

下記のような管理コンソールへのログイン画面が表示されることを確認します。


TomcatのServer.xmlの編集

本設定により、デプロイ機のAPIServerの管理コンソールから、本番機へAPIアクセスする際に必要なユーザーの追加や、ログの監視が可能となります。Tomcatを停止して{TomcatHome}/conf配下のserver.xmlをエディタ等で開きます。

<Host>配下にAPIServer用の<Context>を追加して、3つ(APP_DB、APP_USERS、APP_LOGS)の<Rerource>を追加します。下記は、RDSのSQLServerに準備した「apiserver」という名称のデータベースに構築する例となります。

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
                      :
        <Context path="/apiserver">
          <Resource name="jdbc/APP_DB" auth="Container" type="javax.sql.DataSource"
                factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
                maxActive="100" maxIdle="30" maxWait="10000"
                driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                url="jdbc:sqlserver://xxxxx.xxxxx.ap-northeast-1.rds.amazonaws.com:1433;DatabaseName=apiserver;User=xxxxx;Password=xxxxx;"/>
          <Resource name="jdbc/APP_USERS" auth="Container" type="javax.sql.DataSource"
                factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
                maxActive="100" maxIdle="30" maxWait="10000"
                driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                url="jdbc:sqlserver://xxxxx.xxxxx.ap-northeast-1.rds.amazonaws.com:1433;DatabaseName=apiserver;User=xxxxx;Password=xxxxx;"/>
          <Resource name="jdbc/APP_LOGS" auth="Container" type="javax.sql.DataSource"
                factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
                maxActive="100" maxIdle="30" maxWait="10000"
                driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                url="jdbc:sqlserver://xxxxx.xxxxx.ap-northeast-1.rds.amazonaws.com:1433;DatabaseName=apiserver;User=xxxxx;Password=xxxxx;"/>
        </Context>
      </Host>

※ url, User, Password は任意の文字列に変更ください。 ※ 事前のRDSのSQLServerにDatabaseNameに指定するデータベース(例では、apiserver)を作成しておく必要があります。

SQLServer用のJDBCドライバのダウンロード、および、配置

Microsoft社のWebページからSQLServer用のJDBCドライバをダウンロードします。ダウンロードしたJDBCドライバ(mssql-jdbc-xxxx.jre.jar)を、Tomcatを停止した状態で{TomcatHome}/webapps/apiserver/WEB-INF/lib 配下に格納します。

※ Javaランタイムと同じバージョンのJDBCドライバをご利用ください。

デプロイ環境のAPIServerの動作確認

Tomcatを起動します。

ブラウザから下記のURLにアクセスします。

http://localhost:8080/apiserver/

下記のような管理コンソールへのログイン画面が表示されることを確認します。


上記の tomcat-users.xml で定義した管理者ユーザでログインします。「情報」タブでライセンスアクティベーションが必要な旨のメッセージが表示されるので、APIServerのライセンスキーを入力してアクティベーションを実施します。


※ 弊社のライセンスサーバーへのHTTP通信が発生しますので、インターネットへの接続が必要となります。オフラインやプロキシサーバーなどの関係でアクティベーション出来ない場合はCDataサポートまでお問い合わせください。オフラインアクティベーションの手順をご案内します。

アクティベーションが完了してブラウザをリフレッシュするとプロダクトキーが表示されます。


2. APIのエンドポイント・アクセスユーザーを作成 【デプロイ機】

接続の追加

APIServerの管理コンソールで、「設定 > 接続」タブを開き、「+接続の追加」ボタンをクリックします。接続可能なDatabase一覧に、SQLServerとMySQLが存在していることを確認します。


※SQLServerが追加されていなければ、上記の手順「SQLServer用のJDBCドライバのダウンロード、および、配置」を見直してください。

以下の内容でMySQLとSQLServerの接続を作成します。

項目 MySQL設定値 SQLServer設定値
名前 任意(例:MySQL) 任意(SQLServer)
ドライバークラス(編集不可) cdata.jdbc.mysql.MySQLDriver com.microsoft.sqlserver.jdbc.SQLServerDriver
Server MySQLのIPアドレス、DSN名(例:xxxxx.xxxxx.ap-northeast-1.rds.amazonaws.com) SQLServerのIPアドレス、DSN名(例:xxxxx.xxxxx.ap-northeast-1.rds.amazonaws.com)
Port MySQLの接続ポート (デフォルト:3306) SQLServerの接続ポート (デフォルト:1433)
Database MySQLのデータベース名 (例:Pubs) SQLServerのデータベース名 (例:Pubs)
User MySQLのアカウント SQLServerのアカウント
Password MySQLのパスワード SQLServerのパスワード

設定を保存して、以下の通り、2つの接続が作成されたことを確認します。


リソースの追加

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


MySQLとSQLServerのデータベースの中の公開したいテーブル、および、ビューを選択して追加します。


追加したリソース(テーブル・ビュー)を確認します。


アクセスユーザーの追加

「設定 > ユーザー」タブを開き、APIのエンドポイントにアクセスするためのユーザーを作成します。「+追加」ボタンをクリックして、ユーザー名を指定して「変更を保存」で追加します。


ユーザーが追加されると認証トークンが生成されます。この認証トークンがAPIのアクセスキーとなりますので、控えておいてください。


アクセス可能なIPアドレスの制御

「設定 > ユーザー」タブを開き、「信頼されたIPアドレス」にてAPIServerにアクセス可能なIPアドレスを追加してください。全てのIPアドレスからのアクセスを許可する場合は「*」を追加します。


3. デプロイ環境でのAPIアクセスの動作確認 【ブラウザ】

それでは、デプロイ環境でのAPIエンドポイントにローカルマシンのブラウザを使ってアクセスしてみます。「API」タブを開きます。左側のリソース一覧に、先の手順で追加したMySQLとSQLServderのテーブルが表示されます。適当なテーブル名のリンクをクリックすると、HTTPメソッドのサンプルが記載されたAPIドキュメントを確認することが出来ます。


それでは、以下のGETメソッドのURLをクリップボードにコピーして、ブラウザで開いてみます。

http://localhost:8080/apiserver/api.rsc/テーブル名/

レスポンスとして、データベースのテーブル内のデータがJSON形式のデータとして表示されました。

※ 別なマシンやシークレットウィンドウなどで管理者コンソールからのアクセスと別なブラウザで確認する場合は、下記の通り、ログインダイアログが表示されます。ユーザー名とパスワードは、上記で作成したAPIのアクセスユーザをユーザー名に、認証トークンをパスワードにセットしてログインしてください。


4. デプロイ用パッケージを作成 【デプロイ機】

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

「設定 > デプロイ」タブを開き、デプロイ用のパッケージを作成するための下記情報をセットします。

カテゴリ 項目 設定値
APIをデプロイする プラットフォーム Java(デフォルト値:Java)
配布パス パッケージの出力先(例: /wrk/apiserver )
Clean deployment location オン(デフォルト値: オン )
APIヘルプ Clean documentasion location オン(デフォルト値: オン )
API と同じ位置にドキュメントをデプロイする オン(デフォルト値: オン )
ユーザーデータベース データベースタイプ Microsoft SQL Server(デフォルト値: SQLite )
接続文字列 APIServer管理用DBとなるSQLServerへの接続文字列
ログデータベース 上のユーザーと同じデータベース接続を使う オン(デフォルト値: オン )

※ SQLServerへの接続文字列( jdbc:sqlserver://xxxxx.xxxxx.ap-northeast-1.rds.amazonaws.com:1433;DatabaseName=apiserver;User=xxxxx;Password=xxxxx )
※ユーザーデータベースは「接続のテスト」を実行して接続に成功することを確認してください。

「デプロイ」ボタンをクリックして、緑の「Your APIs were deployed successfully」のメッセージが表示されればデプロイパッケージの作成は成功です。


デプロイパッケージへのSQLServerのJDBCドライバの追加

上記手順で作成したデプロイパッケージにSQLServerのJDBCドライバ(例:mssql-jdbc-...jre.jar)を追加します。

{配布パス}/WEB-INF/lib

※ Javaランタイムと同じバージョンのJDBCドライバをご利用ください。

デプロイパッケージへのMySQLのJDBCドライバの追加

こちらからCData MySQL JDBCドライバをダウンロードして、下記のパスに配置します。このMySQLのJDBCドライバは、クラウド環境での利用が可能なビルドとなります。

{配布パス}/WEB-INF/lib

※クラウドサービスのデプロイ先でMYSQLのDBに対してAPIアクセスした時に下記のMySQLのライセンスの問題が出る場合は、こちらの手順を実施してください。将来的にはこの手順は不要となります。

"code": "MockOp", "message": "このシステム上にCData JDBC Driver for MySQL 2018Jを使用するための有効なライセンスが見つかりませんでした。試用ライセンスを入手するには、sales@cdata.co.jpにお問い合わせください [コード:G nodeid:Y5F357ZE]。既にライセンスが入手している場合は、/var/lib/tomcat7/webapps/apiserver/WEB-INF/lib/cdata.jdbc.mysql.lic、/usr/share/tomcat7/.CData/cdata.jdbc.mysql.licのパスをご確認ください。"

warファイルの作成

上記で作成したデプロイパッケージを圧縮して、拡張子warのファイルとします。

cd {配布パス(例: /wrk/apiserver ) }
zip -r ../apiserver.war ./

※warファイルには、下記の通り、apiserverディレクトリを含めないでください。

- apiserver.war
|- {エンドポイント名}.jsp
|            : 
|- [help]ディレクトリ
|- [WEB-INF]ディレクトリ

5. 本番環境へAPIServerをデプロイ 【本番機】

Tomcatのtomcat-users.xmlの編集

本設定により、管理者用のアカウントを追加します。Tomcatを停止して{TomcatHome}/conf配下のtomcat-users.xmlをエディタ等で開きます。

<tomcat-users>配下に<user>を追加します。

<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">>
                      :
<user name="admin" password="xxxxx" roles="cdata_admin,admin-gui,manager-gui,manager-status,manager-script,manager-jmx" />
</tomcat-users>

※ Passwordは任意の文字列に変更ください。

warファイルの配置とTomcatの起動

上記で作成したデプロイパッケージ(例:apiserver.war)を本番機に(S)FTPで転送します(下記の例ではwgetで取得可能なURLにに配置)。Tomcatを停止して、warファイルをTomcatのwebapps配下に配備します。配備が終わったらTomcatをスタートします。

sudo tomcat7 stop
cd /usr/share/tomcat7/webapps
sudo wget https://s3-ap-northeast-1.amazonaws.com/xxxxx/apiserver.war
sudo tomcat7 start

※デフォルトのTomcat7の場合の例

Tomcatログの参照を参照したい場合は、tailコマンドでログをウォッチします。

sudo tail -f /var/log/tomcat7/catalina.out

本番環境へデプロイしたAPIServerへのアクセス

デプロイしたAPIへは下記のURLでブラウザよりアクセス可能です。デプロイしたAPIServerには管理コンソールはなく、APIマニュアルとAPIエンドポイントだけが公開されます。

http://xxx.xxx.xxx.xxx:8080/apiserver/help/api.html

※IPアドレス部分は環境に合わせてください


本番環境へデプロイしたAPIエンドポイントにアクセスしてみます。

http://xxx.xxx.xxx.xxx:8080/apiserver/api.rsc/{エンドポイント名}/

※IPアドレス部分は環境に合わせてください

ログインのダイアログが表示されたら、デプロイ環境で追加したAPIServerのユーザーと認証トークンをセットしてください。下記のようにJSONレスポンスが返って来れば成功です。


6. 本番機のAMIを作成 【AWSのマネジメントコンソール】

AMIsの作成

上記でデプロイ済みのAPIServerのEC2のAMIsを作成します。


7. ELB、および、オートスケーリング環境を構築 【AWSのマネジメントコンソール】

Load Balancingの設定

AWSのマネジメントコンソールで、「Load Balancers」を選択して、「Create Load Balancer」をクリックして「Application Load Balancer」を選択します。


Nameに適当な名称(例:apiserver)を入力して、Listeners(例:HTTP、Tomcatのポート8080)および、Availability Zones(例:Availability Zones)を2つ以上選択して次に進みます。


Tomcatで使用するポート(例:8080)が空いたルールをセキュリティグループを選択します。次に「Configure Routing」にて、Target Groupを作成します。「Register Target」は何も指定せず、「Review」で設定値を確認してLoad Balancerを作成します。


Auto Scalingの設定

「AUTO SCALING」内の「Launch Configurations」を選択して「Create launch configuration」をクリックします。


上記の手順で作成したAMIsを選択します。


適当なインスタンスサイズ(例:t2.small)を選択します。


セキュリティグループを選択します。Reviewで設定した値に問題なければ作成します。


次に「AUTO SCALING」内の「Auto Scalling Group」を選択して、「Create Auto Scaling group」をクリックします。


「Launch Configuration」「Use an existing launch configuration」を選択して上記で作成した「launch configuration(例:apiserver)」を選択します。


「Auto Scaling Group」にて、「Group size」に初期インスタンス数(例:1)を設定、Subnetを選択、「Advanced Details」内の「Receive traffic from one or more load balancers」をオンにします。これにより、LB(Load Balancer)から処理を受けてオートスケールすることになります。


次に、「Use scaling policies to adjust the capacity of this group」を選択して、インスタンスのスケールレンジ(例:1-3)を指定します。さらに、オートスケール時の閾値を設定します。下記の例では、CPUの利用率が10%を超過したら次のインスタンスを起動します。


Reviewで設定した値に問題がなければ作成します。


作成したLoad BalancerのDSN nameを取得します。「LOAD BALANCING」内の「Launch Balancers」を選択して、「Description」タブ内のDSN nameの値をコピーします。


8. 本番環境でのAPIアクセスの動作確認 【ブラウザ】

下記のURLにブラウザからアクセスします。

http://xxxxxx.ap-northeast-1.elb.amazonaws.com:8080/apiserver/help/api.html

※上記の*部分は上記で取得したDSNnameに合わせた値をセットしてください。

APIリファレンスが表示されれば、ELBを経由したオートスケール設定されたEC2インスタンスのWebApplicationへのアクセスが成功です。


同様にAPIエンドポイントにブラウザからアクセスしてみます。JSONレスポンスが返って来れば成功です。

(免責事項)

当記事に掲載されている内容につきましては、正しい情報を提供することに務めてはおりますが、提供している記事の内容及びリンク先からいかなる損失や損害などの被害が発生したとしても、著者、および、著者の所属企業では責任を負いかねます。



 
 
ダウンロード