OCI「プライベートエンドポイントアクセスのみ」で作成したAutonomous Databaseにインターネット経由で接続する方法（コンピュートインスタンス経由でADBに接続）

## はじめに
こんにちは。NTTデータ先端技術の@EumJinmanです。
本記事は、Oracle Cloud Infrastructure（OCI）「プライベートエンドポイントアクセスのみ」で作成したAutonomous Database（ADB）にインターネット経由で接続する方法の１つとして<b>方法その1 : コンピュートインスタンス経由でADBに接続</b>を紹介します。

その他接続方法や、全体の概要については以下のリンクをご確認ください。

全体の概要：[全体の概要](https://qiita.com/EumJinman/items/e9e63b5804e8634e0543)

方法その2：[ネットワークロードバランサー（NLB）経由でADBに接続](https://qiita.com/EumJinman/items/905bfab0551eac91c560)

方法その3：[Bastionサーバ経由でADBに接続](https://qiita.com/EumJinman/items/cf427aa588b8540ff9c3)

## 目次
1. 概要及び、構成
2. 環境情報
3. 前提条件
4. コンピュートインスタンスでの設定及び、ADBへの接続
    4-1. Walletのダウンロード
    4-2. コンピュートインスタンスへの接続
    4-3. Oracle Instant Clientのインストール及び、設定
    4-4. Walletの配置及び、設定
    4-5. 接続確認
5. まとめ

## 1. 概要及び、構成
![構成図インスタンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/eab896ed-80ea-4f84-9700-31366d0d62c0.png)
OCIのコンピュートインスタンス（仮想マシン）を踏み台として利用し、そのインスタンスからADBに接続する方法です。<b>シンプルな構成で設定は簡単ですが、コンピュートインスタンスの管理・運用や、インスタンスの使用料金が必要になります。</b>

## 2. 環境情報
#### クライアント環境
OS：Windows 10
接続ツール：TeraTerm

#### OCI環境
リージョン：ap-northeast-1（アジアパシフィック (東京)）

#### コンピュートインスタンス情報
OSイメージ：Oracle-Linux-8.10-2024.11.30-0
シェイプ：VM.Standard.E2.1

#### ADBの情報
ワークロード・タイプ：Oracle Autonomous JSON Databases
データベースのバージョン：19c
アクセスタイプ：プライベートエンドポイント


## 3. 前提条件
#### クライアント環境
①シェル・ターミナル・コンソールがセットアップされていること
②クライアント環境からインスタンスにSSH接続できること

#### OCI環境
①インスタンスが作成されていること
②ADBが作成されていること
③パブリックサブネットのセキュリティリストにクライアント環境からインスタンスに接続するための適切なイングレスルールが設定されていること。（例:SSHポート22など）
④パブリックサブネットのセキュリティリストにインスタンスからインターネットに接続するための適切なエグレスルールが設定されていること
⑤パブリックサブネットのルート表にインスタンスからインターネットに接続するための適切なルールが設定されていること
⑥プライベートサブネットのセキュリティリストにインスタンスからADBに接続するための適切なイングレスルールが設定されていること。（例:ADBポート1522など）

## 4. コンピュートインスタンスでの設定及び、ADBへの接続
### 4-1. Walletのダウンロード
コンピュートインスタンスからADBに安全に接続するためにWalletを使用します。

WalletをダウンロードするためにOCIコンソールページ左上から「ナビゲーション・メニュー」→「Oracle Database」→「Autonomous Database」順にクリックし、Autonomous Databaseページに移動します。
![スクリーンショット (58).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/fa63c5e4-f69f-430d-bb7c-c1e404f81ab9.png)

Autonomous Databaseページから対象のADBをクリックし、ADB詳細ページに移動します。
![スクリーンショット (59).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/c2743294-4bf6-42b0-a9ac-49fe845948ad.png)

ADB詳細ページから「データベース接続」をクリックし、データベース接続ページに移動します。
![スクリーンショット (60).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/45bb42a6-173c-4956-832e-d9ea43294a63.png)

データベース接続ページからウォレット・タイプを「インスタンス・ウォレット」に選択し、「ウォレットのダウンロード」をクリックします。
![スクリーンショット (61).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/247eea82-c5f0-4fdb-9733-8c6033555761.png)

ウォレットのダウンロードページからウォレットのパスワードを入力し、「ダウンロード」をクリックします。入力するパスワードはパスワード要件を確認してから入力してください。
※パスワード要件は以下の通りです。
<b>パスワードは8文字から60文字とし、英字と数字をそれぞれ1つ以上含める必要があります。</b>
![スクリーンショット (63).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/f5741af9-d502-4ee8-80d3-e402d2be153d.png)

### 4-2. コンピュートインスタンスへの接続
クライアント環境から踏み台となるコンピュートインスタンスに接続します。
※今回は、接続ツールとしてTera Termを使用しています。

クライアント環境のデスクトップからTera Termを開き、「Tera Term:新しい接続」画面から以下の情報を入力し「OK」をクリックします。

・ホスト：コンピュートインスタンスのパブリックIPアドレス
・サービス：SSH
・TCPポート：22

次、「SSH認証」画面から以下の情報を入力し「OK」をクリックします。

・ユーザ名：opc
・認証方式：RSA/DSA/ECDSA/ED25519鍵を使う
・機密鍵：コンピュートインスタンスのSSH機密鍵
<b>※opcユーザは、コンピュートインスタンス作成時にデフォルトで作成される初期管理ユーザーです。</b>

### 4-3. Oracle Instant Clientのインストール及び、設定
#### 4-3-1. Oracle Instant Clientのインストール
コンピュートインスタンスからADBへ接続する際に接続ツールとして<b>SQL*Plus</b>を使用します。そのために必要な<b>Oracle Instant Clientパッケージ</b>をインストールします。

Oracle Linuxリリース・パッケージをインストールし、Oracle Instant Clientのリポジトリ定義を構成します。
```:実行コマンド
dnf install -y oracle-instantclient-release-el8
```

Oracle Instant Clientパッケージをインストールします。
※パッケージインストールの際に<b>低メモリ環境ではメモリ不足が原因でインストールが失敗</b>することもあるため注意が必要です。（VM.Standard.E2.1.Microシェイプで失敗）

```:実行コマンド
dnf install -y oracle-instantclient-basic
```

SQL*PlusのOracle Instant Clientパッケージをインストールします。
```:実行コマンド
dnf install -y oracle-instantclient-sqlplus
```

#### 4-3-2. Oracle Instant Clientの設定
Oracle Instant Client をインストールした後、適切に動作させるために環境変数を設定します。
<b>※システム全体で適応するため/etc/profileに環境変数を設定</b>していますが、個々のユーザで適応するため~/.bashrcに設定することも可能です。

```:実行コマンド
echo "export ORACLE_HOME=/usr/lib/oracle/21/client64/lib" >> /etc/profile
echo "export NLS_LANG=Japanese_Japan.AL32UTF8" >> /etc/profile
echo "export LD_LIBRARY_PATH=\$ORACLE_HOME:\$LD_LIBRARY_PATH" >> /etc/profile
source /etc/profile
```

### 4-4. Walletの配置及び、設定
コンピュートインスタンスからSQL*PlusでADBに接続するためにWalletを設定する必要があります。4-1でダウンロードしたWalletをコンピュートインスタンスに配置、設定します。

#### 4-4-1. Walletの配置
WinSCPを使用し、Walletを配置します。

クライアント環境のデスクトップからWinSCPを開き、「ログイン」画面から以下の情報を入力し「OK」をクリックします。

・ホスト：コンピュートインスタンスのパブリックIPアドレス
・ポート番号：22
・ユーザ名：opc
・機密鍵：コンピュートインスタンスのSSH機密鍵

※opcユーザは、コンピュートインスタンス作成時にデフォルトで作成される初期管理ユーザーです。
※WinSCPへの接続はPuTTY形式の秘密鍵（.ppk）が必要です。
<b>※機密鍵の設定は以下の手順で選択します。</b>
「設定」→「SSH」→「認証」→「機密鍵」

対象のコンピュートインスタンスに接続成功したら4-1でダウンロードしたWalletを任意の場所（今回は/tmp）にアップロードします。

#### 4-4-2. Walletの設定
コンピュートインスタンスにWalletを設定します。

まず、配置されているWalletを展開します。
※wallet.zipがtmpディレクトリに配置されていることとします。
```:実行コマンド
mkdir -p /home/opc/wallet
unzip -o /tmp/wallet.zip -d /home/opc/wallet
```
ネットワーク設定ファイル（tnsname.ora、sqlnet.oraなど）の場所を指定するための環境変数（TNS_ADMIN）を設定します。
<b>※特定のユーザ(opc)に適応するため~/.bashrcに環境変数を設定</b>していますが、システム全体に適応するため/etc/profileに設定することも可能です。
```:実行コマンド
echo "export TNS_ADMIN=/home/opc/wallet" >> /home/opc/.bashrc
source /home/opc/.bashrc
```

sqlnet.oraからWalletのパスが正しく設定されていることを確認し、必要な場合編集します。
```:実行コマンド
vi /home/opc/wallet/sqlnet.ora
```

以下の通り設定されていることを確認します。
※TNS_ADMIN環境変数には/home/opc/walletが設定されています。
```:実行コマンド
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY=$TNS_ADMIN)))
SSL_SERVER_DN_MATCH=no
```

ADBへの接続に使用する接続文字列を確認します。
※例：<小文字のADB名>_high、<小文字のADB名>_low、<小文字のADB名>_mediumなど
```:実行コマンド
cat /home/opc/wallet/tnsnames.ora
```
<b>接続文字列は、OCIコンソールからも確認できます。</b>
※「ナビゲーション・メニュー」→「Oracle Database」→「Autonomous Database」→「ADB名」→「データベース接続」
![スクリーンショット (64).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/fe15950d-9bbd-41d0-b4f7-3f088ed045df.png)

### 4-5. 接続確認
以下のコマンドを実行し、コンピュートインスタンスからADBに接続します。
※接続文字列として<小文字のADB名>_highを使用していますが、別の接続文字列を使用しても接続可能です。
```:実行コマンド
sqlplus admin/'adminのパスワード'@<小文字のADB名>_high
```

## 5. まとめ
今回は、「プライベートエンドポイントアクセスのみ」で作成したADBにコンピュートインスタンス経由でインタネットから接続する方法について紹介しました。

コンピュートインスタンス経由でADBに接続する方法は、シンプルな構成で設定は簡単ですが、コンピュートインスタンスの管理や、運用が必要なことや、インスタンスの使用料金が発生することに注意してください。