初めに
冒頭ですが、この記事の位置付けは、次のシリーズ記事の1つです。
プライベート・サブネット内の Oracle DB/ADB に接続
OCI Cloud Shellに、SQL Plusのクライアントが実装されていますので、簡単にAutonomous DBに接続できます。今回は、PublicとPrivate ADB両方への接続方法をご紹介します。
検証環境
項目 | 内容 |
---|---|
OCIリージョン | 東京 (他リージョンでもOK) |
ADBタイプ | Data Warehouse (ATPでもOK) |
アクセス・タイプ | 1. パブリック・アクセス経由でADBに接続 (ADW01) |
2. プライベート・エンドポイント経由でADBに接続 (ADW02) |
ちなみに、SQL DeveloperというGUIツールでAutonomous DBに接続したい場合、以下の記事をご参考ください。
SQL Developerで様々なDBに接続する方法
1. パブリック・アクセス経由でADBに接続
アクセス・タイプはパブリック経由の場合、Cloud Shellからの接続はとても簡単です。
ステップ
1-1. OCIコンソールよりADB Walletを取得
1-2. ADB WalletをOCI Cloud Shellにアップロード
1-3. 環境変数の設定とsqlnet.oraの編集
1-4. ADBに接続する
1-1. OCIコンソールよりADB Walletを取得
ADBの情報詳細画面より、"DB Connection"をクリックします。
パスワードを作成し、ダウンロードを開始します。
(このパスワードはWallet専用で、ADB作成時の管理者パスワードとは関係ありません。)
ダウンロードしたADB Walletは、圧縮ファイルです。(wallet_<ADB_Name>.zipのような形式)
1-2. ADB WalletをOCI Cloud Shellにアップロード
2021/3/23、OCI Cloud Shellのファイル転送機能がリリースされました。
ロカールとCloud Shellの間に、簡単にファイルの転送ができるようになりました。
Cloud Shellにログインし、ローカルのWalletファイルをCloud Shellの画面に"Drag & Drop"だけでOKです。
格納用のディレクトリを作成し、Walletファイルを移動します。
$HOME/network/admin
liu_wei@cloudshell:~ (ap-tokyo-1)$ pwd
/home/liu_wei
liu_wei@cloudshell:~ (ap-tokyo-1)$ mkdir -p network/admin
liu_wei@cloudshell:~ (ap-tokyo-1)$ mv wallet_ADW01.zip network/admin
liu_wei@cloudshell:~ (ap-tokyo-1)$
圧縮のWalletファイルを解凍
liu_wei@cloudshell:admin (ap-tokyo-1)$ pwd
/home/liu_wei/network/admin
liu_wei@cloudshell:admin (ap-tokyo-1)$ unzip wallet_ADW01.zip
Archive: wallet_ADW01.zip
inflating: README
inflating: cwallet.sso
inflating: tnsnames.ora
inflating: truststore.jks
inflating: ojdbc.properties
inflating: sqlnet.ora
inflating: ewallet.p12
inflating: keystore.jks
liu_wei@cloudshell:admin (ap-tokyo-1)$ ll
total 64
-rw-r--r--. 1 liu_wei oci 6725 Apr 2 07:58 cwallet.sso
-rw-r--r--. 1 liu_wei oci 6680 Apr 2 07:58 ewallet.p12
-rw-r--r--. 1 liu_wei oci 3274 Apr 2 07:58 keystore.jks
-rw-r--r--. 1 liu_wei oci 691 Apr 2 07:58 ojdbc.properties
-rw-r--r--. 1 liu_wei oci 317 Apr 2 07:58 README
-rw-r--r--. 1 liu_wei oci 114 Apr 2 07:58 sqlnet.ora
-rw-r--r--. 1 liu_wei oci 1064 Apr 2 07:58 tnsnames.ora
-rw-r--r--. 1 liu_wei oci 3335 Apr 2 07:58 truststore.jks
-rw-r--r--. 1 liu_wei oci 20500 Apr 2 09:46 wallet_ADW01.zip
liu_wei@cloudshell:admin (ap-tokyo-1)$
1-3. 環境変数の設定とsqlnet.oraの編集
環境変数"ORACLE_HOME"を設定
liu_wei@cloudshell:admin (ap-tokyo-1)$ export ORACLE_HOME=/home/liu_wei
liu_wei@cloudshell:admin (ap-tokyo-1)$ echo $ORACLE_HOME
/home/liu_wei
liu_wei@cloudshell:admin (ap-tokyo-1)$
ORACLE_HOMEを設定しなければ、以下のエラーが出ますので、ご注意ください。
ORA-12154: TNS:could not resolve the connect identifier specified
ヒント: $HOME/.bashrcに、export ORACLE_HOME=<path_name>
を追加すれば、Cloud Shellに再接続した後、環境変数を再定義しなくてよいです。
sqlnet.oraを編集
以下の行を編集し、Walletの保存先を置き換えます。
編集前:
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="?/network/admin")))
編集後:
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="$ORACLE_HOME/network/admin")))
tnsnames.oraの情報を確認
tnsnames.oraから、接続用のサービス情報を確認します。
通常以下のように、表示されます。(dbname_high, dbname_medium, dbname_low)
1-4. ADBに接続する
コマンド:sqlplus <ユーザ名>/<パスワード>@<サービス名>
サービス名は、tnsnames.oraより確認できます。
liu_wei@cloudshell:admin (ap-tokyo-1)$ sqlplus admin@adw01_high
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 2 09:53:54 2021
Version 19.10.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.5.0.0.0
SQL>
2. プライベート・エンドポイント経由でADBに接続
プライベート・サブネットにADBを作成した場合、プライベート・エンドポイントを介してADBにアクセスする必要があります。Cloud Shellから直接にアクセスすることはできませんので、BastionとSSHポート転送は必要です。
OCI Bastion Serviceは2021年5月にリリースされました。それを利用し、踏み台サーバ(VM)を作成せずに、プライベート・サブネット内のリソースにアクセスできます。サービス自体は無料です。これから、OCI Bastionを使用してCloud ShellからプライベートADBにアクセスする方法を紹介します。
追記 (2022年12月)
OCI Bastionでの接続方法を投稿した時点(2022年5月)、Cloud Shellのプライベート・アクセス機能がまだリリースされませんでした。2022年8月より、Cloud Shellからプライベート・アクセス経由で、プライベート・サブネット内のリソースに接続できるようになりましたので、OCI Bastionを使わなくてもOKです。設定方法は、「OCI Cloud Shell からプライベート・サブネット内のインスタンスに接続する」をご参考ください。
ステップ
2-1. 事前準備
2-2. Bastionの作成
2-3. NSGにIngressルールを追加する
2-4. tnsnames.oraを編集する
2-5. SSH秘密キーをCloud Shellにアップロード
2-6. Cloud ShellでSSHコマンドを実行する
2-7. ADBに接続する
2-1. 事前準備
ADB Walletをダウンロードし、Cloud Shellにアップロード
「パブリック・アクセス」と同じです。 Step 1-1 と Step 1-2をご参照ください。
環境変数「ORACLE_HOME」の設定とsqlnet.oraの編集
「パブリック・アクセス」と同じです。 Step 1-3をご参照ください。
ADBの「プライベート・エンドポイントIP」を確認
ADBの詳細ページから、「プライベート・エンドポイントIP」を取得できます。
2-2. Bastionの作成
Identity & Security -> Bastion -> Create Bastion
Bastion名を入力し、ターゲットVCNとサブネットを選択してから、CIDRブロック許可リストを入力します。
注意
このテストには「0.0.0.0/0」を使用しています。通常なら、CIDRブロックの許可リストを絞り込んだほうがよいです。例えば、 接続元のIPアドレス範囲のみを許可します。
Cloud ShellのパブリックIPを「CIDRブロック許可リスト」に追加するのは可能です。 Cloud Shellでcurl ipinfo.io
を実行すると、IPアドレスを取得できます。
Bastionはアクティブの状態になりましたら、「プライベート・エンドポイントIP」は以下の画面から確認できます。このIPが、ターゲット・サブネット内で自動割り当てられます。次のステップでこのIPをNSGの入力ルールに追加します。 「CIDRブロック許可リスト」を編集したい場合は、「編集」ボタンをクリックすればOKです。
セッションの作成
Bastion -> Sessions -> Create session
項目 | 内容 |
---|---|
セッション・タイプ | "SSH port forwarding session"を選択 |
ターゲット・ホストに接続する方法 | "IPアドレス"を選択 (デフォルト) |
IPアドレス | ADBの「プライベート・エンドポイントIP」 |
ポート | 1522 |
SSHキー | 既存のキーファイルを利用するか、新しいキーペアを生成する。 |
セッションはアクティブの状態になりましたら、次のように、3ドットのメニューをクリックしてSSHコマンドをコピーします。このコマンドは、STEP 2-6で使用されます。
デフォルトでは、セッションは3時間有効です。Bastionを作成する時に変更できます。
2-3. NSGにIngressルールを追加する
プライベートADBを作成する時、ネットワーク・セキュリティ・グループ(NSG)がアタッチされます。ADBにアクセスするため、TCPポート1522を入力ルールに追加するのは必要です。
まだ行っていない場合は、次のようにルールを追加してください。"Source CIDR"は、Bastionの「プライベート・エンドポイントIP」です(Bastionの情報ページに表示されます)。
2-4. tnsnames.oraを編集する
ファイルtnsnames.ora
に記載されているホスト名は、ADBの「プライベート・エンドポイントURL」です。 BastionサービスのSSHポート転送を使用するため、ローカル(Cloud Shell)からADBへのSSHトンネルをSTEP 2-6で作成します。それで、ホスト名をlocalhostに変更する必要があります。
項目 | 内容 |
---|---|
ファイル | $ORACLE_HOME/network/admin/tnsnames.ora |
編集前 | host=<Private Endpoint URL> 例: host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com
|
編集後 | host=localhost |
2-5. SSH秘密キーをCloud Shellにアップロード
Cloud Shellにログインし、ローカルのSSH秘密キーをCloud Shellの画面に"Drag & Drop"だけでOKです。Walletのアップロードと同じ方法です。ファイル転送はまもなく完了します。
秘密キーを$HOME/.ssh
の下に保存することをお勧めします (存在しない場合は作成しておいでください)。デフォルトのファイル・モードは644です。 400(または600)に変更します。
liu_wei@cloudshell:.ssh (ap-tokyo-1)$ chmod 400 id_rsa
liu_wei@cloudshell:.ssh (ap-tokyo-1)$ ll id_rsa
-r--------. 1 liu_wei oci 1819 Apr 15 11:52 id_rsa
liu_wei@cloudshell:.ssh (ap-tokyo-1)$
2-6. Cloud ShellでSSHコマンドを実行する
SSHコマンド:
ssh -i <privateKey> -N -L <localPort>:<Private_IP_of_ADB>:1522 -p 22 <bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com
-
<privateKey>
を秘密キーのパスとファイル名に置き換えます。 -
<localPort>
を1522に置き換えます。 -
<Private_IP_of_ADB>
は自動に実のIPが埋められるので、変更する必要はありません。
ヒント:
- バック・グラウンドで実行するには、最後に
&
を追加します。 - コマンド結果に次のメッセージが表示される場合があります。無視して構いません。これを抑制したい場合は、
-4
パラメータを追加してください。-4
の意味は、IPv4アドレスのみを使用するようにします。
bind: Cannot assign requested address
liu_wei@cloudshell:admin (ap-tokyo-1)$ ssh -i $HOME/.ssh/id_rsa -N -L 1522:10.0.1.130:1522 -p 22 <bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com -4 &
[1] 1355
FIPS mode initialized
......
liu_wei@cloudshell:admin (ap-tokyo-1)$
2-7. ADBに接続する
コマンド:sqlplus <ユーザ名>/<パスワード>@<サービス名>
liu_wei@cloudshell:admin (ap-tokyo-1)$ sqlplus admin@adw02_high
SQL*Plus: Release 21.0.0.0.0 - Production on Fri Apr 15 11:59:31 2022
Version 21.5.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Enter password:
Last Successful login time: Fri Apr 15 2022 11:59:15 +00:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.15.0.1.0
SQL>
OCI Bastionを経由してCloud ShellからプライベートADBへの接続ができました。お疲れ様です!
以上
関連記事
オラクル・クラウドの個人ブログ一覧
OCI Cloud Shellの概要
OCI Cloud Shell からプライベート・サブネット内のインスタンスに接続する
参考ドキュメント
ADBへの接続