Autonomous Database(ATP) に Java(JDBC Thin Driver) で ウォレット無しで接続してみる。

Autonomous Database(ATP/ADW/AJSON) は、従来は Autonomous Database自体が持つウォレットのファイル群を
クライアント側に配置する必要がありましたが、ウォレット無しのTLS接続を許可するオプションが追加されました。

> Update Network Options to Allow TLS or Require Only Mutual TLS (mTLS) Authentication on Autonomous Database
> https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/support-tls-mtls-authentication.html#GUID-3F3F1FA4-DD7D-4211-A1D3-A74ED35C0AF5
> 
> About TLS Authentication
> https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/connect-introduction.html#GUID-5ACCC8FF-7637-48F6-8FE4-049A720AC275
> If the client is connecting with JDBC Thin using TLS authentication, the client can connect without providing a wallet.
> ：

今回はこの追加された機能を使用して、ウォレット無しで Autonomous Database に接続してみるやで。
彡(ﾟ)(ﾟ)

# 1. Autonomous Database(ATP) の作成

まず Autonomous Database を作成します。ウォレット無しのTLS接続 は ADB の
ACL(Access Control List) による接続制限を行うか、プライベートエンドポイントで作成する必要があります。

> Update Network Options to Allow TLS or Require Only Mutual TLS (mTLS) Authentication on Autonomous Database
> https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/support-tls-mtls-authentication.html#GUID-3F3F1FA4-DD7D-4211-A1D3-A74ED35C0AF5
> If the instance is configured to operate over the public internet, 
> then one or more Access Control Lists (ACLs) must be defined before you allow TLS authentication. 
> ：
> If the instance is configured with a private endpoint, then you can allow TLS authentication.
> ：

今回は下記のトポロジーで Private Endpoint に ATP を作成します。
![NoWallet001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/5dd39df4-595c-d200-080b-6ffd75c3e8f9.jpeg)


# 2. Mutual TLS(mTLS)認証必須の無効化

DB作成後、Autonomous Database のコンソールからmTLS認証必須を無効化します。
![NoWallet002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/6851ed45-5902-c072-9055-05dc932a2003.jpeg)
![NoWallet003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/8594c425-5aa0-b727-6bbd-18ac1340acfa.jpeg)

# 3. TLS接続の接続文字列確認

DB Connection ⇒ TLS(プルダウン) で TLS接続 の接続文字列を確認します。
従来の mTLS はポート番号が 1522 なのですが、TLS接続は 1521 となるもよう。
![NoWallet004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/c711013e-853a-447a-d1ff-5c74cfcfe120.jpeg)

事前定義サービスは幾つかあるのですが、今回は TP接続 を選択します。彡(ﾟ)(ﾟ)

# 4. Instant Client(jdbc) の yum install(※オプション)

Compute に Instant Client を yum install して JDBC Thin Driver をゲットしておきます。
既に JDBC Thin Driver が有る場合は省略して構いません。下記では無駄に sqlplus をインストールしていたり…。

```shell
sudo su -

cd /etc/yum.repos.d
wget http://yum.oracle.com/public-yum-ol7.repo

yum install -y yum-utils
yum-config-manager --enable ol7_oracle_instantclient

yum list | grep -i oracle-instant

yum install oracle-instantclient-basic.x86_64
yum install oracle-instantclient-sqlplus.x86_64
yum install oracle-instantclient-jdbc.x86_64
yum install oracle-instantclient-tools.x86_64

export ORACLE_HOME=/usr/lib/oracle/21/client64
export PATH=${ORACLE_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib

sqlplus /nolog

SQL*Plus: Release 21.0.0.0.0 - Production on Sat Oct 30 06:38:42 2021
Version 21.3.0.0.0
```

# 5. JDKダウンロードと展開(※オプション)

Compute に JDK をダウンロードして展開します。既にJDKインストール済みの場合は省略して構いません。
今回は JDK17 をダウンロードして展開します。生の wget で tar.gz の JDK をダウンロードできる…！
彡(ﾟ)(ﾟ)

```shell
mkdir work
cd work
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
tar xvzf latest/jdk-17_linux-x64_bin.tar.gz
cd jdk-17.0.1
cd bin
./java -version

java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)
```

# 6. サンプルのソースコード

ソースコードは以前の記事のものを流用します。

> Autonomous DB(ADW/ATP) に Java の JDBC Thin Driver で接続してみる。(OCI, Oracle Cloud Infrastructure)
> https://qiita.com/ora_gonsuke777/items/91ec0e15848a78ede385

接続文字列部分には 3. で確認した接続文字列をセットします。
接続文字列内のダブルクォートは \ でエスケープしておきましょう。

```java
import java.sql.*;

public class GetContainerName {
    public static void main(String[] args) {
        final String path = "jdbc:oracle:thin:@(description=(retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxx_ayuatp1_tp.adb.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\")))";
        final String id = "ADMIN";  //ID
        final String pw = "xxxxxxxx";  //password

        try (
            Connection conn = DriverManager.getConnection(path, id, pw);
            Statement  stmt = conn.createStatement();
            ResultSet  rs   = stmt.executeQuery("SELECT NAME FROM V$CONTAINERS");
        ) {
            while (rs.next()) {
                String cn = rs.getString("name");
                System.out.println("Container Name => " + cn);
            }
        } catch(SQLException ex) {
            ex.printStackTrace();  //Error
        }
    }
}
```

# 7. コンパイルと実行

ソースをコンパイルして実行します。漢の 生javac に 生java実行……。

```java
export JAVA_HOME=/home/opc/work/jdk-17.0.1
export PATH=${JAVA_HOME}/bin:${PATH}

javac GetContainerName.java

java -classpath /usr/lib/oracle/21/client64/lib/ojdbc8.jar:. GetContainerName

Container Name => xxxxxxxxxxxxxx_AYUATP1
```

ウォレット無しでも ADB(ATP) への接続が成功して、コンテナ名が取得できました。

# 8. まとめ

幾つか事前準備は有りますが、ウォレット無しでも Autonomous Database に接続できるようになりました。
ウォレットの管理やローテション等の手間が無くなり、より使いやすくなっています。

Autonomous Database は Exadata のリソースを安価に使用できるので、皆さん活用して下さいね。
彡(^)(^)