Autonomous Database間でTLS接続（ウォレット不要）を使ったデータベース・リンクを試してみた

# はじめに
11月の新機能でAutonomous Database間でもTLS接続を使用したデータベース・リンクの作成ができるようになりました。動作確認をしてみます。
便宜上、ローカルのAutonomous DatabaseのユーザーをLOCALUSER、リモートのAutonomous DatabaseのユーザーをREMOTEUSER、パスワードは"Welcome12345#"としています。

# リモートのAutonomous DatabaseのTLS接続を有効化する
Autonomous Databaseはインスタンスのデプロイメント時にネットワーク・アクセスの選択ができます。相互TLSが必須である「すべての場所からのセキュリティ・アクセス」以外は、**相互TLS(mTLS)認証が必要**にデフォルトでチェックがついていないため、意図的にチェックしない限り、デプロイメント時からTLS接続が有効になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134317/499bf55e-8dcc-d2b4-74db-d153b27c1a9d.png)

::: note info
リモートのAutonomous Databaseがプライベート・エンドポイントにある場合は、ローカルのAutonomous DatabaseのVCNからアクセスできる（プライベート・ネットワークでアクセスできる）必要があります。
:::

すべての場所からのセキュリティ・アクセスでTLS接続を有効にしたい場合は、コンソールのネットワークの項目のアクセス制御リストの編集をクリックして、リモートのAutonomous DatabaseのACLを設定します。CIDRブロックで0.0.0.0/0を指定することですべてのアクセスを許可する設定ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134317/dea84248-87c8-65c3-9a37-de9dd900b71a.png)
続けて相互TLS（mTLS)認証の編集をクリックしてチェックをはずします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134317/fcfa4fc6-4c08-086e-3bc1-2a233f443f58.png)

保存すると、ステータスが更新中になります。使用可能になれば完了です。コンソール上のネットワークの項目はこちらのような表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134317/703239d7-1329-b337-8caf-cd65107fc0d8.png)


# リモートのAutonomous Databaseの接続情報の確認
データベース・リンクを作成するときにリモート・データベースの接続情報（ホスト、ポート、サービス名）が必要です。コンソールのAutonomous Databaseのホームでデータベース接続をクリックすると、相互TLS/TLS双方の接続情報を参照することができます。今回はMedium接続を利用することにして、リモートのAutonomous Databaseのコンソールで情報を確認しメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134317/f4d4a547-9b85-d069-4547-cc8bee1c8c8b.png)


# ローカルのAutonomous DatabaseにREMOTEUSERのクレデンシャルを作成
ローカルのAutonomous DatabaseのDatabase ActionsにLOCALUSERでログインし、SQLを開きます。DBMS_CLOUD.CREATE_CREDENTIALプロシージャを利用して、REMOTEUSERのクレデンシャルを作成します。

```
BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'DB_LINK_CRED',
    username => 'REMOTEUSER',
    password => 'Welcome12345#'
  );
END;
/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134317/44fad17b-0310-73c8-564e-4f9af7c6f026.png)

::: note
ADMINユーザー以外でデータベース・リンクを作成するには権限付与が必要です。事前にADMINユーザで以下を実行済みです。
```
GRANT EXECUTE on dbms_cloud_admin TO localuser;
GRANT create database link TO localuser;
```
:::

# データべース・リンクを作成
次にDBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKプロシージャを使ってデータベース・リンクを作成します。引き続きDatabase ActionsのSQLでLOCALUSERで以下のSQLを実行します。パラメータ**ssl_server_cert_dn**と**directory_name**には**NULL**で指定します。
```
BEGIN
     DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
          db_link_name => 'EMPLINK',
          hostname => 'adb.ap-osaka-1.oraclecloud.com',
          port => '1521',
          service_name => 'xxxxxxxxxxxxxx_remoteadb1_medium.adb.oraclecloud.com',
          ssl_server_cert_dn => NULL,
          credential_name => 'DB_LINK_CRED', 
          directory_name => NULL);
END;
/ 
```


::: note info
リモートのAutonomous Databaseがプライベート・エンドポイントにある場合は、追加でパラメータ**private_targetをTRUEに指定する**必要があります。またhostnameはDNSで解決できるホスト名を指定します。IPアドレスの指定はできません。
:::

# データベース・リンクの確認
データベース・リンクが無事作成できたので、リモートのEMP表が検索できるか確認してみます。
```
SELECT * FROM EMP@EMPLINK;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134317/3a9e01d2-3661-5df9-756d-8fc9ea299ee1.png)

正しく結果が表示されました。

# おわりに
ウォレットが不要なTLS接続によるAutonomous Database間のデータベース・リンクの作成、動作を確認してみました。これまではmTLS接続のみのサポートだったので、リンク先のAutonomous Databaseのウォレットをリンク元のAutonomous Databaseに読めるようにするという手順が必要でしたが、それが不要になり、簡単にデータベース・リンクが作成できます。


# 参考資料
ドキュメント：[Create Database Links from Autonomous Database to an Autonomous Database on a Private Endpoint](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/database-links-oracledb-private.html#GUID-3C61F493-ED80-44B9-A836-FA5D40655744)