TomcatのJavaアプリ(VM環境)をTransformation Advisorを使ってモダナイズする

#1. はじめに

今回は　Tomcat環境でTransformation Advisorを実行する内容が日本語・英語ともにネットを検索しても見つからなかったので､実際に試して、Qiitaに投稿することにしました。

この投稿をきっかけに、Tomcatを分析・移行対象としたTransformation Advisorの流れの雰囲気がつかんでもらえればと思います。

実際に、手を動かして試したい方は、別投稿[TomcatのJavaアプリ(VM環境)をTransformation Advisorを使ってモダナイズ(事前準備編) ](https://qiita.com/daihiraoka/items/e6a46a592c05f82b86d3)　に環境構築手順を記載しました。　手順にそって、環境構築後、この後の内容をお楽しみにください！

# 2. Transformation Advisorとは
Transformation Advisorはオンプレミス環境で動作しているJavaのミドルウェア･アプリケーション(Websphere、JBoss、WebLogic、Tomcat)を分析し､生成されたマイグレーションバンドルを使って､　OpenShiftの Libertyコンテナ上にJavaアプリをデプロイすることができるJavaアプリケーションのモダナイズするための移行支援ツールです。（IBMの製品です。）
分析結果では、コンテナ化（Liberty）するために必要な項目が、「移行の複雑さ、コスト、および推奨事項など」という観点で出力されます。
また､コンテナ化に必要なDockerfile､OpenShiftにデプロイするために必要なYaml､　Liberty化に必要な設定が自動生成されます｡

IBMの製品ということで、ここで関心がなくなってしまう方がいるかもしれませんが、90日版の評価版を利用して、現在、利用している環境のJavaのミドルウェア・アプリケーションに対して、Transformation Advisorを実行してみてコンテナ化するにあたっての「移行の複雑さ、コスト、および推奨事項など」を出力するだけでも有益な情報が出力されるのでぜひ、ご覧ください。

# 3. Transformation Advisorを使用する流れ

Transformation Advisorを使って既存のJavaアプリをコンテナ化するには以下の3つのステップを行います。

- Transformation Advisorを実行して既存のJavaアプリのコンテナ化の難易度や工数など視覚化するために分析結果を出力
- 分析結果を元に、既存のJavaアプリを改修する
- マイグレーションバンドルで生成されたコンテナ化に必要なファイル（yamlやDockerfileなど）を使って、OpenShiftに Javaアプリをデプロイする

# 4. Transformation Advisorの分析対象
Transformation Advisorで分析できる対象は、下記のJavaアプリケーション、メッセージングになります。

- ソース（分析対象）ホストのミドルウェア種類とバージョン:
 - IBM WebSphere v7 以上
 - Oracle ™ WebLogic v6.x 以上
 - Red Hat ™ JBoss v4.x 以上
 - Apache Tomcat® v6.x 以上
- メッセージング:
 - IBM MQ v7 以上

また、分析できるJavaのバージョンは以下の一覧になります。

- ソース(分析対象）ホストのJavaのバージョン
 * ibm5 - IBM Java 5                                                  
 * ibm6 - IBM Java 6                                                  
 * ibm7 - IBM Java 7                                                  
 * ibm8 - IBM Java 8                                                  
 * java11 - Java 11  (LTS)                                            
 * java14 - Java 14 (非 LTS)                                         
 * oracle5 - Oracle Java 5                                            
 * oracle6 - Oracle Java 6                                            
 * oracle7 - Oracle Java 7                                            
 * oracle8 - Oracle Java 8
 
注) CentOS6のyumで導入されるopenjdkは上記のリストに含まれないため、Transformation Advisorは実行されませんでした。そのような環境では、アプリケーションをwar/earファイルに固めて、アプリケーションのみTransformationAdvisor実行するか、別の環境で対応するJavaのバージョンに変えて実行で回避できると思います。

# 5. Tomcatの環境にTransformation Advisorを実行してみる  

今回は、前述のとおり、TomcatにTransformation Advisorを実行する手順を確認します。

## 前提

- Transformation Advisorが導入されていること
  - Transformation Advisor Local  
    -> インストール手順「[Transformation Advisor Localをインストールした時の手順メモ](https://qiita.com/daihiraoka/items/c5af4ae5a7c9be2dce53)」を使ってインストール可能
  - Transformation Advisor Operator ( OpenShift / OpenShift on IBM Cloud）  
    ->  OpenShiftのOperatorHubから導入可能(90日評価版）

- Transformation Advisorの解説・ダウンロードページ : 
https://www.ibm.com/garage/method/practices/learn/ibm-transformation-advisor

- 分析対象の環境
 - OS: CentOS6(x86_64)
 - JDK: IBM Java 7　(java-x86_64-71) ダウンロード先 https://www.ibm.com/support/pages/java-sdk-downloads-version-71
 - Tomcatのバージョン: 6.0.53
 - Javaアプリケーション: Tomcatのexample、自作したHelloWorldが出力されるServlet・jsp

*) 別投稿[TomcatのJavaアプリ(VM環境)をTransformation Advisorを使ってモダナイズ(事前準備編) ](https://qiita.com/daihiraoka/items/bc82f34cc89e0321b0d5)　で環境構築可能

## 手順

これからの手順はTransformation Advisor Local を使って検証しました。

### Transformation Advisorを起動する

Transformation Advisor Localの起動時に出力されるURL (例： ｈttp://192.168.26.23:3000 )を使って、ブラウザでTransformation Advisorを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/4e888ca3-0a3b-0934-8706-fcca9bffb254.png)

「新しいワークスペースを追加します」の右側の「 ＋ 」ボタンをクリックしてワークスーペースを作成します｡

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/6f81cb31-45f4-0e40-8c47-0acbe28398d6.png)

ワークスペース名に､今回は｢tomcat6_1｣を入力し、「次へ」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/a47b3a3d-41c7-a20c-df61-2db271c43fb4.png)

コレクションは、分析（Data Collector）を実行する単位で作成します。今回は「Collection1」と入力し､｢進む｣ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/256315cb-c631-e068-cbcc-2d3eb618894c.png)

###　分析（データコレクター）を実行する

#### データコレクターのダウンロード
コレクションを作成した後に、下記画面が表示されます。　分析（データーコレクター）を実行する為に「データ・コレクター」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/fd5f5da0-f050-16bf-56d0-ca5f6f3cf546.png)

ソース（分析対象）ホストのOSを、今回は「Linux」を選択して、「Linux用のダウンロード」ボタンをクリックしてデータコレクターをダウンロードします。　そして、ソース（分析対象）ホストに、ダウンロードしたファイルをアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/4f9519b0-0230-cc54-b7ee-e8c2f5ff3618.png)

この画面の下部ではツールを実行するためのコマンドを確認することができます。
今回は、ドメイン：「Apache Tomcat」､　分析タイプ：「アプリおよび構成」を選択しました。
なお、ドメインは、WebSphere、JBoss、Weblogic、Tomcatとミドルウェア、分析タイプは、アプリおよび構成（ミドルウェア）　と　.warファイル（アプリのみ）が選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/b93d3261-25f2-6a61-26d7-232f0704a958.png)

(参考)Apache Tomcatを選択して出力される実行用のコマンド

```shell
# .warファイルを分析
./bin/transformationadvisor --tomcat-apps-location <.war ファイルの Tomcat アプリの外部ロケーション> 
#アプリおよび構成を分析
./bin/transformationadvisor --tomcat-home-dir <TOMCAT_HOME_DIR> --tomcat-config-dir <TOMCAT_CONFIG_DIR> [--applications --applications-file] ([] はオプションの引数を表します) ([] はオプションの引数を表します)
```

#### データコレクターの解凍

- 作業ホスト： ソース（分析対象）ホスト

ソース（分析対象）ホストにアップロードしたデータコレクターを解凍します。
そして解凍したフォルダに､特に｢transformationadvisor-2.3.0/bin｣フォルダの実行ファイルに､
実行権限が付与されていないとツールが実行できませんでしたので､実行前に確認してください｡

```shell
# tar xvfz transformationadvisor-Linux_tomcat6_1_Collection1.tgz
# cd transformationadvisor-2.3.0/
#ls
bin  conf  docs  jre  lib  LICENCE
```

#### データコレクターのテスト実行

まず、ツール（transformationadvisorコマンド）が実行できるか、helpオプションを使って実行します。

```shell
# ./bin/transformationadvisor --help
```

特に問題がなければ　helpオプションの内容が出力されますが、私の実行した CentOS6(x86_64)の環境ではライブラリなど足りなくてエラーが出力されたので、記録しておきます。

- ld-linux.so.2 が入っていなくて、エラー

```shell
#エラー内容
In the case of duplicated or conflicting options, basically the order above
shows precedence: JAVA_OPTS lowest, command line options highest except --.
/root/transformationadvisor-2.3.0/bin/scan: /root/transformationadvisor-2.3.0/bin/../jre/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
/root/transformationadvisor-2.3.0/bin/scan: line 159: /root/transformationadvisor-2.3.0/bin/../jre/bin/java: Success

# 対応内容
yum install ld-linux.so.2 -y
```

-  compat-libstdc++ が入ってなくてエラー

```shell
#エラー内容
In the case of duplicated or conflicting options, basically the order above
shows precedence: JAVA_OPTS lowest, command line options highest except --.
libgcc_s.so.1 must be installed for pthread_cancel to work
JVMDUMP039I Processing dump event "abort", detail "" at 2020/11/27 18:55:24 - please wait.
JVMDUMP032I JVM requested System dump using '/root/transformationadvisor-2.3.0/core.20201127.185524.3779.0001.dmp' in response to an event
JVMDUMP010I System dump written to /root/transformationadvisor-2.3.0/core.20201127.185524.3779.0001.dmp
JVMDUMP032I JVM requested Java dump using '/root/transformationadvisor-2.3.0/javacore.20201127.185524.3779.0002.txt' in response to an event
JVMDUMP010I Java dump written to /root/transformationadvisor-2.3.0/javacore.20201127.185524.3779.0002.txt
JVMDUMP032I JVM requested Snap dump using '/root/transformationadvisor-2.3.0/Snap.20201127.185524.3779.0003.trc' in response to an event
libgcc_s.so.1 must be installed for pthread_cancel to work
./bin/transformationadvisor: line 90:  3779 Aborted                 (core dumped) bash $currentDir/scan $args

#対応内容
 yum install compat-libstdc++*
```

#### データコレクターのテスト実行

｢# ./bin/transformationadvisor --help｣ コマンドが正常実行が確認出来たら､データコレクターを実行します｡

事前に把握しておく内容としては､Tomcatのホームディレクトリ（CATALINA_HOME）とJAVA_HOMEです。

今回の環境では、以下の構成になっています。

```config
CATALINA_HOME:   /usr/local/apache-tomcat-6.0.53
JAVA_HOME:        /opt/ibm/java-x86_64-71
```

下記コマンドでデータコレクターを実行します、

```shell
#実行するコマンド（アプリおよび構成を分析）
./bin/transformationadvisor --tomcat-home-dir /usr/local/apache-tomcat-6.0.53 --tomcat-config-dir /usr/local/apache-tomcat-6.0.53

#./bin/transformationadvisor --tomcat-home-dir <TOMCAT_HOME_DIR> --tomcat-config-dir <TOMCAT_CONFIG_DIR> [--applications --applications-file] ([] はオプションの引数を表します) ([] はオプションの引数を表します)

```

下記画面のように、データーコレクターの実行が終了すると正常終了すると、結果は、自動的にTransformation Advisorにアップロードされます｡ (注)　ソース（分析対象）ホストとTransformationAdvisor間の通信が切断されている場合は、アップロードできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/a09ebefe-ffe1-47b0-7b38-66860b8512c7.png)

### 分析結果を確認する

ブラウザでTransformationAdvisorで､コレクションの画面を開くと､今回は｢Collection1｣､データーコレクターの実行結果が出力されます｡

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/602fefd0-b81e-f870-f51a-18f19e81c38b.png)

赤枠の中では､Tomcatで動作していたJavaのアプリケーションのEAR/WARファイル単位で、

- クラウドに移行する際のTransformationAdvisorが判断した難易度
- アプリケーションの移行に関する潜在的な問題の数と重大度
- 移行を実行するための開発作業の日数での見積もリ

が出力されます。　アプリケーション名など各項目をクリックすると詳細を確認することができます｡

####分析レポート

分析レポートでは、 アプリケーションの移行に関する潜在的な問題の数と重大度の詳細を確認する事ができます。また、分析の観点の一例として、非推奨または削除されたAPI、Java SEバージョンの違い、JavaEEの動作の違いをTransformation Advisorが分析し出力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/75817699-3a7e-abd4-e1c2-8f9fb67981bc.png)

例えば、下図の様に、Tomcatのサンプルアプリ「examples.war」では、 TomcatのPackageやAPIを利用しているため、 移行先のWebSphere LibertyやOpen Libertyでは、使えないためCritical表示になってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/8392814c-68c0-6aa8-3433-b265133eb415.png)

#### テクノロジーレポート

テクノロジーレポートでは、同様に Tomcatのパッケージを使ってるClassが移行できないため、一覧表示されています。
実際にみなさんが試す際は、テクノロジーレポートで出力された内容を、１つ１つ解決していく作業が必要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/830237d8-a34e-6b5f-a59b-d1b8ef6f3a16.png)

### マイグレーション計画

各アプリケーション(WAR/EAR単位)の詳細で「マイグレーション計画の表示」ボタンをクリックすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/dea1c446-e4f5-10b2-89df-4c3eac694171.png)

マイグレーション計画画面が表示されます。ここは、ソース（分析対象）ホストのデータコレクターの実行結果を元に、OpenShift 上に移行するために必要なファイルが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/dc0979a6-63e9-d1aa-2ff7-1e39b4431e4b.png)

赤枠の箇所がOpenShift環境へデプロイするためのOperator（Yaml)
Tomcatで動かしていたJavaアプリケーションをOpen Libertyで動かすための設定ファイルや 
コンテナ化するためのDockerfileが Transformation Advisorを使って自動生成されます。

ですので、データコレクターの実行結果、問題がないJavaアプリケーションは、Open Libertyを使って
コンテナ化し、OpenShift にデプロイすることができます。

# 6. まとめ
今回は　Tomcatに Transformation Advisorを実行してみた という内容がネットを検索しても見つからなかったので試してみようと思ったのがきっかけで、実際に試して、Tomcatでも、動作することが確認できました。

Tomcatを使っている方はたくさんいらっしゃると思います。　Open LibertyはOSSですので､
Transformation Advisorを使って､コンテナ化･モダナイゼーションを試す価値はあると思います｡

また､今回試した中では最初、CentOS6の環境でライブラリが不足していてTransformationAdvisorのコマンドが実行できなかった等、みなさんも試される時は、各環境で差異があるので、詰まりどころは違うかもしれません。

ですので、試行錯誤が発生しますし、データーコレクター実行時は負荷があがるので、実際に利用する際は、検証用の環境を用意して、実行するのが現実的だと思います。

ぜひ､この投稿を参考にTomcatでTransformation Advisorを使ってみてください。