2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCI Cloud Shell上のSQL PlusからADBに接続する

Last updated at Posted at 2021-04-13

初めに
冒頭ですが、この記事の位置付けは、次のシリーズ記事の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"をクリックします。
image.png

パスワードを作成し、ダウンロードを開始します。
(このパスワードは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)
image.png

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-1Step 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です。
image.png

セッションの作成
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の情報ページに表示されます)。

image.png

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

image.png

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への接続

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?