WebLogic Deploy Toolingで既存のWebLogic Serverからアプリケーションを抽出

## はじめに
WebLogicにデプロイしているアプリケーションを抽出するための便利なツールとして、[WebLogic Deploy Tooling](https://oracle.github.io/weblogic-deploy-tooling/)というものがあります。
このツールを使うことで、WebLogic上のアプリケーションをメタデータとして抽出し、以下のような用途に利用ができます。
- 別のWebLogic環境に移行
- 2つのWebLogic環境を同期
- WebLogicアプリケーションのコンテナ化

この記事では、アプリケーションの抽出を実際に行ってみたいと思います。

## 前提
今回はWebLogicをOCI上ですぐにプロビジョニングして利用できる[WebLogic Server for OCI](https://www.oracle.com/jp/java/weblogic/weblogic-for-oracle-cloud-infrastructure/)を利用してみます。
OSとWebLogicのバージョンはいくつか選択が可能ですが、実際に動かしてみる環境はそれぞれ以下の通りになります。
- Oracle Linux 7.9
- WebLogic Server 14.1.1.0
- Autonomous Database(ATP)

## 基本的な流れ
1. WebLogic Deploy Tooling(WDT) を抽出元のドメインがあるサーバにインストール
1. `discoverDomain` コマンドの実行

これだけです。

## WDTのインストール

#### OSユーザのスイッチ
WebLogic Server for OCI では、`oracle`ユーザでWebLogicの操作を行います。
```
sudo su - oracle
```

#### 環境変数の確認
まずは環境変数`JAVA_HOME`が設定されているかを確認します。
```
echo $JAVA_HOME
```
設定されていなければ、適切なJDKのパスを設定してください。

#### WDTの最新バージョンを確認
次に、公式のGithub(https://github.com/oracle/weblogic-deploy-tooling/releases/) で、WDTの最新バージョンを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482527/d3497cf7-39d2-a8fd-93d8-29500a4f5153.png)
2023年2月現在では2.4.4が最新のようです。

#### WDTのダウンロードとunzip
<バージョン>の部分を確認したバージョン(2.4.4であれば`release-2.4.4/weblogic`のように)に置き換えて、以下コマンドを実行します。
``` 
wget -qO- \
https://github.com/oracle/weblogic-deploy-tooling/releases/download/release-<バージョン>/weblogic-deploy.zip | \
$JAVA_HOME/bin/jar xv
```

#### スクリプトの権限変更
WDTのスクリプトを実行可能な状態にします
```
chmod +x weblogic-deploy/bin/*.sh
```

## discoverDomainコマンドを実行してアプリケーションを抽出
#### コマンドの実行
コマンドを実行する前に、コマンド内の必要箇所を書き換える必要があります。
```
weblogic-deploy/bin/discoverDomain.sh \
 -oracle_home <ORACLE_HOME> \
 -domain_home <DOMAIN_HOME> \
 -archive_file source.zip \
 -model_file source.yaml \
 -variable_file source.properties \
 -domain_type <WLS/JRF>
```
- `<ORACLE_HOME>`と<DOMAIN_HOME>`にはそれぞれのパスを設定
- `<WLS/JRF>`はドメインのタイプを指定

:::note info
 - `-archive_file`オプション -> アプリケーション(WAR/EAR)がまとまったzipファイルの出力先を指定可能
 - `-model_file`オプション -> WebLogic構成のメタデータファイルの出力先を指定可能
 - `-variable_file`オプション -> 変数群をまとめたファイルの出力先を指定可能
:::

今回は一例としてこのような形でコマンドを実行してみます。
***_domainの部分には実際にはドメイン名が入ります。
``` 
weblogic-deploy/bin/discoverDomain.sh \
 -oracle_home /u01/app/oracle/middleware/ \
 -domain_home /u01/data/domains/***_domain/\
 -archive_file source.zip \
 -model_file source.yaml \
 -variable_file source.properties \
 -domain_type WLS
```

実際に実行した場合はこのようなログが出て、`discoverDomain.sh completed successfully (exit code = 0)`と出れば成功です。
```
JDK version is 1.8.0_331-b09
JAVA_HOME = /u01/jdk
WLST_EXT_CLASSPATH = /home/oracle/weblogic-deploy/lib/weblogic-deploy-core.jar
CLASSPATH = /home/oracle/weblogic-deploy/lib/weblogic-deploy-core.jar
WLST_PROPERTIES = -Dcom.oracle.cie.script.throwException=true -Djava.util.logging.config.class=oracle.weblogic.deploy.logging.WLSDeployLoggingConfig 
/u01/app/oracle/middleware//oracle_common/common/bin/wlst.sh /home/oracle/weblogic-deploy/lib/python/discover.py -oracle_home /u01/app/oracle/middleware/ -domain_home /u01/data/domains/***_domain/ -archive_file source.zip -model_file source.yaml -variable_file source.properties -domain_type WLS

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

--- 中略 ---

discoverDomain.sh completed successfully (exit code = 0)
```

## 成果物を確認
3つの成果物(ファイル)が出来上がってるはずです。
```
$ ll source.*
-rw-r-----. 1 oracle oracle    143 Feb 10 05:39 source.properties
-rw-r-----. 1 oracle oracle   5378 Feb 10 05:39 source.yaml
-rw-r-----. 1 oracle oracle 430178 Feb 10 05:39 source.zip
```
`source.yaml`が構成のメタデータです。
DB接続の設定や、`source.zip`内のアプリケーションのパスがきちんと記載されていることが確認できます。
```
$ cat source.yaml 
domainInfo:
    AdminUserName: '@@PROP:AdminUserName@@'
    AdminPassword: '@@PROP:AdminPassword@@'
topology:
--- 中略 ---    
resources:
    JDBCSystemResource:
        ***DB:
            Target: ***
            JdbcResource:
                DatasourceType: GENERIC
                JDBCConnectionPoolParams:
                    StatementCacheSize: 10
                    InitialCapacity: 1
                    StatementCacheType: LRU
                    MaxCapacity: 15
                    TestTableName: SQL ISVALID
                    MinCapacity: 1
                JDBCDataSourceParams:
                    JNDIName: ***DB
                JDBCDriverParams:
                    DriverName: oracle.jdbc.OracleDriver
                    PasswordEncrypted: '@@PROP:JDBC.Handson-DB.PasswordEncrypted@@'
                    URL: jdbc:oracle:thin:@***db_tp
                    Properties:
                        oracle.net.tns_admin:
                            Value: /home/oracle/***db
                        user:
                            Value: '@@PROP:JDBC.***DB.user.Value@@'
                        oracle.net.wallet_location:
                            Value: /home/oracle/***db
                        oracle.jdbc.fanEnabled:
                            Value: 'false'
                        oracle.net.ssl_version:
                            Value: '1.2'
                        oracle.net.ssl_server_dn_match:
                            Value: 'true'
appDeployments:
    Application:
        ***App:
            SourcePath: wlsdeploy/applications/***App.war
            ModuleType: war
            Target: ***_adminserver
```

## まとめ
今回は、WDTを使って簡単にアプリケーションやWebLogicの構成を抽出できることが分かりました。
次は、この抽出したファイル群を使って、WebLogicアプリケーションのコンテナ化をやってみたいと思います。

## 参考資料
https://www.oracle.com/mx/a/ocom/docs/cloud/migrating-custom-wls-to-oci.pdf