Oralcle Cloud のDatabase Cloud Serviceに接続してみた（初心者でも分かる！） 


#1. はじめに
  Oracle Cloud Infrastructure(以下、OCI) で利用可能なデータベースサービスであるDatabase Cloud Service(以下、DBCS)にCompute Instance(以下、仮想マシン)から接続してみました。

細かい部分もメモとして残したので、「そんなの知ってるよ！」という方はどんどん飛ばしてお読みいただけると幸いです。躓いた部分も書いてあるので後半は回り道をしている箇所もあります。
　
###必要な環境

  Oracle Cloud Infrastructure(OCI) のアカウント
  Tera Term (手元のPCにインストールして利用)

###構成イメージ
今回はOCI上の踏み台用仮想マシンからプライベート・ネットワーク内に設置したDBCS上のOracle Databaseに接続するまでがゴールです。
接続方法はいろいろありますが、今回は下記2パターンで、DBCS上のOracle Databaseに接続したいと思います。

① DBCS上のOSにSSHでログインした上で、そこからOracle Databaseに接続するパターン
② 踏み台用仮想マシンからSQL*Plusを利用してOracle Database にリモート接続するパターン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/cbcc8c0b-81ec-c664-5d6e-99074061f1c4.png)

(手書きです...)

#2. 事前準備
では早速、OCIのコンソール画面で、必要なリソースをセットアップしていきましょう！
まずは事前準備として、コンパートメント、仮想クラウド・ネットワーク(VCN)を作成していきます。

コンパートメントやVCNに関しては以下に分かりやすくまとまっています。
https://speakerdeck.com/ocise/ociji-shu-zi-liao-jia-xiang-kuraudonetutowaku-vcn-gai-yao

###コンパートメントの作成 (任意)
まずはOCIの特徴の一つと言えるコンパートメントを定義します。
今回は便宜上、ルート・コンパートメントの直下に作成しましたが、要件に応じて柔軟に設定することが可能です。
###仮想クラウド・ネットワーク (VCN) の作成
ここではネットワーク・リソースを定義していきます！
DBCSのシステム作成時にはネットワークの指定が必要となるので先にネットワーク設定を完了させておきましょう。

今回は簡単にネットワーク設定が行えるVCN作成ウィザードで作成します。
OCIにログイン後のトップページにクイックアクションの表示があるので、そこから**ウィザードを使用してネットワークを設定**をクリックします。
その際に、前のステップで作成したコンパートメントを選択しておくと良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/a14db5ff-0d77-950f-606c-0f071fc56059.png)
今回はVPN接続は不要なので、**インターネット接続性を持つVCN**を選択し、**VCNウィザードの起動**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/e82f0240-7d4f-ef40-bca3-b22acdfadecd.png)
まずは**VCN名**を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/d6544360-2adf-918c-c18a-5beaf7e342e0.png)
各サブネットの構成については、今回はデフォルトのまま、**次**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/61210d6b-3ef4-e2a0-4b2b-434feb7b793b.png)

確認画面となり今回作成する項目の確認ができるので、確認後、**作成**をクリックします。

作成後は今回作成したVCNの概要が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/e4172603-4a53-705e-f290-73701cf48f63.png)
以上で、一旦VCNの作成は完了です。

尚、「接続パターン②」のためにはセキュリティ・リストを変更する必要がありますが、そちらについては「接続パターン②」の章にて記載します。
また、VCNは作成後でも構成を変更することは可能です。実際に本番環境で利用する際にはシステムのネットワーク・セキュリティ要件に応じて、サブネットやセキュリティ・リスト等、適切に設定するようにしましょう。

#3. 踏み台用仮想マシンの作成 
次にDBCSに接続するための踏み台となる踏み台用仮想マシンを作成します。今回はOCIのマーケットプレイスにあるOracle Cloud Developer Imageを利用します。このDeveloper Imageは今回利用するSQL*Plusを始め、Oracle Databaseに関連する様々な開発ツールがプリインストールされた踏み台用仮想マシンのイメージであり、インスタンスをプロビジョニングするだけですぐに利用可能です。

OCIのトップメニューから**マーケットプレイス**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/11c2e0af-cdc9-d6b7-8062-9c1e57f012e5.png)
検索窓に 「Oracle Cloud Developer Image」と入力して検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/cce8ac76-84cc-85c5-0834-bf874df42105.png)
Developer Imageが出てくるので**Oracle Cloud Developer Image**をクリックし選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/405a8956-753a-c283-d584-88b8156b9f04.png)
Oracle Cloud Developer Imageの概要↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/56c80d8b-aa8c-b9b2-615f-73f1407568d9.png)
Developer Imageの概要が確認できます。
内容の確認後、この踏み台用仮想マシンを配置するコンパートメント、およびオラクル社標準の条件および規制にチェックを入れて**インスタンスの起動**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/1570ef3c-3af5-1f85-6008-cfc5d0b9a325.png)

インスタンス作成画面でハードウェアやネットワーク,公開鍵等の設定を確認します↑↓
公開鍵は**SSHキー・ペアの生成**というメニューでその場で作成も可能です。
後から別の鍵を渡すことも可能なので、このステップでもし間違えた鍵を渡してもログインできないということはありません。
(↑拡張オプションも設定したい場合は選択すると画面が表示されます。)(今回はオプションはそのままいじらずに作成ボタンを押しました。)

必要項目を入力したら下にある青色の**作成**ボタンを押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/48cf0b4b-83bd-05c2-c64f-b8902b4c5c2b.png)
ちなみに、このインスタンスはAlways Free対象なのでトライアルが終了しても使用可能です。

#4. DBCSの作成
次にDBCSをプライベート・サブネットに作成していきます。
OCIのトップ画面から**ベア・メタル、VMおよびExadata**のメニューを押してDBCSを作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/c5e3fc05-89d5-ac44-8f7c-2746ee95179e.png)
青いボタンの**DBシステムの作成**をクリックして作成画面に移動します。
作成画面で必要項目を入力していきます。料金体系に関連する選択肢があるので気を付けながら操作しましょう。(具体的にはシェイプ、ストレージサイズ、ライセンス体系(ライセンス込みorBYOL)です)
作成したネットワークのプライベート・サブネットにDBCSを配置するため下図のように入力します。準備ができたら**次**ボタンを押しましょう。
認証用の鍵は必須ですがそれに加えて後からでも**DBシステムの詳細**画面から鍵は追加可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/03193b0a-aade-e303-e7fd-1413b09522f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/0e6517de-0128-e6c7-1248-f01f50dd1311.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/e9727472-024f-9dba-69b9-085a74d522dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/98203c50-3506-ceb9-034c-dfb99b91d7e6.png)
次の画面ではデータベースの構成情報を入力します。
パスワード要件の制約は厳しめなので注意しましょう。
(9文字から30文字とし、大文字、小文字、特殊文字および数字をそれぞれ2つ以上含める必要アリ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/ee35d1ce-93dd-8e7e-13fd-a44ccbb1d376.png)
**作成**ボタンを押すとプロビジョニングを開始してくれます。
データベース一覧画面から今作成したデータベースの名前を押すと以下の画面のように状況を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/dd5160f8-571c-2077-5ab7-289cd8cc36b6.png)

作成完了後、プロビジョニングが正常に終了すると使用可能の緑色のアイコンに変わります。プロビジョニング完了後は接続してシステムを使用することが可能になります。

DB Systemに接続するためにプライベートIPアドレスが必要になるのでメモしておきましょう。

#5 データベースへの接続

##接続方法概要
今回はプライベート・サブネット内にあるデータベースへOCI上の踏み台用仮想マシン(踏み台インスタンス)経由でアクセスします。セキュリティの観点からデータベースをパブリック・サブネットに置かない構成にしています。

 複数の接続方法がありますが、今回は下記2パターンの接続を試します。
1.  DBCSのOSからデータベースへ接続するパターン
2. 踏み台用仮想マシンからデータベースへ接続するパターン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/3ffd8031-a316-d8f8-a572-90e8378e68ad.png)
手元から踏み台用仮想マシンに接続する部分は共通です。
①の方法はSSHとSQL*Plusを用いた接続で、②の方法はSQL*Plusを用いた接続です。
SSH接続回りを詳しく知りたい場合はOCIの公式ドキュメントが参考になります。
https://docs.cloud.oracle.com/ja-jp/iaas/Content/Database/Tasks/exaconnectingDB.htm
## 5.1 DBCSのOSからデータベースへ接続 (①)
###踏み台用仮想マシンへ接続
Tera Termのホスト(T) 部分に踏み台用仮想マシンのパブリックIPアドレスを入力して接続します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/715f9a8d-4bdf-ec14-2c1e-0b52fd1d1379.png)
インスタンスのPublic IPアドレスを忘れた場合はOCIのコンソールの
**(Compute → Instances → Instance Details)**にて確認できます。

OKを押すと次の画面で認証について聞かれます。以下のように入力して接続します。
ユーザ名: opc
認証方式: RSA/DSA/ECDSA/ED25519鍵を使う
　　　　(インスタンス作成時に使用した 公開鍵とペアの秘密鍵を指定)
完了したらOKを押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/30f54ac5-467c-5a5e-1fa7-b5f8f81c66f1.png)
インスタンスへログインすることができました↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/e3d201a6-b2d3-ef76-05d2-665fe0ce3050.png)

ここで接続できない場合はVPN等ネットワークを別のものを使用していないか確認しておきましょう。(※初回ログイン時は認証について聞かれるのでyesをコンソールで入力して接続をしましょう。)

###DBCS認証用秘密鍵を踏み台用仮想マシンに渡す
踏み台用仮想マシンにログインしたらDBCSに接続するための秘密鍵の準備をします。
手元PCからのデータベース認証用秘密鍵を踏み台用仮想マシンにファイルを送る方法は色々ありますが、今回はTera Termのドラック&ドロップを活用します。
渡したいファイルを自分のPCから**Tera Termの接続中のコンソール画面にそのままドラック&ドロップ**します。
この方法で簡単にローカルPCのファイルをOCIの踏み台用仮想マシンへ渡すことができます。
確認画面が出るときに特に指定をしない場合ホームディレクトリに置いてくれます。

詳しいTera Termの使い方はこの方の記事の「3.SCP転送 & ファイル送信」が参考になります
https://orebibou.com/ja/home/201410/20141007_001/

###秘密鍵のパーミッションの確認
DBCSの公開鍵のペアとなる秘密鍵は今回私が紹介した渡し方だと他のユーザにも実行権限がある状態になっています。**セキュリティの懸念点があるためopcユーザ以外のユーザの実行権限を外す必要があります**。
そのまま接続しようとするとPermission deniedと表示されてしまいます。
(参考) 秘密鍵のパーミッションが適切でない状態で接続しようとしたときの表示↓

```
[opc@instance-2020OOOO-OOOO ~]$ ssh opc@10.0.1.2 -i OOOO_id_rsa
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'OOOO_id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "OOOO_id_rsa": bad permissions
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

```
そのため秘密鍵の状態を確認し、適切なパーミッションに設定しましょう。


```
sudo su -
ls -al /home/oracle

正しいパーミッション例
-rw-------. 1 opc   opc   1679 MMM DD 05:41 OOOO_id_rsa
不適切なパーミッション例
-rw-r--r--. 1 opc  opc    1679 MMM DD 12:27 OOOO_id_rsa
```
先ほどのコマンドで正しいパーミッションでない場合は次のコマンドを実行してopc以外のユーザの権限を制限しましょう。


秘密鍵は他のユーザに見られてはセキュリティが担保されないため、厳しいパーミッション要件となっています。所有者のみの読み書きのみが許される600に設定しましょう。
パーミッションの数字の意味は以下のサイトが参考になります
http://www3.u-toyama.ac.jp/furuta/unix-permit.html

```
パーミッションの変更
chmod 600 /home/oracle/OOOO_id_rsa

パーミッションの変更を確認
ls -al /home/oracle

-rw-------. 1 opc   opc   1679 MMM DD 05:41 OOOO_id_rsa
(ファイル所有者以外は読み書きできないパーミッション)
```

これで接続のための秘密鍵の準備が完了しました。


###DBCSのOSへログイン
次はプライベート・ネットワーク内にあるDBCSのOSにログインします。

```
$ ssh opc@10.0.1.2 -i id_rsa 
        (ユーザ名@DBCSのIPアドレス -i 認証用秘密鍵の指定)
```


###Oracle Databaseに接続
次は**oracleユーザに変更**してSQL*Plusを使ってみます。Oracleユーザであれば**環境変数も定義済み**で、すぐにデータベースへログインしてSQL文を実行することが可能です。

```
--oracleユーザに変更します
sudo su -oracle　
sqlplus / as sysdba
```
画面イメージ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/6014fe3b-b9d6-f6d3-8af7-61838fff7dee.png)

これでデータベースに接続することができました！
   
##5.2 踏み台用仮想マシンからデータベースへの接続 (②)
次に踏み台用仮想マシン（コンピュート・インスタンス）からSQL*Plusを使用して直接Oracle Databaseに接続したいと思います
手元のPCから踏み台用仮想マシンに接続する方法は[前のステップ](#踏み台用仮想マシンへ接続)で紹介した部分と共通です。

###サービス名、ポート番号の確認
　Oracle Databaseに接続する際に必要となるサービス名を確認します。
　DBCSにOracleユーザーでログイン済み状態で以下のコマンドを実行して確認しましょう。

```
lsnrctl status
 ```

コンソールのデータベース名を確認してその名前の先頭と同じモノを**lsnrctlで表示されたものから見つけ出してメモしておきましょう。(後程の接続パターン2でこのサービス名を使います)**
(OCIのデータベースの詳細画面で表示された**ホスト・ドメイン名**と同じでした)

###IPアドレスを確認
まずは踏み台用仮想マシンのプライベートIPアドレスを確認します。この後のステップで指定するソースCIDRのIPアドレスの範囲を指定する際に必要になります。
セキュリティ・リスト変更時にはソースのIPアドレスを指定するため、先に踏み台用仮想マシンのプライベートIPアドレスを確認してからDBCSのセキュリティ・リストを変更します。
(DBCS側ですべての宛先からOKとすることもできますが、セキュリティの観点から特定のインスタンス(=踏み台用踏み台用仮想マシン)からのみのアクセスを許可する形にします。)

OCIコンソール画面の**コンピュート→インスタンス→インスタンスの詳細**
に移動して図のような画面で**プライベートIPアドレス**を確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/e381f949-2892-62f7-3125-1b757bf95449.png)
インスタンスの一覧から今回使用したい**コンピュート名をクリック**して詳細画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/3e99f9dd-ac2c-88b3-d9d6-b09df8ad0bc3.png)
遷移後はインスタンスの詳細部分ですぐに**プライベートIPアドレス**が確認できます。メモしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/c71cb124-eda3-8875-e453-fcd7a4f8d45d.png)

###ネットワークのルールを変更
今回は踏み台用仮想マシンからOracle Net（1521番ポート）を使用し直接接続するため、OCIのコンソール画面で1521でアクセスできるよう設定を変更する必要があります。
（5.1の手順ではDBCSのOSにデフォルトで許可されているssh（22番ポート）でアクセスするため、追加の設定は不要でした。）

**1521番ポート**を開けておかないと、接続しようとしても、

```
ORA-12170: TNS:Connect timeout occurred
```
とタイムアウトになります。

それではOCIのコンソール画面からネットワークの設定を確認して変更していきましょう。
**ベア・メタル、VMおよびExadata→DBシステム→DBシステムの詳細**にてDBCSがどのネットワークを使用しているか確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/3a88ac42-dfaf-7e17-ec03-753aae36a3f1.png)
データベースの一覧が確認できます。今回使用する**データベースの名前を選択**して詳細画面に行きましょう![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/24deea4a-8a09-9b0d-a4e0-969d952cc003.png)
DBシステムの詳細でどのサブネットを使っているのか確認できました。次のステップではネットワークを変更するのでちょうど表示されている画面で青く押せる**VCN**の部分を押してネットワークの設定をしましょう。(この画面では**VCN: easy**となっている部分をクリック)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/36664efc-cb45-29eb-584a-0ab4ff0ee378.png)

VCNの部分をクリックして**仮想クラウド・ネットワークの詳細**を確認します。
トップページから行く場合は、 **ネットワーキング→ 仮想クラウド・ネットワーク→仮想クラウド・ネットワークの詳細**　でVCNの一覧を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/ad49fc5c-c9f0-1734-cb60-435793230cec.png)
**プライベート・サブネットの名前**をクリックして詳細画面へ移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/61953874-28a1-ded6-e033-e3e2b556354a.png)
**セキュリティ・リスト**をクリックして編集画面に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/b58701b5-59a4-8845-b7f2-75ad1fdadacf.png)
**ソースCIDR**を先ほど確認した**踏み台用仮想マシンがあるIPの範囲で設定**し、**宛先ポート範囲を1521**にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/def2b225-d295-a04d-3cfd-a311540f51c2.png)
**イングレスルールの追加**を押して設定完了です。
設定後の画面で追加されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/8fffeb19-5a5d-f0f0-d85a-69b4632cb6b4.png)
これで**データベースの1521番ポートへ、踏み台用仮想マシンからのアクセス**が可能になりました。

###Oracle Databaseに接続
それではTera Termで踏み台用仮想マシンからデータベースへ接続していきましょう。
前のステップと同様にTera Termで踏み台用仮想マシンにログインします。その後はoracleユーザに変更してデータベースへアクセスします。

```

(oracleユーザに変更)
 sudo su - oracle

(簡易接続の場合)
sqlplus sys(ユーザ名)/データベースのパスワード@DBCSのIPアドレス:ポート/データベースドメイン名 as sysdba
例) sqlplus sys/PW@10.0.1.2:1521/OOOoraclevcn.com as sysdba
    SQL> 
```

#6.データベースでSQL文の実行
このような形でSQLを実行してみましょう。

```
	SQL> select instance_name from v$instance;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706384/14ccf7c6-8745-c39d-ea24-85e948b205bd.png)
接続できました～

今回はこのようにOCIで必要リソースを作成して接続するまでを紹介いたしました。

データベースの更新情報
最新情報としてはOracle Database 21cが利用可能になっています! Database Cloud Service（VM上のRACとシングルインスタンス、BM上のシングルインスタンス）と、Always Free Autonomous Database（IAD、PHX、LHR、FRAのみ）で利用可能です!

#参考サイト
SSH接続回り (OCI公式ドキュメント)
https://docs.cloud.oracle.com/ja-jp/iaas/Content/Database/Tasks/exaconnectingDB.htm

VCN概要
https://speakerdeck.com/ocise/ociji-shu-zi-liao-jia-xiang-kuraudonetutowaku-vcn-gai-yao

Tera Termの使い方
https://orebibou.com/ja/home/201410/20141007_001/

ファイルのパーミッション設定
http://www3.u-toyama.ac.jp/furuta/unix-permit.html