Autonomous Databaseからプライベートネットワーク内のDBCSにデータベースリンクを作成する

# はじめに
Autonomous Databaseからプライベートネットワーク内のデータベースに、直接データベースリンクを作成することができるようになりました。作成自体は<a href="https://qiita.com/wahagon/items/7b6abbf6881481b5d5ee" target="_blank" rel="noopener noreferrer">こちらの記事</a>のように今までもできましたが、踏み台サーバーを置き、ポートフォワーディングを行わないといけませんでした。
しかし今回、~~事前にSRを上げることで~~、データベースリンクのターゲットにプライベートIPを指定することが可能になりました。
※2022年6月、事前にSRを上げる必要はなくなりました。

そこで本記事では、プライベートADBから異なるプライベートサブネットに置いたDBCSにデータベースリンクを作成してみます。
なお、パブリックサブネット内のDBCSへのデータベースリンクの作成方法は<a href="https://oracle-japan.github.io/ocitutorials/database/adb402-database-link/" target="_blank" rel="noopener noreferrer">こちら</a>で紹介しています。

# システム構成
構成図は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/3811d66f-6fef-5da6-2d90-0d960f0fd665.png)

プライベートサブネット①のセキュリティリストのイングレス・ルールに以下を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/fd9fb077-cb0c-b737-f22d-a662c353e885.png)

プライベートサブネット②のセキュリティリストのイングレス・ルールに以下を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/574206de-8061-52ef-50ce-bc4162bb8097.png)

プライベートサブネット①（CIDRブロック：10.0.1.0/24）に置いたプライベートADBインスタンス **ATPRD01** から、プライベートサブネット②（CIDRブロック：10.0.2.0/24）に置いたプライベートDBCS **DBCSRD01** に、データベースリンクHR_LINKを作成します。

:::note info
プライベートエンドポイントのDBへのデータベースリンクは、ソースDBであるADBもプライベートエンドポイントであることが前提となります。
:::

パブリックサブネットに置いたコンピュートインスタンス **VMRD01** は、ATPRD01・DBCSRD01に接続するための踏み台サーバーです。

# HRスキーマの作成
データベースリンク作成の前に、リンク先となるHRスキーマをDBCSRD01で作成します。
<a href="https://oracle-japan.github.io/ocitutorials/database/adb301-create-source-db/#2-%E7%A7%BB%E8%A1%8C%E5%AF%BE%E8%B1%A1%E3%81%A8%E3%81%AA%E3%82%8Bhr%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" target="_blank" rel="noopener noreferrer">こちらの記事</a>を参考に、HRスキーマを作成します。

# DBCSにてTCPS認証（SSL認証）を有効化
Autonomous Databaseでは、TCPS認証を使用します。DBCSではデフォルトでTCP認証のみ有効化されているので、TCPS認証を有効化する必要があります。
<a href="https://oracle-japan.github.io/ocitutorials/database/adb402-database-link/#2-dbcs%E3%81%AB%E3%81%A6tcps%E8%AA%8D%E8%A8%BCssl%E8%AA%8D%E8%A8%BC%E3%82%92%E6%9C%89%E5%8A%B9%E5%8C%96" target="_blank" rel="noopener noreferrer">こちらの記事</a>を参考に、TCPS認証を有効化します。


# DBCSのウォレットファイルをADBに配置
<a href="https://oracle-japan.github.io/ocitutorials/database/adb402-database-link/#3-dbcs%E3%81%AE%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92adb%E3%81%AB%E6%B8%A1%E3%81%99" target="_blank" rel="noopener noreferrer">こちらの記事</a>を参考に、前章で作成したウォレットcwallet.ssoをローカルにダウンロードし、オブジェクトストレージへアップロードします。その後DBMS_CLOUD.GET_OBJECTでADBに配置します。

# Database Linkの作成
① DBCSへ接続するためのクレデンシャルを作成します。

  ```sql
  BEGIN
   DBMS_CLOUD.CREATE_CREDENTIAL(
   credential_name => 'DBCS_DB_LINK_CRED',
   username => 'HR',
   password => 'WelCome123#123#'
   );
  END;
  /
  ```

::: note warn
注意
usernameは必ず全て大文字で指定してください。
:::

② DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKを使用してデータベースリンクを作成します。

  ```sql
  BEGIN
   DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
   db_link_name => 'HR_LINK',
   hostname => '<dbcs>.<subnet>.<vcn>.oraclevcn.com',
   port => '1522',
   service_name => '<pdb1>.<subnet>.<vcn>.oraclevcn.com',
   ssl_server_cert_dn => 'CN=dbcs',
   credential_name => 'DBCS_DB_LINK_CRED',
   directory_name => 'dblink_wallet_dir_dbcs',
   private_target => TRUE);
  END;
  /
  ```

::: note info
hostname：DBCSのホスト名
service_name：DBCSのtnsnames.oraに記載されているPDB1のサービス名
ssl_server_cert_dn：DBCSのサーバー証明書に記載されているDN値
private_target：プライベートIPを指定する場合に追加するパラメータ
:::

③ HR_LINKを使用し、HRスキーマのCOUNTRIES表を参照

  ```sql
  SELECT * FROM COUNTRIES@HR_LINK;
  ```

25か国の表のデータが取り出せたら正しく作成できています。

# ウォレットなしのデータベースリンク作成（2022/04更新）
新機能アップデートとしてADBから非ADBのOracle DatabaseへのデータべースリンクをTCP接続でウォレットなしで作成できるようになりました。こちらを利用する場合はターゲットデータベースのSSL認証構成が不要です。TCPS接続でウォレットありの場合と同様の<a href="https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-oracledb-private.html#GUID-2B0B196B-6112-4117-A557-973FEA7E26FD" target="_blank" rel="noopener noreferrer">前提条件</a>がありますのでご確認ください。

例えばプライベートのDBCSにウォレットなしでデータベースリンクを作成する手順は以下になります。
※ウォレットなしなので、DBCS側で行う作業はありません。TCP接続に使用しているポート番号を指定します。

① DBCSへ接続するためのクレデンシャルを作成します。
   ```sql
   BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'DBCS_DB_LINK_CRED',
    username => 'HR',
    password => 'WelCome123#123#'
    );
   END;
   /
   ```

② DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKを使用してデータベースリンクを作成します。
   ```sql
   BEGIN
    DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
    db_link_name => 'HR_LINK',
    hostname => '<dbcs>.<subnet>.<vcn>.oraclevcn.com',
    port => '1521',
    service_name => '<pdb1>.<subnet>.<vcn>.oraclevcn.com',
    ssl_server_cert_dn => NULL,
    credential_name => 'DBCS_DB_LINK_CRED',
    directory_name => NULL,
    private_target => TRUE);
   END;
   /
   ```
::: note info
hostname：DBCSのホスト名
service_name：DBCSのtnsnames.oraに記載されているPDB1のサービス名
port：TCP接続に使用するポート番号
ssl_server_cert_dn：NULL指定
directory_name：NULL指定
private_target：TRUE指定
:::

③ HR_LINKを使用し、HRスキーマのCOUNTRIES表を参照

  ```sql
   SELECT * FROM COUNTRIES@HR_LINK;
  ```

25か国の表のデータが取り出せたら正しく作成できています。



# 参考文献
<a href="https://oracle-japan.github.io/ocitutorials/database/adb402-database-link/" target="_blank" rel="noopener noreferrer">402 : Database Linkによるデータ連携</a>

<a href="https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-oracledb.html#GUID-0D44ED37-2857-4D8B-AA7B-BC89445D11A4" target="_blank" rel="noopener noreferrer">マニュアル</a>