ネットワーク・ロード・バランサ (NLB) の経由でプライベート・サブネット内の Oracle Base DB と Autonomous DB に接続する

__初めに__
この記事の位置付けは、次のシリーズ記事の1つです。

|利用方法|タイトル|Oracle DBへ|ADBへ|
|:--|:--|:--:|:--:|
|OCI Bastion|[OCI Bastion経由でプライベート・サブネット内のOracle DBに接続](https://qiita.com/liu-wei/items/36f2108992ce71d7bafc)|✅||
|OCI Bastion|[OCI Bastion経由でプライベート・サブネット内のAutonomous DBに接続](https://qiita.com/liu-wei/items/36dc12c95d3bc72e16db)||✅|
|OCI DB Tool|[OCI データベース・ツールでオラクルDBへの接続方法](https://qiita.com/liu-wei/items/1d4ed7477a28b794a56c)|✅|✅|
|OCI Cloud Shell|[OCI Cloud Shell からプライベート・サブネット内のインスタンスに接続する](https://qiita.com/liu-wei/items/f28aa9ab2a3e5b49b42d)|✅|✅|
|OCI Cloud Shell|[OCI Cloud Shell上のSQL PlusからADBに接続する](https://qiita.com/liu-wei/items/38b968cee3a9619c63e5)||✅|

クラウド上のDBインスタンスが、一般的にはプライベート・サブネットに配置されます。このDBインスタンス（<strong>Oracle Base DB</strong>、或いは <strong> Autonomous DB </strong>）に接続するには、On-Pのクラウド<strong>管理者</strong>は踏み台サーバを経由したり、OCI BastionやOCIデータベースツールなどのサービスを利用したりする多くの方法があります。踏み台サーバを構築せず、インターネットから接続したい場合は、パブリック・サブネット内のネットワーク・ロード・バランサ（<strong>NLB</strong>）を経由することも選択肢の一つです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/70fc4342-e134-7817-a4d5-2f07d2a7f2cb.png)

NLBを作成した後、接続先のインスタンスをパブリック NLB のバックエンドとして追加し、関連するリスナー・ポート (<font color=blue>1521 か 1522</font>) を開くと、NLB を介してプライベート・サブネット内のインスタンスに接続できます。

__メリット__
✅ 踏み台サーバを立てるのは不要（コストを節約）。
✅ 設定方法は簡単で、<strong>管理者</strong>の一時作業に向く（数分間で設定OK）。
✅ レイヤー4通信であり、可用性が高くて、レイテンシが低い。
✅ OCI Bastionと比べて、セッションタイムアウト（最大３時間）の心配がない。
✅ バックエンドをオフラインに切り替えると、接続の一時停止ができる。
✅ NLB自体は"[Always Free](https://www.oracle.com/jp/cloud/free/#always-free)"でカバーできるので、無料で使える。

なお、一つ NLB に<strong>複数のバックエンド・セット</strong>を追加できます。例えば、Oracle Base DB 用に 1 つ、Autonomous DB 用に 1 つ、各バックエンド・セットは独自のリスナー・ポートを使用します。それで共通のNLBを経由し、それぞれのポートでターゲットに接続できます。

:::note
NLB自体は停止できませんが、バックエンドをオフラインにすることは可能です。使用しないときにオフラインに切り替えることで、踏み台サーバーを一時停止するのと同じような効果が得られます。
:::

__目次__

- [1. 事前準備](#1-事前準備)
  - [1-1. 関連する OCI リソースの作成](#1-1-関連する-oci-リソースの作成)
  - [1-2. SQL Developer の準備](#1-2-sql-developer-の準備)
  - [1-3. ADB Wallet のダウンロード](#1-3-adb-wallet-のダウンロード)
- [2. NLBの作成](#2-nlbの作成)
- [3. Oracle Base DB に接続する](#3-oracle-base-db-に接続する)
  - [3-1. Oracle Base DB 用バックエンドの追加](#3-1-oracle-base-db-用バックエンドの追加)
  - [3-2. SQL Developerで Oracle Base DB に接続](#3-2-sql-developerで-oracle-base-db-に接続)
- [4. Autonomous DB に接続する](#4-autonomous-db-に接続する)
  - [4-1. Autonomous DB 用バックエンドの追加](#4-1-autonomous-db-用バックエンドの追加)
  - [4-2. ホストファイルの編集](#4-2-ホストファイルの編集)
  - [4-3. SQL Developerで Autonomous DB に接続](#4-3-sql-developerで-autonomous-db-に接続)
- [5. 接続の一時停止](#5-接続の一時停止) 
- [サマリー](#サマリー)

# 1. 事前準備
## 1-1. 関連する OCI リソースの作成
|タイプ|項目|値|コメント|
|:--|:--|:--|:--|
|VCN|CIDR|10.0.0.0/16|
|パブリック・サブネット|CIDR|10.0.0.0/24|NLB|
|プライベート・サブネット|CIDR|10.0.1.0/24|ターゲットDB|
|インターネット・ゲートウェイ|||ルート表に追加|
|セキュリティ・リスト (<strong>パブリック</strong>・サブネット用)|Ingress|ソース側のIP, TCP <font color=blue>1521,1522</font>|接続元の IP アドレスを指定する|
||Egress|0.0.0.0/0, 全てのプロトコル||
|セキュリティ・リスト (<strong>プライベート</strong>・サブネット用)|Ingress|10.0.0.0/24, TCP 1521,1522|<strong>NLBからのアクセス</strong>を許可|
||Egress|0.0.0.0/0, 全てのプロトコル||
|ルート表 (<strong>パブリック</strong>・サブネット用)|ルール|ターゲット: インターネット・ゲートウェイ<br>宛先: 0.0.0.0/0||
|Oracle Base DB|リスナー|<strong>1521</strong>|プライベート IP: 10.0.1.185|
|Autonomous DB|リスナー|<strong>1522</strong>|プライベート IP: 10.0.1.224|

## 1-2. SQL Developer の準備
この例では、GUI付きの SQL Developer を使います。ダウンロードと設定方法の詳細は、次の記事をご参考ください。SQL Plusの愛用者は、クライアント側にSQL Plusを用意し、このステップを飛ばしてください。

https://qiita.com/liu-wei/items/08f2e2f6d90c08549cbf

## 1-3. ADB Wallet のダウンロード
Autonomous DBに接続するのに、デフォルトはWalletを使います。OCIコンソールよりWalletファイル(zip)をダウンロードして（詳細を省略）、クライアント側に保存します（<strong>解凍不要</strong>）。ダウンロード方法について、[こちら](https://docs.oracle.com/ja-jp/iaas/autonomous-database/doc/connect-dedicated-adb.html)のドキュメントをご参照ください。

__注意__
プライベート サブネットの Autonomous DB に接続する時、ウォレット・ファイルを使用するかどうかを選択できます。 ウォレットを使用したくない場合は、(OCI コンソールから) <strong>mTLS 認証を無効</strong>にしておいてください（通常のユーザ・パスワード認証となる）。

# 2. NLBの作成
ネットワーキング → ロード・バランサ → ロード・バランサの作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/cceed7b9-22f0-7adf-ff88-5479daff21c4.png", width="650">

__タイプの選択__
<font color=blue>レイヤー４</font>の"ネットワーク・ロード・バランサ"を選択し、進んでください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/548155a3-b535-f68b-53b5-f4d93b40beee.png", width="600">
__詳細情報の追加__
NLBの名前：適当な名前を入力
可視性タイプ：<font color=blue>パブリック</font> (デフォルト)
パブリックIPの割当て：エフェメラル IPv4 (デフォルト)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/08de6d09-95d0-4a2e-c0a3-f2bdec7149e2.png)

VCNとパブリック・サブネットを指定し、次へをクリックします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/07f99f2c-315a-cdac-b7bb-9327a4537788.png)

__リスナーの構成__
リスナー名前：適当な名前を入力
トラフィックのタイプ：<font color=blue>TCP</font>
イングレス・トラフィック・ポート：デフォルトは、「任意のポートを使用」となっているが、この例では、Oracle DB リスナーのポート(<font color=blue>1521</font>)を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/4920959d-6410-8b22-e63f-edda99a480a4.png)

__バックエンドの選択__
ここは<strong>重要</strong>でご注意ください。
- "Add backends (バックエンドの追加)"：NLBを新規作成する際、バックエンドの選択肢は<font color=blue>Computeインスタンス</font>のみです。DBインスタンスをバックエンドに使用したい場合は、NLBを作成した後にバックエンドの編集が必要です。そのため、ここで一旦バックエンド・セット名を入力するだけでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/40a77683-7950-91be-bab1-765ca6a5fd7f.png)
 - "<font color=blue>Preserve source IP (ソースIPの保持)</font>"：デフォルトはチェックしているので、そのままでOKです。ただ、IPアドレスでバックエンドを追加すると、「ソースIPの保持」がOFFになりますので、ご注意ください。

ヘルス・チェック・ポリシーの部分で、<font color=blue>TCP</font>プロトコルを指定し、次へをクリックします（ポート<font color=blue>1521</font>は、オプションです）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/eacea76e-5c28-6fef-50d0-da0c3c4dbd4f.png)

__確認および作成__
情報を確認した後、作成ボタンをクリックし、作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2eaa3397-0b20-0e20-61f3-92dc36ef036e.png)

__作成後__
ロード・バランサの状態は、"<font color=blue>ACTIVE</font>"になったら、ヘルス・チェックは「<font color=blue>OK</font>」であることを確認してください。次のステップではNLBの<strong>パブリックIP</strong>を使用しますので、メモしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c8b1db98-c7c8-4ce2-1fbf-da092fa12cf9.png)

# 3. Oracle Base DB に接続する
## 3-1. Oracle Base DB 用バックエンドの追加
ネットワーキング -> ロード・バランサ -> ロード・バランサ詳細 -> バックエンド・セット (BackendSet01)

「バックエンドの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2917c719-ac0c-b8d2-635a-25f4bda8b49f.png)

次のように情報を入力し、追加ボタンをクリックします。
タイプ：IPアドレスを指定
IPアドレス：DBインスタンスのプライベートIP
ポート：1521
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/32eca02b-a295-c255-e306-9d9be98c764e.png", width="550">
NLBの更新には約 1 分かかります。更新後の状態は、次のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/4772a6da-629c-3bea-2a6d-a4339ab37d57.png)

## 3-2. SQL Developerで Oracle Base DB に接続
* 接続を新規作成
<strong>Database Type</strong>: デフォルト(Oracle)を指定
<strong>Hostname</strong>: <font color=blue>NLBのパブリックIP</font>を入力。
<strong>Port</strong>: 1521 (デフォルト)
<strong>SID、Service Name</strong>: 片方を入力（PDBへ接続したい場合、PDBのサービス名を入力)。
<strong>Save Password</strong>: チェックしたら、次回接続の時、パスワードの入力が省略できます。
「<font color="blue">テスト</font>」ボタンを押し、接続をテストします。接続成功を確認したら、「<font color="blue">接続</font>」ボタンを押し、接続を立てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9c0aaafd-bac2-199d-c1d9-fa07d48465f0.png)
サービス名の確認方法は、以下の記事をご参考ください。
[Oracle Base DBのサービス名を取得する](https://qiita.com/liu-wei/items/ecab5bc23efd13410dac)

* 接続後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ffeebf6b-eb6c-5a12-1e70-d880a483872e.png)

# 4. Autonomous DB に接続する
## 4-1. Autonomous DB 用バックエンドの追加
__1. バックエンド・セットの追加作成__
ネットワーキング → ロード・バランサ → ロード・バランサ詳細 → バックエンド・セット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/732df360-72a7-0bd2-f17e-3a4d6d1a7e14.png)

バックエンド・セット名を適当に入力し、ヘルス・チェック・ポリシーの部分に、<font color=blue>TCP</font>プロトコルを指定し、作成ボタンをクリックしします。（ポート<font color=blue>1522</font>は、オプションです）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/bef3a2e5-59c5-0169-6767-6b6e6008ca9f.png", width="500">

__2. バックエンドの追加__
作成されたバックエンド・セット（`BackendSet02`）をクリックし、詳細画面に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f4f5f032-04c6-8eb1-84d9-afc45660fb4a.png)
「バックエンドの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2529a6b1-d4e1-1fd4-a292-d9d6fad14b9c.png)
次のように、情報を入力し、追加ボタンをクリックします。
タイプ：IPアドレスに指定
IPアドレス：Autonomous DB のプライベートIP
ポート：<font color=blue>1522</font>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5ab02a4b-0049-3202-31d8-1f641939551a.png", width="500">

追加後、次のように確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/4d31ed93-f8ca-ed54-0b71-a26bb44fda78.png)
__3. リスナーの追加__
Networking → Load Balancers → Load Balancer Details → Listeners -> Create Listener 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/69f2f2a2-5b73-fe20-280a-9486a601c438.png)
リスナーの名前：適当な名前を入力
プロトコル：<font color=blue>TCP</font>
イングレス・トラフィック・ポート：<font color=blue>1522</font>を指定
バックエンド・セット：追加した`BackendSet02`を指定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/daa18640-5bd0-c294-e88b-572005d65935.png", width="350">
追加後、次のように確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e0b79e35-3694-c69e-1234-005dc73a490d.png", width="600">

## 4-2. ホストファイルの編集
WalletファイルでADBに接続する場合、Walletに記載しているホスト名は、「プライベート・エンドポイントURL」で、VCN外部から識別できません。そのURLを識別するため、ローカルのホストファイルに、次のように<strong>一行を追加</strong>します。

__ホストファイル__
Windows OS: `C:\Windows\System32\drivers\etc\hosts`
Linux OS: `/etc/hosts`

__追加内容__
`<NLB_Public_IP> <ADB_Private_Endpoint_URL>`

例：`xxx.xxx.42.221 xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com`

追加後、OSの再起動は<strong>不要</strong>です。

以下のADBの詳細情報画面から、プライベート・エンドポイントを確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7044da33-d529-c918-ed54-89142f5d5157.png", width="400">


## 4-3. SQL Developerで Autonomous DB に接続
* 接続を新規作成
<strong>Database Type</strong>: デフォルトのOracleを指定
<strong>Connection Type</strong>: <font color=blue>Cloud Wallet</font>を指定
<strong>Configuration File</strong>: Walletファイルを指定。事前にOCIコンソールよりダウンロードしてください。ダウンロード後、解凍不要でZIPファイルのままでOKです。
<strong>Service</strong>: 必要に応じて、XXXX_high, XXXX_medium, XXXX_lowの選択肢から指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2b489a68-9b1f-fe73-b014-fd4927941a11.png)

* 接続後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/488b1a2f-a5d7-75cd-89aa-ce3dd346e172.png)

# 5. 接続の一時停止
NLB自体と関連設定を保留し、NLBからの接続を一時停止したい場合、バックエンドを<strong>オフライン</strong>にすればOKです。必要に応じて、再度<strong>オンラインに切り替え</strong>ればいいです。

バックエンドを選択し、"Edit"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1c8c3b2b-437d-6a63-a5ee-cef4ab8b3321.png)

"Offline"を"True"にして、「変更の保存」をクリックします（完了まで約1分間がかかる）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8262ae15-b7d2-ffbb-6237-c2c3ce0f02b2.png", width="350">

変更後は以下のようです。ヘルスチェックはOKですが、クライアントからの接続ができなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/dab2149c-52bf-65ae-ce5f-a6952ebb1b77.png)


# サマリー
ここまで、一つのNLBを経由し、Oracle Base DB と Autonomous DB の２つインスタンスに接続できました。設定方法は簡単で、<stroong>管理者の一時作業</strong>に向きます。セキュリティ・リスト(or NSG)で、ソース側のIPアドレスを絞り込み、NLBのリスナー・ポート(<font color=blue>1521, 1522</font>)を限定するのを推奨します。

__設定ポイント__
- Oracle DB と ADB <strong>共通</strong>（２点）：
  - NLB<strong>作成後</strong>、DBインスタンスをバックエンドに追加可能（<strong>プライベートIP</strong>を指定）。
  - IPアドレスでバックエンドを追加する時、「ソースIPの保持」が利用できない。
- <strong>Autonomous DB 特有</strong>（１点）：
  - Autonomous DB へ接続する前、ローカルのホストファイルを編集し、NLBのパブリックIPとプライベート・エンドポイントURLの対応関係を紐付ける。

# 追記

追記日: 2023/07/12

上記の検証例では、NLBを作成した際に「ソースIPの保持」を選択していました。現在の仕様に基づき、バックエンドを追加する際には、「ソースIPの保持」のチェックを外さないと、IPアドレスを指定することができません。したがって、NLBを作成した際に「ソースIPの保持」のチェックを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/dae2926b-2df8-3684-ae18-23f87e46cd11.png)

以上です。

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[OCI ロードバランサとOCI NLBの比較](https://qiita.com/liu-wei/items/d2d1f1f9b882bb99cee6)
[SQL Developerで様々なDBに接続する方法](https://qiita.com/liu-wei/items/08f2e2f6d90c08549cbf)
[ネットワーク・ロード・バランサ (NLB) の経由でプライベート・サブネット内の OCI VMに接続する](https://qiita.com/liu-wei/items/d4144794ef1a8692580c)