Autonomous Database で Private IP Address(Private Endpoints)がリリースされたので、早速接続してみる。

Autonomous Database で Private IP Address(Private Endpoints)がリリースされました。その名の通り Autonomous Database に Private IP Address で接続できます。早速お試ししてみますやで。
彡(ﾟ)(ﾟ)

# 1. Private Endopoints のマニュアル記述

Autonomous Database の Private Endpoints のマニュアル記述は下記の通り彡(ﾟ)(ﾟ)

> Configure Private Endpoints with Autonomous Database
> https://docs.oracle.com/en/cloud/paas/atp-cloud/atpug/access-configure-samples.html#GUID-FD03A24D-3EF5-4F62-9B5F-11EA1E1FBDA0
> :
> To allow incoming and outgoing traffic to the Autonomous Database instance, 
> you need to define security rules in an NSG that create a virtual firewall for your Autonomous Database. 
> Private endpoint security rules are stateless, so you create both ingress and egress rules for the Autonomous Database instance.
> :

NSG(Network Security Group) の使用が必須です。マニュアルにはサンプルとして stateless rule による接続設定が記載されているので、その条件を満たすように Network を構成してみるやで彡(ﾟ)(ﾟ)

# 2. 検証構成

下記の構成で検証しました。踏み台経由で Private Compute に接続して、そこから Autonomous Database の Private Endpoint に接続しますやで。
彡(ﾟ)(ﾟ)
![private001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/d76243b1-b827-bf73-ab3d-feea99521337.jpeg)

# 3. VCN, Subnet, Route Table, Security List, NSG(Network Security Group) の作成

下記のような記事を参照して、VCN, Subnet, Route Table, Security List, NSG(Network Security Group) を作成します。

> 初回VCN作成をサクッとできるOracle Cloud Infrastructure Virtual Networking Quickstart & 仮想ファイアウォール設定の理解
> https://qiita.com/yamada-hakase/items/7967a7671db50b6c4d6c

ポイントになる Autonomous Database を配置する Subnet, Security List, NSG(Network Security Group) のスクショを貼っておきます。

---

Subnet は 1.の構成図通り 10.0.2.0/24 の CIDR を指定して作成します。
![private003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/6403bf30-a2ed-78da-9ce6-21b291003711.jpeg)

---

上記Subnet にアタッチする Security List には、セキュリティルールを何も記述しません。OCIの場合は Security List と NSG のどちらかにセキュリティルールを書けば、そのルールは有効になるからです。OR条件です。
![private004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/85f24be6-e8ff-1b23-0855-cfac13e3078e.jpeg)


---

NSG(Network Security Group) のセキュリティルールは下記の通りです。ステートレスにチェックを入れているため、Ingressルール と それに対応するEgressルール を併記します。

```java
Ingress ... Src(10.0.1.x:Any Port) ==> DSt(10.0.2.x:1522), Stateless Rule
Egress  ... Dst(10.0.1.x:Any Port) <== Src(10.0.2.x:1522), Stateless Rule
```

![private005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/426642dd-1117-a7fa-dbf6-6c2716d20bbb.jpeg)

# 4. Private Subnet に Autonomous Database を作成

Private Subnet に Autonomous Database を作成します。下記は作成する VCN, Subnet, NSG を選択するスクショです。

![private007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/64626542-f4bd-6a7c-fa3d-78840996127e.jpeg)

上記以外は別段に特別な事はありません。出来るのを待つ。彡(ﾟ)(ﾟ)

# 5. Walletの配置＆解凍 と nslookup、Autonomous Database(Private IP)への接続

Autonomous Database接続用のWalletをダウンロードして、Private Compute に配置＆解凍します。今回は /home/opc/work/tns に配置＆解凍してます。

```sql
$ pwd
/home/opc/work/tns
$ cat sqlnet.ora
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/home/opc/work/tns")))
SSL_SERVER_DN_MATCH=yes
$ cat tnsnames.ora
aysprv1_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxxxxx_aysprv1_high.atp.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-tokyo-1.oraclecloud.com,OU=Oracle ADB TOKYO,O=Oracle Corporation,L=Redwood City,ST=California,C=US")))

aysprv1_low = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxxxxx_aysprv1_low.atp.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-tokyo-1.oraclecloud.com,OU=Oracle ADB TOKYO,O=Oracle Corporation,L=Redwood City,ST=California,C=US")))

aysprv1_medium = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxxxxx_aysprv1_medium.atp.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-tokyo-1.oraclecloud.com,OU=Oracle ADB TOKYO,O=Oracle Corporation,L=Redwood City,ST=California,C=US")))

aysprv1_tp = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxxxxx_aysprv1_tp.atp.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-tokyo-1.oraclecloud.com,OU=Oracle ADB TOKYO,O=Oracle Corporation,L=Redwood City,ST=California,C=US")))

aysprv1_tpurgent = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxxxxx_aysprv1_tpurgent.atp.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-tokyo-1.oraclecloud.com,OU=Oracle ADB TOKYO,O=Oracle Corporation,L=Redwood City,ST=California,C=US")))

$
```

ホスト名を nslookup で名前解決してみると……彡(ﾟ)(ﾟ)

```sql
$ nslookup xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com
Server:         xxx.xxx.xxx.254
Address:        xxx.xxx.xxx.254#53

Non-authoritative answer:
Name:   xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com
Address: 10.0.2.4

$
```

ちゃんと Private IP Address に解決してるやね。さて準備はできたので、接続してみると……

```sql
$ sqlplus /nolog

SQL*Plus: Release 18.0.0.0.0 - Production on Mon Mar 2 16:47:59 2020
Version 18.5.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

SQL> CONNECT ADMIN/xxxxxxxxxxxx@aysprv1_tp
Connected.
SQL>
```

ちゃんと接続できたやで！彡(^)(^)

# 6. (※追記)ステートフルのNSGセキュリティルールで接続

ステートフルのNSGセキュリティルール(Ingressのみ)でも接続できました。マニュアルに載ってるのはあくまでサンプルとしてで、NSG の ステートレス／ステートフル はどちらでも良いもよう。
彡(ﾟ)(ﾟ)

```java
Ingress ... Src(10.0.1.x:Any Port) ==> Dst(10.0.2.x:1522), Stateful Rule
Egress  ... Auto by Stateful Rule
```
![private008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/82511d7a-5625-2161-1799-b074d491674a.jpeg)

```sql
$ sqlplus /nolog

SQL*Plus: Release 18.0.0.0.0 - Production on Tue Mar 3 03:44:23 2020
Version 18.5.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

SQL> CONNECT ADMIN/xxxxxxxxxxxx@aysprv1_tp
Connected.
SQL>
```
# 7. まとめ

Autonomous Database の Private IP Address(Private Endpoints) に接続できたやで！ NSG(Network Security Group)を使うのと、その NSG に 1522 の Ingressルール(とstatelessの場合は対応するEgressルール)を記載するのがポイントでしょうか。

外部(Internet)から隔離されたネットワークに Autonomous Database を配置できます。これでますます Autonomous Database の 使い途 が拡がりました。皆さん、どんどん活用して下さいね。
彡(^)(^)

# 補足. ホスト名の名前解決について

OCI VCN外(OnP や 他社クラウド)における ウォレットの tnsnames.ora に記載されたホスト名の名前解決については、下記マニュアルの記載のとおり hosts に記述するか Hybrid DNS構成 を組んで下さい。VCN内で Default DNS を使用している場合は、そちらで名前解決できます。

 > https://docs.cloud.oracle.com/en-us/iaas/Content/Database/Concepts/adbsprivateaccess.htm#ConnectingtoanAutonomousDatabasewithaPrivateEndpoint
 > ：
 > To resolve the Autonomous Database private endpoint in your on-premise host's /etc/hosts file
 > ：
 > 
 > Hybrid DNS Configuration
 > https://github.com/terraform-providers/terraform-provider-oci/blob/255817f83956f1f9a3ab903e11465e8b4dde1957/docs/examples/networking/hybrid_dns/Hybrid-DNS-configuration-using-DNS-VM-in-VCN.md