Q Developer Transform for Mainflame z/osを試してみる

# はじめに
re:Invent 2024のKeynoteにてQ Developerの新機能が多数紹介されました！
そのうちの1つに「Transform for Mainframe z/os」がありました。

https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-q-developer-transformation-mainframe-modernization/

https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/transform-app-mainframe.html

この機能ではMainframeのz/osにデプロイされたアプリケーションコードに対して、Q Developerがコードの分析やドキュメント作成、コードのリファクタリングを実施してくれる機能です。

現在はプレビュー版ではありますが早速検証してみましたので、その時の内容を取りまとめました。

# ⓪準備
「Transform for Mainframe z/os」を使用するにはQ Developer Proが必要です。
Q Develoerの無料版はBuilders IDを使用することで利用可能になりましたが、Pro版を利用するためにはIAM Identity Centerと紐づける必要があります。
また、Identity Centerを利用する都合上AWS Organizationを使用する必要があります。

そのため、今回は事前準備として以下を実施します。
- AWS Organization
- IAM Identity Centerマネージドインスタンス
- Q Developer Pro のサブスクライブ

なおQ Developer ProはIdentity Centerと紐づけ可能なリージョンが限定されており、**今回は全てのリソースをバージニアリージョン(us-east-1)** で利用しています。


## ⓪-1 AWS Organization
マネジメントコンソールから「AWS Oraganization」のページを開き、「組織を作成する」をクリックします。

作成を行うと以下のようなメールが届くため、忘れずに承認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/89f84753-83d7-5a16-3e99-812beb016811.png)

マネジメントコンソールに戻って組織が登録されていれば完了です。


## ⓪-2 IAM Identity Center
**有効化（マネージドインスタンスの作成）**
マネジメントコンソールから「IAM Identity Center」を開き、「有効にする」をクリックします。
マネージドインスタンスが作成されます。

**グループの作成**
ユーザーを作成時にグループを選択する必要があるため、左側のタブから、「Groups」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/1195f4e3-87ad-4b3d-024b-fb7491f3267e.png)

任意のグループ名を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/a100141d-7e72-123e-c58b-11b7f0a2dec1.png)

**ユーザーの作成**
次にユーザーを作成していきます。こちらで作成したユーザーが最終的にQ Developer Proを利用できるユーザーになります。
左側のタブから「Users」を選択し、「ユーザーを追加」を選択します。

各種必要なユーザー情報を入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/c3d196e0-638c-fa3b-49c7-96e79f196e8f.png)

登録したメールアドレス宛に招待メールが届くため、そちらからユーザー承認を行います。この時にMFA設定も行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/275b0677-431c-6fe7-5b9c-e58cc77c26de.png)

最終的に以下の用にステータスが"有効"なユーザーが作成できていれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/3aa0db7d-f0e6-e4ba-fbec-adbf1e8ab113.png)


## ⓪-3 Q Developer Proのサブスクライブ
マネジメントコンソールから「Amazon Q Developer」を選択し、以下のように IAM Identity Centerとの接続を有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/8b145855-cae4-5bff-0600-8f3824b99d4e.png)

次に「Amazon Q」のページがら「Subscriptions」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/aa09f609-1da8-d0d9-e26a-77977a583364.png)

「Subscribe」をクリックし、先ほど作成したユーザーを登録します。（グループ登録も可能です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/8fa75c10-e72c-9dec-a506-2946d33ac9f4.png)

サブスクリプション一覧から、登録ユーザーが正しく登録されていることが確認できます。この状態でQ Developer Proが使用可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/6a39f2e3-a8a1-1d78-bb9f-440965796998.png)

## ⓪-4 Q Developer Transformのセットアップ
マネジメントコンソールの「Amazon Q Developer」から「Setting」を選択します。その中に新しく「Amazon Q Developer: Transform settings」のエリアができています。こちらを有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/57733d7e-fdf4-a8e0-86d2-296dadb54723.png)

有効を行うと「Appliction URL」が発行されます。Transform機能を使用するときにはこのリンクからアクセスすることになるため、どこかで控えておきましょう。

APplication URLをブラウザに張り付けて、アクセスします。（基本的にTransform機能はAWS内部でワークスペースが作成され、そこに対してブラウザでアクセスする形になるようです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/7ea46ef7-f810-52ec-7a48-302e2ff532e7.png)

## ⓪-5 Transform for Mainframeのセットアップ
左下のQ Developerのアイコンをクリックするとチャットが開きます。
そこから、.NETなのか、VMwareなのか、Mainframeなのか聞かれるのでMainframeを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/bf7bfbe5-69f1-89bc-c048-8f3eb128b4f6.png)

ちょっとジョブ名が気に入らなかったので、チャットベースで変更もしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/2fb9494e-9e51-1a84-f070-7d722f36ed36.png)

こちらOKだったのでジョブをそのまま作成してもらいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/e2722d4d-98af-3951-625c-cb7e7799123c.png)

ジョブが開始すると画面が切り替わり以下のようになります。
画面は2分割されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/62d05402-2f78-7a39-7ff8-ff96584176b5.png)
**左半分**はジョブ内のタスク（コード分析やドキュメント生成など）の進捗状況を示します。必須で入力をしなければならない項目があるときには、"Required"の文字が表示されます。（やっているとついつい忘れてしまうこともありますが、各タスク名の横に必須項目があるときのマークが出るので、それで判断したりします）
基本的にはこれらを1つずつ進めていく流れになります。

**右半分**は情報を入力したり、結果を表示したりする画面です。除法を入力した際には、必ず"Send to Q"をクリックする必要があるので、要注意です！

# ①Kick off modernization
こちらのタスクでは、入出力情報を格納するS3を設定します。

**入力Mainframeアプリの準備**
入力として使用するアプリを準備します。
今回は検証用のため、AWSが公式に提供している「CardDemo」アプリを使用します。ソースは以下から取得可能です。

https://github.com/aws-samples/aws-mainframe-modernization-carddemo

上記リポジトリ内のディレクトリのうち、app配下のファイルZIP化し、今回入力情報として使います。

**S3バケットの準備**
S3のバケットを準備します。
S3バケットに前段で準備したアプリケーションをアップロードします。

**S3 Connector準備**
Q Developerの指示に従って、アカウントIDを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/f158428f-eae5-5e09-884f-932d48714c52.png)

次にS3コネクタを作成するための認証リンクができているため、「Copy verification link」からURLをコピーし、ブラウザの別タブでそれを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/8ec9a404-0460-3aaa-8665-3e108941f53d.png)

承認を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/d5f3320f-2bfc-41d2-4c22-c49bea6cfda1.png)

"Approved"となっていれば成功です！必ず「Send to Q」のクリックを忘れずに！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/1130bdde-19f4-24c9-4c9d-0b6a5071e97c.png)

**入力ファイルの指定**
次に前段でアップロードしたMainframeファイルを指定します。
アップロードした先のS3パスを入力します。必ず「Send to Q」のクリックを忘れずに！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/79e1a195-d771-f749-8357-6ae5b656c7ae.png)

ここまでの操作を全て完了すると、以下のようにタスクの横に緑のチェックマークが現れます。こちらで全て準備完了になるので、次のタスクへと進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/bab19306-c7ff-901e-a1ba-53a35a2f035c.png)

# ②コード分析
まずはコード分析を実行してみました！

ダッシュボードを確認すると以下のような分析結果が現れました。ファイルタイプごとのコード行数やファイル数をパーセントで可視化されています。若干レイアウトが崩れてしまっているのが残念です...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/fc570e64-daa4-5ec4-bae4-2c572a8bea33.png)

Collaborationタブを開くと、テーブル形式で各ファイルの行数やタイプを示してくれていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/0196cb38-5aa7-37d1-be13-a4b8aa5681f3.png)

ちなみにWorklogタブを確認すると、そのタスクの実行ログを表示してくれます。それをダウンロードすることも可能です。

コード分析では全て完了するとDownloadリンクが出ていたので、内容を確認してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/3e3a6382-a3cc-150c-6c15-28dbda0bebc6.png)

中身は3ファイルあるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/945fe9a6-4ea7-1856-5ebb-8ef3e9ce6dde.png)

assets.csvは分析した各ファイルの情報を記載しています。

```csv:assets.csv
Name,Path,File type, Total, lines
REPROC.prc, card-demo-app/proc/REPROC.prc, PROC, 32
TRANREPT.prc, card-demo-app/proc/TRANREPT.prc, PROC, 82
READCUST.jcl, card-demo-app/jcl/READCUST.jcl, JCL, 16
:
```

dependencies.jsonでは各ファイルの依存関係をJSON形式で記載してくれています。これをもとに呼び出し、呼び出しもと関係の図が作れそうです。

```json:dependencies.json
:
{
    "dependencies": [
      {
        "dependencyType": "Close file; Open file; Read file; Select SQL assignment",
        "name": "CARDFILE-FILE",
        "path": "Global:FILE_DEFINITION:CARDFILE-FILE",
        "type": "FILE_DEFINITION"
      },
      {
        "dependencyType": "Call",
        "name": "CEE3ABD",
        "path": null,
        "type": "System"
      },
      {
        "dependencyType": "Copy",
        "name": "CVACT02Y.cpy",
        "path": "card-demo-app/cpy/CVACT02Y.cpy",
        "type": "CPY"
      }
    ],
    "name": "CBACT02C.cbl",
    "path": "card-demo-app/cbl/CBACT02C.cbl",
    "type": "COB"
  },
  :
```

missing.csvは不足しているファイルについて記載されていました。

```
Name, Type
COCRDSEC, Missing Program
AWS.M2.CARDDEMO.ACCTDATA.PS, Missing Dataset
AWS.M2.CARDDEMO.CARDDATA.PS, Missing Dataset
:
```

# ③ドキュメント生成
次にドキュメント生成を行いました。

ドキュメント作成に対応しているのは、JCLとCBLファイルのみの用です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/d717560d-c6c6-6b08-a62c-486c867888ac.png)

ドキュメント生成はSummaryとDetaild functional specificationsが選択できます。
今回どちらも試してみましたので、後ほど結果を記載します。なおDetaild functional specificationsはかなりの時間を要しますのご注意。

作成されたファイルは、前段で登録した登録したバケットに対して送信されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/31b4c99e-30b5-e25f-3141-e745b082898a.png)


**〇Summaryモードの場合**
生成されたファイル
- CoverPage.pdf
- 各COBOL, JCLファイルごとにpdfとxmlファイル(内容としては同じ)

**CoverPage.pdf**ではアプリケーションの概要、ならびに各ファイルの処理内容が記載されていました。
アプリケーションの概要ではアプリの持つ機能を的確にとらえているように思います。（アプリの機能はCardDemo Githubをご覧ください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/b92bbd96-3e24-548a-00c4-527ac01e0991.png)

> 説明されているアプリケーションは包括的なクレジットカード管理システムであり、おそらく金融機関またはクレジットカード会社向けに設計されています。主な特徴と機能の概要は次のとおりです。1.ユーザー管理:このシステムでは、一般ユーザーと管理者の両方にユーザー認証、アカウント作成、および管理を行います。ユーザーアカウントを一覧表示、更新、削除する機能が含まれています。2.トランザクション処理:このアプリケーションでは、新しいトランザクションの追加、トランザクション詳細の表示、トランザクションレポートの生成など、クレジットカードのトランザクションを処理します。また、日々の取引の処理、口座残高の更新、拒否された取引の管理も行います。3.アカウント管理:ユーザーは、顧客情報やカード情報などのアカウント情報を表示および更新できます。また、システムは利息を計算して口座に充当します。4.請求と支払い:アプリケーションには、口座残高の表示と請求書の支払い処理を行う機能があります。5.レポート:システムは、プレーンテキスト形式と HTML 形式の口座明細書、取引レポート、カテゴリ残高レポートなど、さまざまなレポートを生成します。6.データ管理:このアプリケーションは、複数の VSAM ファイルを使用して、取引、口座、顧客、およびユーザーセキュリティに関連するデータを保存および管理します。7.管理機能:管理者は、システム管理とメンテナンスのための追加機能にアクセスできます。8.CICS 統合:システムは CICS 環境内で動作するように設計されており、CICS リソースとファイル操作を管理する機能を備えています。全体的に見て、このアプリケーションはユーザーからクレジットカード操作を管理するための完全なソリューションとなります。
メインフレーム環境における顧客対応と管理の両方のニーズに応える認証とアカウント管理からトランザクション処理とレポート作成まで、さまざまなニーズに対応します。

**COBOL**コードに対しては機能概要、詳細機能、Input/Outputが記載されているようでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/ce75d60d-0ff7-190e-a012-2e15fce4ea5c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/6c6518cb-5027-7d7e-222b-a55f376c373a.png)

**JCL**ではjobの流れやパラメータが記載されているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/d64e5ae4-ed03-edce-d8fc-6aa24b0f04d9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/708b9c92-f9ca-b47b-f507-854b93d31b29.png)


**〇Detaild functional specificationsモードの場合**
生成されたファイルはSummaryタイプ通り以下の2種類でした。
- CoverPage.pdf
- 各COBOL, JCLファイルごとにpdfとxmlファイル(内容としては同じ)

**CoverPage.pdf**についてはSummaryと同様のファイルでした。

**COBOL**ファイルに対するドキュメントでは、以下のようにSummaryタイプより多くの項目（2章以降）の内容が生成されていることがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/27d2371c-61e2-7e2f-d4ed-39c8a91862e8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/f67ab1a9-cd03-5798-2e9a-bb633ad8e951.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/b751dfa1-9f58-d328-9bdc-b506ffe36d05.png)

DataFlowの項目などもあり、より機能を詳細に記載しているようです。
ここまでの情報が揃えば、コードリファクタリングを行わなくとも1からコードを書き始める選択肢も取れそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/a40c7429-43d3-7702-5679-1774bfad2444.png)


**JCL**の場合もSummaryタイプと比べて多くの項目が生成されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/ae5e0418-be3a-86ee-3bda-adb974a53ffb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/f8391d2a-ed20-af64-cd44-b682de7555e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/82ac9ad3-83f3-29ae-928b-4ffbdd05a062.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/0dd6b234-4716-0067-8743-9e595939199a.png)


# ④コードリファクタリング
最後にコードリファクタリングを実施してみました！
コード変換を実行すると、1つのMainframeアプリのソースコードファイルから複数の変換後ファイルが生成されました。

フロントエンドについては、BMSファイルからHTML, TypeScriptファイルが生成されました。フレームワークとしてはAngularが採用されているようです。

coactup.bmsの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/dccd6452-073f-a92e-8194-422d592305e2.png)

バックエンドについてはCOBOL等のファイルからMavenベースのSpring BootのJavaファイルが生成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/c1a4685c-617e-bb9e-bd57-9b67f76c7750.png)

ただしよくよくコードを確認してみると、なんと使用しているライブラリの中にBlu Age製品のライブラリが含まれていました。
BluAgeとはメインフレームアプリをJavaにリファクタリングするツールであり、AWSが買収した企業でもあります。
また買収後にはAWS Mainframe Modernizationがリリースされており、その中の機能の一つとしてBlu AgenによるリファクタリングやBlu Ageランタイムでのアプリ稼働が可能です。
今回のTransform for Mainframeの裏ではBlu Ageが関与している可能性は高そうです...

https://docs.aws.amazon.com/ja_jp/m2/latest/userguide/refactoring-m2.html

Mainframeからの脱却を目指してリファクタリングを行っても再度Blu Ageの依存を生んでしまうのは少し悲しい結末でした。

なおBlu Ageの非マネージドのランタイムはAWS側で提供があり、EC2やECSにデプロイができるとのことです。

https://aws.amazon.com/about-aws/whats-new/2024/10/aws-blu-age-runtime-non-managed-more-regions/



# Transform for Mainframeを使用する上でのTips
検証を行っている中でのTipsをまとめました
- Send to Qボタンを忘れないようにする
- 時間がかかっている時にはWorklogを確認すると進捗状況を把握できる
- Q Developer自体、すべての情報はAWSのアメリカのリージョンに情報が送信されてしまうため、情報管理には留意が必要
- 一度タスクを完了してしまうと、各後戻りはできない。再度ジョブを立ち上げる必要がある。
    - 例えば今回、ドキュメント生成はSummaryとDetaild functional specificationsを実行しましたが、1回のジョブでリトライをしたわけではなく、ジョブを分けて実行した。
- コード変換されたアプリケーションはBlu Ageのランタイム依存があり、アプリを稼働させるには別途Blu Ageランタイム環境の準備が必要
- サービスクォータあり

https://aws.amazon.com/about-aws/whats-new/2024/10/aws-blu-age-runtime-non-managed-more-regions/