初めに
この記事の位置付けは、次のシリーズ記事の1つです。
| 利用方法 | タイトル | Oracle DBへ | ADBへ |
|---|---|---|---|
| OCI Bastion | OCI Bastionサービスでプライベートサブネット内のOracle DBに接続する方法 | ✅ | - |
| NLB | OCI NLB経由でプライベートサブネット内の Oracle DB (Base DB/ADB) に接続する方法 | ✅ | ✅ |
| OCI DB Tools | OCI データベース・ツールでオラクルDBへの接続方法 | ✅ | ✅ |
| OCI Cloud Shell | OCI Cloud Shell からプライベート・サブネット内のインスタンスに接続する | ✅ | ✅ |
| OCI Cloud Shell | OCI Cloud Shell上のSQL PlusからADBに接続する | - | ✅ |
OCI (Oracle Cloud Infrastructure) のプライベート・サブネットに配置された Autonomous AI Database (ADB)は、セキュリティ上、インターネットからの直接アクセスが遮断されています。オンプレミス環境から接続するには、通常、「踏み台サーバ」の設置かVPNの構築が必要です。
しかし、これらの方法には初期構築や運用管理のコストがかかります。そこで注目したいのが、OCIのネイティブサービスである「Bastion」です。Bastionサービスを使えば、追加のインフラを準備することなく、オンプレミス端末から直接プライベートなDBにセキュアな接続経路を確立できます。しかも、このサービスは無料で利用できます。
本記事では、OCI Bastionサービスを活用した、効率的なデータベース接続方法を紹介します。
検証環境
| 項目 | 内容 | コメント |
|---|---|---|
| ADBタイプ | Data Warehouse | ATPにも適用 |
| Client OS | Windows Server 2019 | |
| DB接続ツール | SQL Developer Ver 21.4 | SQL PlusでもOK |
| SSHソフト | OpenSSH |
1. 事前準備
ADB Walletをダウンロード
OCIコンソールからダウンロードした後(詳細は省略)、それをクライアント側に保存します。
ADBの「プライベート・エンドポイントIP」を確認
ADBの詳細ページから、「プライベート・エンドポイントIP」を取得できます。
2. Bastionの作成
Identity & Security → Bastion → Create Bastion
| 項目 | 内容 |
|---|---|
| Bastion名 | 適当な名前を入力 |
| ターゲットVCNとサブネット | ADBが所属するVCNとサブネットを選択 |
| CIDRブロック許可リスト | このテストではCIDRブロックの許可リストを「0.0.0.0/0」に設定しているが、運用時には範囲を絞り込むことが推奨される。例えば、 接続元(クライアント)のIPアドレスのみを許可するように。 |

- このテストでは、CIDRブロックの許可リストを「0.0.0.0/0」に設定しています。運用時には範囲を絞り込むことが推奨されます。例えば、接続元(クライアント)のIPアドレス範囲のみを許可するのが良いでしょう。
- OCI Bastionを作成する際には、ターゲットのVCNとサブネットを指定する必要がありますが、Bastion自体に対し、配置場所を指定する必要はありません(誤解されることがよくあります)。
Bastionがアクティブの状態になると、「プライベート・エンドポイントIP」は次の画面から確認できます。このIPはターゲット・サブネット内で自動的に割り当てられます。次のステップで、このIPをNSGのイングレス・ルールに追加します。「CIDRブロック許可リスト」を編集したい場合は、「編集」ボタンをクリックすれば大丈夫です。

3. セッションの作成
Bastion → Sessions → Create session
| 項目 | 内容 |
|---|---|
| セッション・タイプ | "SSH port forwarding session"を選択 |
| ターゲット・ホストに接続する方法 | "IPアドレス"を選択 (デフォルト) |
| IPアドレス | 接続先ADBの「プライベートIP」 |
| ポート | 1522 |
| SSHキー | 既存のキーファイルを利用するか、新しいキーペアを作成する。(秘密キーをクライアント側に保存してください) |

セッションはアクティブの状態になりましたら、次のように、3ドットのメニューをクリックしてSSHコマンドをコピーします。このコマンドは、「STEP 6. SSHトンネルの作成」で使用されます。
デフォルトでは、セッションは3時間有効ですが、Bastionを作成する際にはこの期間を変更することが可能です。
4. NSGにイングレス・ルールを追加する
プライベートADBを作成する時、ネットワーク・セキュリティ・グループ(NSG)がアタッチされます。ADBにアクセスするため、TCPポート1522を入力ルールに追加するのは必要です。
まだ行っていない場合は、次のようにルールを追加してください。"Source CIDR"は、Bastionの「プライベート・エンドポイントIP」です(Bastionの情報ページに表示されます)。
5. ADBのホスト名をローカルで識別可能にするため
次の2つの方法があり、どちらもOKです。
方法1. ホストファイルを編集する
接続クライアントに、次のファイルを編集します。
ファイル名
Windows OS: C:\Windows\System32\drivers\etc\hosts
Linux OS: /etc/hosts
追加内容: 127.0.0.1 <プライベート・エンドポイントURL>
例:127.0.0.1 xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com
方法2. tnsnames.oraを編集する
ファイルtnsnames.oraに記載されているホスト名は、ADBの「プライベート・エンドポイントURL」です。 BastionサービスのSSHポート転送を使用するため、ローカル(DBクライアン側)からADBへのSSHトンネルを作成します。それで、ホスト名をlocalhostに変更する必要があります。
以下のようにホスト名を変更してください。
編集前:host=<Private Endpoint URL> 例:host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com
編集後:host=localhost
編集後のイメージは、以下のようです。
以下は、Oracle Linuxでの実施例です(解凍+編集+圧縮)。
[opc@linux8 ~]$ pwd
/home/opc
[opc@linux8 ~]$ mkdir wallet_local
[opc@linux8 ~]$ unzip Wallet_adw02.zip -d ./wallet_local
Archive: Wallet_adw02.zip
inflating: ./wallet_local/README
inflating: ./wallet_local/cwallet.sso
inflating: ./wallet_local/tnsnames.ora
inflating: ./wallet_local/truststore.jks
inflating: ./wallet_local/ojdbc.properties
inflating: ./wallet_local/sqlnet.ora
inflating: ./wallet_local/ewallet.p12
inflating: ./wallet_local/keystore.jks
[opc@linux8 ~]$ cd wallet_local
[opc@linux8 wallet_local]$ sed -i 's/host=[a-z0-9]*.adb.ap-tokyo-1.oraclecloud.com/host=localhost/' tnsnames.ora
[opc@linux8 wallet_local]$ zip Wallet_adw02_local.zip *
adding: cwallet.sso (stored 0%)
adding: ewallet.p12 (stored 0%)
adding: keystore.jks (deflated 13%)
adding: ojdbc.properties (deflated 49%)
adding: README (deflated 56%)
adding: sqlnet.ora (deflated 9%)
adding: tnsnames.ora (deflated 73%)
adding: truststore.jks (deflated 28%)
[opc@linux8 wallet_local]$利用中のリージョンにより、リージョン・コード(ap-tokyo-1)を置き換えてください。
名前を区別するため、Wallet_adw02_local.zipを名付けます。当ディレクトリの全ファイルを一つのZipファイルに圧縮します。圧縮後、接続元のクライアントに転送してください。
6. SSHトンネルの作成
クライアント側でSSHコマンドを実行してトンネルを作成します。この例は、OpenSSHを利用します。まだインストールされていない場合、PowerShellを起動して、以下のコマンドでインストールしてください(管理者ユーザで実行)。
コマンド:Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
PS C:\Windows\system32> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Name : OpenSSH.Client~~~~0.0.1.0
State : Installed
Name : OpenSSH.Server~~~~0.0.1.0
State : Installed
PS C:\Windows\system32>SSHトンネルを作成するコマンド:
ssh -i <privateKey> -N -L <localPort>:<Private_IP_of_ADB>:1522 -p 22 <BastionSession_OCID>@host.bastion.ap-tokyo-1.oci.oraclecloud.com<privateKey>を秘密キーのパスとファイル名に置き換える。
Windowsの例(PowerShell):$home\.ssh\id_rsa<localPort>を1522に置き換える。<Private_IP_of_ADB>は自動に実のIPが埋められるので、変更する必要がない。
PowerShllのコマンド例:
ssh -i $home\.ssh\id_rsa -N -L 1522:10.0.1.130:1522 -p 22 <BastionSession_OCID>@host.bastion.ap-tokyo-1.oci.oraclecloud.com※、接続成功の場合、コマンドプロンプトを返さない。
7. ADBに接続する
- SQL Developerを開き、接続を新規作成
- Database Type: デフォルトのOracleを指定
- Connection Type: Cloud Walletを指定
- Configuration File:(ZIPファイルのままでよい。)
ホストファイルを編集した場合:元のWalletファイルを指定
ホストファイルを編集していない場合:tnsnames.oraを編集したWalletファイルを指定(次のスクリーンショットのように)。 - Service: 必要に応じて、XXXX_high, XXXX_medium, XXXX_lowの選択肢から指定
- 「テスト」ボタンを押し、接続をテストします。接続成功を確認したら、「接続」ボタンを押し、接続を立てます。

- SQL Plusを使いたい場合
クライアント側からSQL Plusを利用しプライベートADBへの接続も可能です。上記ステップ以外、sqlnet.oraの編集も必要です。別のトピックとなりますので、ここで割愛させていただきます。興味のある方は以下の記事をご参照ください。接続元は"OCI Cloud Shell"ですが、作業の流れは同様です。(SQL Plusの場合、tnsnames.oraの修正も必要ですが、最後にWalletファイルの圧縮は不要です。)
OCI Cloud Shell上のSQL PlusからADBに接続する
付録
トラブル・シューティング
ADBへの接続が失敗した場合、以下のような原因は一般的です:
- 無効なユーザーまたはパスワード。
- ユーザー・ロールの指定は間違った。
- ADBインスタンスはまだ起動していない。
- リスナー・ポート(TCP 1522)は、Ingressルールに追加されていない。
- SSHトンネルは未作成か、作成が失敗した。
トンネル作成失敗、或いはタイムアウトの時、以下のメッセージが表示される。Connection to host.bastion.ap-tokyo-1.oci.oraclecloud.com closed by remote host. - tnsnames.oraの編集が間違ったため、TNS名が識別できない。(Linux OSで編集)
- Bastionのセッション期限が切れた(デフォルトは3時間)。
セッション期限が切れた後、SSHトンネルを作成しようとしたら、以下のエラーが発生する。<Bastionsession_OCID>@host.bastion.ap-tokyo-1.oci.oraclecloud.com: Permission denied (publickey) - 対策:セッションを再作成する。
Bastionの制限
| 項目 | 内容 |
|---|---|
| 最大Bastion数 | テナンシ毎に5つ |
| 最大セッション数 | Bastionあたり20セッション |
| セッション存続時間 | 30分~3時間 |
| データ転送制限 | データ転送の制限はありません。 ただし、SSH接続あたりの接続速度は16 Mbpsに制限されます。 |
以上