Oracle Database の HTTPS_PROXY(HTTP_PROXY), HTTPS_PROXY_PORT(HTTP_PROXY_PORT) を使用してプロキシサーバー経由でDB接続してみる。(tnsnames.ora, 簡易接続プラス, JDBC URL)

年も明けていますが、この記事は OCI Advent Calendar Part2 の Day 2 として書いています。

> Oracle Cloud Infrastructure Advent Calendar 2021
> https://qiita.com/advent-calendar/2021/oci

Oracle Database 19c(正確には18c以降) では tnsnames.ora に HTTPS_PROXY, HTTPS_PROXY_PORTパラメータ が追加されていて、HTTPプロキシ経由での接続が可能になりました。

> Oracle Database Database Net Servicesリファレンス 19c
> 6.7.2 HTTPS_PROXY
> https://docs.oracle.com/cd/F19136_01/netrf/local-naming-parameters-in-tns-ora-file.html#GUID-C672E92D-CE32-4759-9931-92D7960850F7
> ：
> 18cより前のバージョンのOracle Clientでは、HTTPプロキシを介した接続はサポートされません。
> ：
> 6.7.3 HTTPS_PROXY_PORT
> https://docs.oracle.com/cd/F19136_01/netrf/local-naming-parameters-in-tns-ora-file.html#GUID-E69D27B7-2B59-4946-89B3-5DDD491C2D9A
> ：
> このパラメータはHTTPS_PROXY_PORTとともに使用してください。
> ：

この記事では、これらのパラメータを使用してHTTPプロキシ経由で Oracle Database に接続してみます。

> PC ⇒ Proxy ⇒ 踏み台(Public Subnet) ⇒ DB(Private Subnet)

# 1. tnsnames.ora にパラメータを記述してHTTPプロキシ経由接続

tnsnames.ora に下記を記述します。なお環境の都合で https ではなく http で記述……。

```shell
LOCAL_AYUPDB01=(
  DESCRIPTION=
    (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=1)
    (ADDRESS_LIST=
      (LOAD_BALANCE=on)
      (ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=11521)(HTTP_PROXY=www.proxy.com)(HTTP_PROXY_PORT=80))
    )
    (CONNECT_DATA=(SERVICE_NAME=ayupdb01.ayusubnet01.ayuvcn01.oraclevcn.com))
)
```

この接続文字列で Oracle Database に接続してみます。Client PC(Windows) の PowerShell で接続してみます。

```powershell
$env:ORACLE_HOME = "C:\tools\OracleInstantClient19c"
$env:TNS_ADMIN = "C:\tools\OracleInstantClient19c"
cd C:\tools\OracleInstantClient19c
./sqlplus /nolog
CONNECT AYSHIBAT/xxxxxxxxxxxxxxxxx@LOCAL_AYUPDB01
SELECT NAME FROM V$CONTAINERS;

Disconnected from Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.12.0.0.0
PS C:\tools\OracleInstantClient19c> $env:ORACLE_HOME = "C:\tools\OracleInstantClient19c"
PS C:\tools\OracleInstantClient19c> $env:TNS_ADMIN = "C:\tools\OracleInstantClient19c"
PS C:\tools\OracleInstantClient19c> cd C:\tools\OracleInstantClient19c
PS C:\tools\OracleInstantClient19c> ./sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 5 12:13:27 2022
Version 19.9.0.0.0

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

SQL> CONNECT AYSHIBAT/xxxxxxxxxxxxxxxxx@LOCAL_AYUPDB01
Connected.
SQL> SELECT NAME FROM V$CONTAINERS;

NAME
--------------------------------------------------------------------------------
AYUPDB01

SQL>
```

上手く行きました。

# 2. 簡易接続プラスで簡易接続文字列にパラメータを記述してHTTPプロキシ経由接続

Oracle Database 19c では 簡易接続プラス という機能が追加されていて、簡易接続文字列にパラメータを記述できるようになりました。

> Oracle Database Net Services管理者ガイド 19c
> 8.1.1 簡易接続プラスについて
> https://docs.oracle.com/cd/F19136_01/netag/configuring-naming-methods.html#GUID-8C85D289-6AF3-41BC-848B-BF39D32648BA
> ：
> 名前/値ペア: 簡易接続アダプタは、名前と値のペアのリストを受け入れることができます。
> 名前/値の各ペアは、DESCRIPTIONレベルのパラメータとして追加されます。
> ：

HTTP_PROXY と HTTP_PROXY_PORT を記述した下記の簡易接続文字列で接続してみます。

```sql
CONNECT AYSHIBAT/xxxxxxxxxxxxxxxxx@//localhost:11521/ayupdb01.ayusubnet01.ayuvcn01.oraclevcn.com?HTTP_PROXY=www.proxy.com?HTTP_PROXY_PORT=80
```

Client PC(Windows) の PowerShell で実行します。

```powershell
$env:ORACLE_HOME = "C:\tools\OracleInstantClient19c"
cd C:\tools\OracleInstantClient19c
./sqlplus /nolog
CONNECT AYSHIBAT/xxxxxxxxxxxxxxxxx@//localhost:11521/ayupdb01.ayusubnet01.ayuvcn01.oraclevcn.com?HTTP_PROXY=www.proxy.com?HTTP_PROXY_PORT=80
SELECT NAME FROM V$CONTAINERS;

PS C:\Users\AYSHIBAT> $env:ORACLE_HOME = "C:\tools\OracleInstantClient19c"
PS C:\Users\AYSHIBAT> cd C:\tools\OracleInstantClient19c
PS C:\tools\OracleInstantClient19c> ./sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 5 12:14:55 2022
Version 19.9.0.0.0

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

SQL> CONNECT AYSHIBAT/xxxxxxxxxxxxxxxxx@//localhost:11521/ayupdb01.ayusubnet01.ayuvcn01.oraclevcn.com?HTTP_PROXY=www.proxy.com?HTTP_PROXY_PORT=80
Connected.
SQL> SELECT NAME FROM V$CONTAINERS;

NAME
--------------------------------------------------------------------------------
AYUPDB01

SQL>
```

これも上手く行きました。

# 3. JDBC URL(JDBC接続文字列)でHTTPプロキシ経由接続

JDBC URL(JDBC接続文字列)でHTTPプロキシ経由で接続してみます。
tnsnames.ora に記述する内容をほぼそのまま記述します。
※実際には1行で記述

```
jdbc:oracle:thin:@(
  DESCRIPTION=
    (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=1)
    (ADDRESS_LIST=
      (LOAD_BALANCE=on)
      (ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=11521)(HTTP_PROXY=www.proxy.com)(HTTP_PROXY_PORT=80))
    )
    (CONNECT_DATA=(SERVICE_NAME=ayupdb01.ayusubnet01.ayuvcn01.oraclevcn.com))
)
```

SQL Developer の カスタムJDBC URL でテストをしてみます。
![proxy01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/76551439-a0c3-a3c2-4ddf-4fc3bd869f16.jpeg)


解り辛いですが「ステータス：成功」で接続に成功しました。

# 4. まとめ

新年明けの小ネタです。プロキシ経由接続も簡易接続プラスもどんどん活用して下さいね。
彡(^)(^)

# 追記. 参考ドキュメント

http_proxyパラメータは下記ドキュメントに記載があるので、MOS にアクセス可能な方はご覧ください。
彡(ﾟ)(ﾟ)

> Parameters Added on Oracle 19c(19.3) but not Included in Reference (Doc ID 2559592.1)
> https://mosemp.us.oracle.com/epmos/faces/DocumentDisplay?id=2559592.1