OCIでプライベート・サブネットに存在するデータベースに、ロード・バランサを使ってインターネットから接続してみた

Oracle Cloud Infrastructure（以下、OCI）では、以下のような複数のデータベース形態を利用できます。

・Database Cloud Service（以下、DBCS）：Oracle DatabaseのPaaS提供
・Autonomous Database（以下、ADB）：Exadataをベースとした自律型データベース
・MySQL Database Service（以下、MDS）：MySQL DatabaseのPaaS提供
・IaaS上にデータベースを構築

それぞれ特長はありますが、DBCSとADBはプライベート・サブネットに作成すると、あとからパブリック・サブネットを追加・変更することはできません。
MDSについては現時点ではプライベート・サブネットにのみ対応しています。

データベースなので、プライベート・サブネットに配置するのはフツーなのですが、たまに以下のような要件があり、パブリック・ネットワーク（インターネット）からアクセスする必要が出てくることがあります。

・当初想定していなかった関連会社からのデータベース・アクセスが必要となった
・検証利用のため、一時的にインターネットからアクセスしたい
・ADBからデータベース・リンクを作成したい

このような場合、パブリック・サブネットにプロキシとなる踏み台サーバーを用意するケースが多いと思いますが、より安く、より簡単に、かつ可用性の高い方法として、フレキシブル・ロード・バランサをプロキシ的に利用できるかと思い、試してみることにしました。

プライベート・サブネットに接続可能なデータベースが存在している前提で、以下に作成手順を記載していきます。

### 1.ロード・バランサの作成

まずは、ロード・バランサを作成します。
OCIコンソールの左上三本線メニューより「ネットワーク＞ロード・バランサ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/5da2508b-0e1c-c87e-f4dc-3d8f2c97ee66.png)
［ロード・バランサの作成］ボタンを押し、作成ウィザードを起動します。

ロード・バランサ・タイプの選択画面では、「ロード・バランサ」を選択し、［ロード・バランサの作成］ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/78a88b6d-2ffb-44c0-c70b-973fa00adf1e.png)
「詳細の追加」画面では、ロード・バランサ名、可視性タイプ、パブリックIPアドレスの割当てを設定します。
今回はインターネットからの接続に使用するため、可視性タイプを「パブリック」に設定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/6c49ee0d-1d22-63ce-64f1-fd61845045ad.png)
下にスクロールして、帯域幅を設定します。
「動的シェイプ」は将来的にサポートされなくなる予定のため、「フレキシブル・シェイプ」を選択します。
必要に応じて「最小帯域幅」「最大帯域幅」を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/cb6360d7-e4c1-32f1-d160-9e70f6a5bf89.png)
さらに下にスクロールして、ロード・バランサの所属するネットワークを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/421aa038-9c19-0c50-886b-0a991268b8ff.png)
［次］ボタンを押して、「バックエンドの選択」画面に進みます。

まずは、ロード・バランシング・ポリシーを設定します。
今回は、プロキシとして機能させることが目的で、バックエンド・サーバーは１台のデータベースを想定しているため、デフォルトの「重み付けラウンド・ロビン」にしておきます。（バックエンドの追加はここでは行わないでおきます（あとで設定します））
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/6431de35-89dd-23f8-8aa0-3fa3f93d0ef8.png)
下にスクロールして、ヘルスチェック・ポリシーを設定します。
プロトコルは「TCP」を選択し、ポートはデータベースへの接続ポートを設定します。
例えば、DBCSへの接続ポートであれば、デフォルトそのままの場合は「1521」を設定します。
（ADBであれば「1522（場合によっては「1521」）、MDSの場合は「3306」です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/6969cef3-0a78-7378-37fb-529a212b2477.png)
拡張オプションの表示リンクを押して、バックエンド・セット名をわかりやすい名前にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/09e00967-b023-96b5-dab2-5dd93d506ba1.png)
［次］ボタンを押して、「リスナーの構成」画面に進みます。

任意のリスナー名を設定し、「リスナーで処理するトラフィックのタイプ」は「TCP」を選択します。
「リスナーでイングレス・トラフィックをモニターするポート」には、前画面で設定したデータベースへの接続ポートを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/bde7ae1c-db08-3e14-5bdc-3e31d418eae9.png)
［次］ボタンを押して、「ロギングの管理」画面に進みます。

今回はエラーログのみ取得する設定にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/4dcebf49-dde7-a3d0-f0c4-7c00df465b60.png)
すべて設定できたら、［送信］ボタンを押してロード・バランサを作成します。
この時点では、バックエンドセットを設定していないため、ヘルスチェックは「不完全」となっています。

### 2.バックエンド・サーバーの追加

バックエンド・セットにデータベース・サーバーを追加します。

ロード・バランサ詳細画面の左下にあるリソース・メニューから「バックエンド・セット」を選択し、先ほど作成したバックエンド・セットを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/c009be65-0fdd-2747-4756-93c6b40e7d64.png)
バックエンド・セットの詳細画面の左下にあるリソース・メニューから「バックエンド」を選択し、「バックエンドの追加」ボタンを押します。

バックエンドの追加画面で、追加方法として「IPアドレス」を選択し、データベースのプライベートIPとポートを設定します。（ポートにはデータベースへの接続ポートを設定します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/3569892e-29f5-f991-4aa3-02b99c49a161.png)
［追加］ボタンを押すと「作業リクエスト送信済」のダイアログが表示され、しばらく待つとステータスが「送信済み」から「成功」に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/8e559b24-2524-71b9-df84-2516c3eb1d12.png)
しばらくして、ロード・バランサの詳細画面に戻ると、ヘルスチェックが「OK」に変わっているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/56e24a38-a90b-0ce4-1924-8d368e8922a4.png)
あとで利用するので、画面上の「IPアドレス」を控えておきます。

### 3.セキュリティ・ルールの追加

最後に、ロード・バランサへの接続を許可するよう、セキュリティ・リストにルールを追加します。

左上三本線メニューより「ネットワーク＞仮想クラウド・ネットワーク」を選択します。

仮想クラウド・ネットワーク（以下、VCN）が一覧表示されるので、ロード・バランサを作成したVCNを選択します。

VCNの詳細画面が表示され、画面下部にサブネットの一覧が表示されます。
一覧より、ロード・バランサを作成したパブリック・サブネットを選択します。

サブネットの詳細画面が表示され、画面下部にセキュリティ・リストの一覧が表示されます。
一覧より、データベース接続ポートの設定を行うセキュリティ・リストを選択します。（デフォルトでは「Default Security List for VCN名」になっています）

ようやく、設定画面にたどり着きました....
新しいルールを追加するため、［イングレス・ルールの追加］ボタンを押します。
イングレス・ルールの追加画面で、接続元のCIDRと接続ポートを指定して、［イングレス・ルールの追加］ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/24ef1dbc-739b-4c3e-7aae-673d2226ca7c.png)
今回は検証のため、接続元のCIDRを「0.0.0.0/0」としていますが、本来は実環境に合わせて、接続元のCIDRに絞って設定することをおすすめします。

### 4.接続テスト

手順2.バックエンド・サーバーの追加の最後に控えておいた、ロード・バランサの詳細ページに記載のあるIPアドレス（パブリック）を使って、インターネットからデータベースに接続してみます。

Oracle Databaseであれば、tnsnames.oraのHOSTをロード・バランサのIPアドレスに置き換えます。

SQL*Plusで接続してみると、インターネットからプライベート・サブネットのデータベースに接続できることが確認できます。

```
C:\OracleClient>sqlplus orauser/xxxxxxxx@privatedb

SQL*Plus: Release 18.0.0.0.0 - Production on 火 11月 9 18:58:31 2021
Version 18.5.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.13.0.1.0
に接続されました。

SQL>
```

### 注意点

ロード・バランサにはアイドル・タイムアウトの設定があり、TCPリスナーのデフォルト値は300秒です。

ロード・バランサ作成時のリスナー構成の拡張オプション、または作成後のリスナー編集でアイドル・タイムアウト時間を設定できるので、必要に応じて変更してください。

### 最後に....

ロード・バランサは本来はバックエンドに複数のサーバーを持ち、負荷分散や障害に備えた冗長化を提供するのが主な目的となります。
それに加えて、フレキシブル・ロード・バランサはプロキシ・サーバーとしても機能するため、今回のようなパブリック・ネットワーク（インターネット）とプライベート・ネットワークの中継にも利用できることが確認できました。