OCI Cloud Shell からプライベート・サブネット内のインスタンスに接続する

__初めに__
冒頭ですが、この記事の位置付けは、次のシリーズ記事の1つです。
シリーズ１：[プライベート・サブネット内の OCI Compute に接続](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98#3-%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E5%86%85%E3%81%AE-oci-compute-%E3%81%AB%E6%8E%A5%E7%B6%9A)
シリーズ２：[プライベート・サブネット内の Oracle DB/ADB に接続](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98#4-%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E5%86%85%E3%81%AE-oracle-dbadb-%E3%81%AB%E6%8E%A5%E7%B6%9A)

2022年8月、Cloud Shellの<strong>プライベート・アクセス</strong>という機能がリリースされました。Cloud Shellから、パブリック・ネットワークを経由せずにプライベート・ネットワークのリソースにアクセスできるになりました。

OCI Compute、Oracel Base DB 及び Autonomous DBを例にして、ターゲット・インスタンスへの接続方法を紹介したいと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/beb3f95a-9095-a911-7756-e77e2375bafd.png", width="650">

メリット：
✅ 踏み台サーバーを立てる必要がないため、コストを節約できます。
✅ パブリックネットワークを経由せずに、プライベートアクセスで接続できます。
✅ 設定が簡単で、シリアルコンソールを使って手軽に接続できるため、管理者の一時作業に便利です。

__目次__

 - [1. 事前準備](#1-事前準備)
 　- [1-1. IAM ポリシーの設定](#1-1-iam-ポリシーの設定)
   - [1-2. 秘密キーのアップロード](#1-2-秘密キーのアップロード)
   - [1-3. ADB Walletのアップロード](#1-3-adb-walletのアップロード)
 - [2. プライベート・ネットワークの設定](#2-プライベートネットワークの設定)
 - [3. ターゲット・インスタンスに接続する](#3-ターゲットインスタンスに接続する)
   - [3-1. Compute インスタンスに接続](#3-1-compute-インスタンスに接続)
   - [3-2. Oracle Base DB に接続](#3-2-oracle-base-db-に接続)
   - [3-3. Autonomous DB に接続](#3-3-autonomous-db-に接続)

# 1. 事前準備
|インスタンス|接続ツール|TCP ポート|備考|
|:--|:--|:--|:--|
|Compute (VM)|SSH|22|秘密キーをアップロード|
|Oracle Base DB (VM)|SQL Plus|1521||
|Autnomous DB|SQL Plus|1522|Walletファイルをアップロード|

※、SQL Plusは、既にCloud Shellに実装済です。
## 1-1. IAM ポリシーの設定
管理者権限付きのユーザは、このステップを飛ばしてもよいです。
他ユーザに対し、次のポリシーを指定する必要があります。
```
allow group <group> to use subnets in compartment <compartment>
allow group <group> to use vnics in compartment <compartment>
allow group <group> to use network-security-groups in compartment <compartment>
allow group <group> to inspect vcns in compartment <compartment>
```

## 1-2. 秘密キーのアップロード
Cloud Shellを起動し、Computeインスタンスへの接続用の秘密キーをアップロードします。(以下のどちらでもOK)
- 歯車アイコン → アップロード (次の画面)
- キーファイルをCloud Shellに "Drag & Drop"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/bb9c4e23-c25f-d737-069c-92486e8f6f82.png)
アップロード先は、ホームディレクトリとなります。アップロード後、ファイルモードを`400`に修正し、秘密キーを`/home/<username>/.ssh`の下に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/52471656-0b34-7336-594a-0a54bb4da28f.png)
## 1-3. ADB Walletのアップロード
OCIコンソールからADB Wallet (Zipファイル) をダウンロードしてください。ダウンロード方法について、[こちら](https://docs.oracle.com/ja-jp/iaas/autonomous-database/doc/download-client-credentials.html)のドキュメントをご参照ください。

__注意点__
ダウンロードする時、<strong>ADBインスタンスと同じのVCNの端末</strong>から実施してください（ADB起動中の状態）。そうでない場合、次のメッセージが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d2c33152-3a43-f70f-ceb2-40cee9f78094.png", width="500">

ダウンロードした後、ローカルのWalletをCloud Shellの画面に"Drag & Drop"だけでOKです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/276af8f1-1f86-159c-b8cb-cb99340bb4c8.png", width="350">
格納用のディレクトリを作成し、Walletファイルを移動します。
<font color="blue">$HOME/network/admin</font>

```bash
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.zip network/admin
liu_wei@cloudshell:~ (ap-tokyo-1)$ 
```

# 2. プライベート・ネットワークの設定
ネットワークのタイプは「<strong>プライベート</strong>」と選択します。（デフォルトは、パブリックとなる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f484d74a-7d9a-3fe8-17b0-d34a7bfa749e.png)
プライベート・ネットワークを設定した時、注意事項があります。VCNのピアリングを使用しない限り、<font color=blue>ホーム・リージョン内部</font>のみのVCN、サブネット及びNSGは選択可能です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/fb79395d-da16-eede-18de-e284a75fdacb.png", width="500">

接続先のVCNがリストされない場合、他リージョン内になる可能性がありますので、必要によりVCN間のピアリングを作ってください。

正しくリストされた場合、接続先のVCNとサブネット内を指定し、接続ボタンをクリックします。（NSGの指定はオプションです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/bd7797fe-c6de-ef05-7282-b8085cf18406.png)

# 3. ターゲット・インスタンスに接続する
## 3-1. Compute インスタンスに接続
<font color=blue>プライベートIP</font>でComputeインスタンスに接続します。
コマンド例：`ssh -i <private_key> opc@<private_ip>`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/beb37c06-6ebd-c5f4-05e5-871c3649c9e8.png)
## 3-2. Oracle Base DB に接続
接続コマンド：`sqlplus <User>/<Password>@<Hostname_or_IP>:<Port>/<Service_Name>`

systemユーザでPDBに接続する例：
`sqlplus system/<password>@10.0.0.164:1521/db19c_pdb1.pirvatesubnet1.vcn1.oraclevcn.com`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/87f55722-fadb-04ca-8b27-65a825052717.png)

Oracle Base DBインスタンスにもSSHログインできます。ログイン方法は、上記のComputeと同じです。事前に秘密キーのアップロードは必要です。

## 3-3. Autonomous DB に接続
__1) 圧縮のWalletファイルを解凍__
```bash
liu_wei@cloudshell:admin (ap-tokyo-1)$ pwd
/home/liu_wei/network/admin
liu_wei@cloudshell:admin (ap-tokyo-1)$ unzip wallet.zip 
Archive:  wallet.zip
  inflating: ewallet.pem             
  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 76
-rw-r--r--. 1 liu_wei oci  6701 Jan 22 12:25 cwallet.sso
-rw-r--r--. 1 liu_wei oci  6656 Jan 22 12:25 ewallet.p12
-rw-r--r--. 1 liu_wei oci  7475 Jan 22 12:25 ewallet.pem
-rw-r--r--. 1 liu_wei oci  3193 Jan 22 12:25 keystore.jks
-rw-r--r--. 1 liu_wei oci   691 Jan 22 12:25 ojdbc.properties
-rw-r--r--. 1 liu_wei oci  2973 Jan 22 12:25 README
-rw-r--r--. 1 liu_wei oci   114 Jan 22 12:25 sqlnet.ora
-rw-r--r--. 1 liu_wei oci   819 Jan 22 12:25 tnsnames.ora
-rw-r--r--. 1 liu_wei oci  3378 Jan 22 12:25 truststore.jks
-rw-r--r--. 1 liu_wei oci 26470 Jan 22 13:09 wallet.zip
liu_wei@cloudshell:admin (ap-tokyo-1)$ 
```

__2) 環境変数"ORACLE_HOME"を設定__
```bash
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を設定せず接続する時、以下のエラーが出ますので、ご<font color="blue">注意</font>ください。
ORA-12154: TNS:could not resolve the connect identifier specified

<font color=blue>ヒント</font>: <strong>$HOME/.bashrc</strong>に、`export ORACLE_HOME=<path_name>`を追加すれば、Cloud Shellに再接続した後、環境変数を再定義しなくてよいです。

__3) sqlnet.oraを編集__
以下の行を編集し、Walletの保存先を置き換えます。
<font color=Magenta>編集前</font>：
```bash
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="?/network/admin")))
```
<font color=blue>編集後</font>：
```bash
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="$ORACLE_HOME/network/admin")))
```

__4) tnsnames.oraの情報を確認__
tnsnames.oraから、接続用のサービス情報を確認します。通常以下のように、３つのサービスが表示されます。
`<Database_Name>_high`, `<Database_Name>_medium`, `<Database_Name>_low`

__5) ADBに接続する__
コマンド：`sqlplus <User>/<Password>@<Service_Name>`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/17d348ea-3a19-b26b-139a-b27923a52a73.png)


Cloud Shell から<strong>パブリック</strong>の Autonomous DB にアクセスしたい場合、上記の手順も適用できます。詳細は以前書いた記事をご参考ください。この記事には、OCI Bastionを経由し、プライベートのADBに接続する方法も書いています。その時、まだCloud Shellのプライベート・アクセス機能がリリースされませんでした。プライベート・アクセスのおかげで、OCI Bastionの設定もう要らなくて、接続はより簡単になりました。

https://qiita.com/liu-wei/items/38b968cee3a9619c63e5

以上

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[OCI Cloud Shellの概要](https://qiita.com/liu-wei/items/d11aea8865accddbfd90)
[OCI Cloud Shell上のSQL PlusからAutonomous DBに接続する](https://qiita.com/liu-wei/items/38b968cee3a9619c63e5)
[プライベート・サブネット内のOCI Computeインスタンスに接続する方法のまとめ](https://qiita.com/liu-wei/items/e0376fd71433d243bce0)

----
__ドキュメント__
[クラウド・シェルのプライベート・アクセス](https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/cloudshellintro.htm#Cloud_Shell_Private_Access)
[OCI Cloud Shell - FAQ on Using Private Subnets (Doc ID 2883399.1)](https://support.oracle.com/knowledge/Oracle%20Cloud/2883399_1.html) （英語）
よく聞かれる質問をカバーしています。内容を見るには、オラクル・アカウントは必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2e370be1-ece3-445f-8628-3fef2ecacde7.png)