はじめに
Autonomous DatabaseにはOracle管理のORDSが付属しておりすぐにREST APIの開発ができます。しかしOracle管理のORDSではREST APIへのアクセスログを残す方法がありません。そこで、API Gatewayとの組み合わせを試しました。
前提条件
- DEMOUSER1というユーザーのEMP表を利用
- Autonomous Databaseはプライベート・エンドポイントを利用。ただし、インターネット経由で付属ツールのアクセスができるようパブリック・アクセスを許可済み
- Autonomous DatabaseとAPI Gatewayは同じプライべート・サブネットに配置
- プライベート・サブネットにアクセスできるコンピュート・インスタンスを同じVCNのパブリック・サブネットに作成済み
1.REST APIを作成する
Autonomous Database(というかOracle Database)は二通りの方法でREST APIを作成できます。
- AutoRESTによるデータベース・オブジェクトのRESTfulサービス化
- 手動によるRESTfulサービスの作成
データベース・オブジェクトでAutoRESTを有効化するとそのオブジェクトにRESTでのアクセスができるようになります。とても簡単にデータベース・オブジェクトをRESTデータソースとして公開ができるのですが、事前定義された形式になるため、目的にあわない場合はハンドラをSQL、PL/SQLで設定する手動による作成が選べます。
今回は検証ということでAutoRESTでREST APIを作成します。Autonomous Databaseの場合はGUIのDatabase Actionsでできるのでさらに簡単です。
DEMOUSER1でDatabase ActionsにログインしSQLにアクセスします。次にEMP表を検索し、右クリックしてREST→有効化を選択します。
オブジェクトのRESTの有効化の画面が表示されます。今回はデフォルトのまま有効化します。コードの表示で実行されるSQLを確認することも可能です。
有効化後は無効化のほかcURLコマンドの確認ができるようになります。
cURLコマンドは3つのターミナルでのコマンドが確認できます。
コマンドはメソッド別にあり、例えばGET Singleだと値を指定してコマンドの確認ができます。
試しにコマンドプロンプトで実行してみます。EMP表の内容はこちらです。
7788を指定したコマンドをコピーアンドペーストしたところ、正しく7788の新井さんの結果が表示がされました。
なお、AutoRESTで作成したREST APIはDatabase ActionsのRESTで確認もできます。認証設定などはこちらで行うことができます。
2.OCI API Gatewayを構成する
次に公開されているチュートリアルを参考にAPI Gatewayを構成します。
開発者サービス→API管理→ゲートウェイを選択し、ゲートウェイの作成をクリックします。
今回使用している検証環境の割り当て制限でパブリックIPが利用できなかったため、タイプはプライベートとし、ネットワークのサブネットはプライベート・サブネットを指定しました。
作成が成功しました。
次にデプロイメントを作成します。デプロイメントを選択して、デプロイメントの作成をクリックします。
基本情報は名前とパス接頭辞だけ指定して、後はデフォルトのままにします。
認証は認証なしにします。
ルートは単一バックエンドの追加を選択し、1のcURLコマンドで試したAutoRESTで作成したREST APIのGET SingleのURLにアクセスさせるように設定していきます。
バックエンド・タイプにHTTP、メソッドはGETを選択します。パスは/accessemp/{id}
としてみました。URLはアクセスするREST APIのURLになりますが、引数としてパスの{id}
を渡したいので、コンテキスト変数を使って${request.path[id]}
と指定します。API Gatewayのコンテキスト変数はこちらのドキュメントに記載があります。
設定を確認し、作成をクリックします。
アクティブになりました。
ログも有効化します。左のリソースからログを選択し、Access Logsのログの有効化をOnにします。
ログの有効化の画面が表示されます。今回はデフォルトのまま、ログの有効化をクリックします。
Access Logsのステータスがアクティブになりました。ログ名をクリックしてログを確認することができます。
3.アクセスしてみる
アクセスするURLは、デプロイメントのエンドポイント+ルーティングで設定したパス
になります。デプロイメントのエンドポイントはゲートウェイの詳細、またはデプロイメントの詳細からコピーができます。
API Gatewayのタイプをプライベートにしたので、パブリック・サブネットに配置したコンピュート・インスタンスからアクセスします。
[opc@dev1 ~]$ curl --location "https://********************.apigateway.ap-tokyo-1.oci.customer-oci.com/v1/accessemp/7788"
{"empno":7788,"ename":"新井 敦子","job":"アナリスト","mgr":7566,"hiredate":"1982-12-09T00:00:00Z","sal":3000,"comm":null,"deptno":20,"links":[{"rel":"self","href":"https://sya6vphk3pzlkhq-araadw1.adb.ap-tokyo-1.oraclecloudapps.com/ords/demouser1/emp/7788"},{"rel":"edit","href":"https://sya6vphk3pzlkhq-araadw1.adb.ap-tokyo-1.oraclecloudapps.com/ords/demouser1/emp/7788"},{"rel":"describedby","href":"https://sya6vphk3pzlkhq-araadw1.adb.ap-tokyo-1.oraclecloudapps.com/ords/demouser1/metadata-catalog/emp/item"},{"rel":"collection","href":"https://sya6vphk3pzlkhq-araadw1.adb.ap-tokyo-1.oraclecloudapps.com/ords/demouser1/emp/"}]}
正しく応答が返りました!
ログを確認してみると出力がされていることが確認できました。
詳細を参照すると以下のような情報が取得されていました。
API Gatewayで扱えるデータサイズは最大20MBとなります。例えばデータ・ダウンロードの場合、データが20MBを超えているとエラーになりますので、データを直接返すのではなくObject Storageに出力するなどを検討してください。
おわりに
Oracle管理のORDSを使用したREST APIにOCI API Gateway経由でアクセスしてみました。
API Gatewayを挟むと、REST APIのアクセス・ログからAPIの使用状況を把握することができるので、どのAPIが最も使用されているか、どのAPIが重要でないかなどといった分析が可能になります。また、ORDSのAPIをそのまま公開したくないという場合にもAPI Gatewayが利用できます。