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

以前に[「OCIでプライベート・サブネットに存在するデータベースに、ロード・バランサを使ってインターネットから接続してみた」](https://qiita.com/ayamakkk/items/a5ef6b5b9925775f4a73)という記事を書きましたが、同じことがネットワーク・ロード・バランサでもできるはずなので試してみました。

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

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

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

ロード・バランサ・タイプの選択画面では、「ネットワーク・ロード・バランサ」を選択し、［ロード・バランサの作成］ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/39feb023-f31e-0871-f5d3-a4efd152e845.png)
「詳細の追加」画面では、ロード・バランサ名、可視性タイプ、パブリックIPアドレスの割当てを設定します。
今回はインターネットからの接続に使用するため、可視性タイプを「パブリック」に設定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/97c1323a-1893-3dcf-2020-d73857692de7.png)
下にスクロールして、ロード・バランサの所属するネットワークを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/f3f22393-4328-47c9-0ed7-ac206f4e265a.png)
［次］ボタンを押して、「リスナーの構成」画面に進みます。

任意のリスナー名を設定し、「リスナーで処理するトラフィックのタイプ」は「TCP」を選択します。
「イングレス・トラフィック・ポート」には、データベースへの接続ポートを設定します。
例えば、DBCSへの接続ポートであれば、デフォルトそのままの場合は「1521」を設定します。
（Autonomous Databaseであれば「1522（場合によっては「1521」）」、MySQL Databaseの場合は「3306」です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/98fa4dc3-35fa-74de-6fdb-6330842503cc.png)
［次］ボタンを押して、「バックエンドの選択」画面に進みます。

任意のバックエンド・サーバー名を設定します。
バックエンドの追加はここでは行わないでおきます。（あとで設定します）
「ソースIPの保持」チェックボックスはオフにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/c2b2ea02-96e1-a8bd-d9d2-d90bbfb16d60.png)
下にスクロールして、ヘルスチェック・ポリシーを設定します。
プロトコルは「TCP」を選択し、ポートは前画面で設定したデータベースへの接続ポートを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/9ce53cd0-8f0f-dd69-c322-7a693a281431.png)
［次］ボタンを押して、設定内容を確認し、問題なければ［ネットワーク・ロード・バランサの作成］ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/8167d0ac-ce28-62fc-61cb-d5f3b63a21fa.png)
しばらくすると、ネットワーク・ロード・バランサが作成され、Active状態となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/6849081b-edb8-1041-8bdc-ad4eb743d542.png)
あとで利用するので、画面上の「IPアドレス（パブリック）」を控えておきます。

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

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

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

バックエンドの追加画面で、バックエンド・タイプとして「IPアドレス」を選択し、データベースのプライベートIPとポートを設定します。（ポートにはデータベースへの接続ポートを設定します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/26beda3f-6250-1aa1-57eb-45360bb9841f.png)
［バックエンドの追加］ボタンを押すと、「作業リクエスト送信済」のダイアログが表示され、しばらく待つとステータスが「送信済み」から「成功」に変わります。

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

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

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

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

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

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

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

### 4.接続テスト

手順1.ロード・バランサの作成の最後に控えておいた、ロード・バランサの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 火 2月 1 21:21:47 2022
Version 18.5.0.0.0

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

Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.5.0.0.0
に接続されました。

SQL>
```

### 注意点

ネットワーク・ロード・バランサには、TCPフローの場合は6分の Connections Idle Timeout が設定されています。（マニュアルの記載は[こちら](https://docs.oracle.com/ja-jp/iaas/Content/NetworkLoadBalancer/overview.htm#ConnectionsIdleTimeout)になります。）

6分間操作がないと、ORA-03113となりますので、注意が必要です。
また、回避方法として、[こちらの記事](https://qiita.com/ayamakkk/items/b1e66ad87f92e2fa67a9)もご参照ください。