Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (4) Wazi aaS への接続

# はじめに

PC上(Windows)の各種ツールからWazi aaSのz/OSに接続する方法を見ていきます。
ここでは前の記事のネットワーク構成で示した浮動IPを使用する例で構成されている前提で進めます。
(VPNを使用する場合も基本的な考え方は同様ですので適宜読み替えてください。)

## 関連記事


[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (1) 概要](https://qiita.com/tomotagwork/items/487d91ea8ddfb50e7257)
[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (2) 仮想サーバー作成](https://qiita.com/tomotagwork/items/9cea4c804f260d609eed)
[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (3) ネットワーク構成](https://qiita.com/tomotagwork/items/be2803e504b87cf364e5)
[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (4) Wazi aaS への接続](https://qiita.com/tomotagwork/items/b59717d767a91628b825)
[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (5) Stock Iamge確認](https://qiita.com/tomotagwork/items/40b7eaec61e31f830cbe)
[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (6) Stock Iamge基本操作/カスタマイズ](https://qiita.com/tomotagwork/items/0f2e914fd6263f2b40db)
[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (7) Wazi Image Builder](https://qiita.com/tomotagwork/items/fcfd295aaa54fa597c4b)
[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (7)' Wazi Image Builder - Trouble Shootingメモ](https://qiita.com/tomotagwork/items/fd804734595644a09d47)
[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (8) Wazi aaS仮想サーバーの複製](https://qiita.com/tomotagwork/items/ef23025b1ca3800b73c1)
[Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (9) TerraformによるWazi aaS仮想サーバーの管理](https://qiita.com/tomotagwork/items/883652c1534d12f2b042)

# 概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b819ef3f-f378-174a-7617-b94624a063e1.png)
上のイメージのようにPC上の各ツールからWazi aaSに接続してみます。
Wazi aaSを使用する際の作法としては、まず最初にSSHで接続してIBMUSERのパスワードを設定する必要がありますのでSSHでの接続は必須です。

# PCからの接続例

## 事前準備
PC上のhostsにホスト名とWazi aaS仮想サーバーのIPアドレスのマッピングをしておきます。
仮想サーバー名に合わせて`wazi01`という名前のホスト名を定義します。

## SSH
参考: [Connecting to z/OS virtual server instances](https://www.ibm.com/docs/en/wazi-aas/1.0.0?topic=vpc-connecting-zos-virtual-server-instances)

まずはじめにSSHでWazi aaSのUSSに接続する必要がありますのでPC上にはSSHクライアントが必要になります。上のマニュアルの記述の通りコマンドプロンプトやWSLからsshコマンドを使用してもよいですが、ここでは使い勝手のよいteratermを使用する例を示します。

teratermを起動し新しい接続でホスト名`wazi01`、サービス:`SSH`、ポート`22`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d17894c8-897e-825f-aaaf-fc5557725bb2.png)

ユーザー名:`ibmuser`、認証方式として`RSA/DSA/ECDSA/ED25519鍵を使う`を選択し、秘密鍵としてWazi aaS仮想サーバー作成時に作成したキーペアの秘密鍵のファイルを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/90e6a102-f1b0-3c37-f168-347d316abb5e.png)

プロンプトが出れば接続OKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/86f652cf-2f24-7552-d07b-14fd740d622f.png)

### IBMUSERパスワード設定

SSH接続ができたら、ここからTSOコマンドを投入してIBMUSERのパスワードを設定します。

```
tsocmd 'ALTUSER IBMUSER PASSWORD(XXXXXXXX) NOEXPIRE RESUME'
```

### 証明書取得

後続のPCOM接続で必要なCA証明書を入手しておきます。CA証明書は、`/u/ibmuser/common_cacert`に提供されています。

マニュアルの記述に従って、scpコマンドを使用してもよいですが、ここではteratermを使用する例を示します。
teratermのメニューから ファイル - SSH SCP を選択します。以下のポップアップ・ウィンドウが開くので、下段の項目でFrom:`/u/ibmuser/common_cacert`、To: に適当なPC上のフォルダを指定し、Reciveを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4b53e593-693c-6b78-ada5-0ebe4a057745.png)

common_cacertというファイルがPC上に作成されますので、拡張子.cerを付与します。ファイルをダブルクリックして開くと証明書の中身の情報が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/726bc20d-4925-d146-9768-4a2e1af17f4e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f36452ce-d94b-5a21-cb85-ac02d86cbdd1.png)


<font color="red">
※注意:
</font>

この証明書ファイル"common_cacert"は、Wazi aaS仮想サーバーごとに固有のものが生成されます。複数のWazi aaS仮想サーバーにアクセスする必要がある場合、それぞれの証明書を取得して管理する必要があります。

## PCOM(TN3270)

### CA証明書の登録
Wazi aaSではTN3270接続についてはAT-TLSを使用する構成になっています。そのため、先に入手したCA証明書(`common_cacert.cer`)を信頼できるCA証明書として登録しておく必要があります。

Windowsの場合以下の手順でCA証明書を登録します。

Windowsのインターネットオプションを開き、コンテンツ・タブから"証明書"ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/491421a4-0b7f-a803-77ae-07cefef33a0b.png)

"インポート"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d81bedd5-7d2c-b2a1-b674-50508016c1ea.png)

"次へ"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c7044711-8ea7-47d8-7425-b73e55bd8b5a.png)

先に入手したCA証明書のファイル`common_cacert.cer`を指定して"次へ"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4f6b1f97-49b9-bcf4-c028-ce7759199bb2.png)

"証明書をすべて次のストアに配置する"を選択し、証明書ストアに"信頼されたルート証明機関"を指定し"次へ"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/55af1b15-dd8f-9e35-e724-9ecab55c6782.png)

"完了"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/dc927a3f-c50c-b7bb-464b-aaef7ef120f5.png)

"はい"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fb38b9c8-d848-56ec-f7c0-f795d7855509.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ad283de7-adef-2575-3848-7b962e9ba85d.png)

### 接続構成

CA証明書がインポートできたら、PCOMの接続構成を行います。

ホスト定義タブにて、ホスト名またはIPアドレス: `wazi01`、ポート番号: `992`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d947234a-9236-a75c-ecfd-a9789efec7ef.png)

セキュリティーの設定タブにて、"セキュリティーの使用"にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/13de9791-45fb-4e3a-2f9a-6df7ec1eb5ab.png)

### TSOへのログイン

上の接続構成を使用して接続すると、以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/94704335-928f-a98c-f7dc-bfcf3a27db79.png)

下段のプロンプトに`TSO IBMUSER`と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/de397b50-77b7-3b2f-2162-3dc9e89ec10f.png)

パスワード入力用のプロンプトが出るので、上で設定したパスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0fe3cb85-d87b-b480-cc49-6a01a95ba15e.png)

TSO Logon画面になるのでそのままEnter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/66ead7f8-ff70-cb72-eca5-29fb8dff7b65.png)

そのままEnter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/08dc4588-873f-0317-1200-1ca00708e9f6.png)

ISPFと入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f9c56a9a-988f-1d32-2c64-3ca71cacfecb.png)

ISPF画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/818af07a-fd4f-92d4-db8b-60a61d114a97.png)

あとは実際のz/OSと同様に操作が行えます。

## z/OSMF

ブラウザから`https://wazi01:10443/zosmf/`にアクセスします。
IBMUSERと、上で設定したパスワードを指定してログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9c2119a6-dd34-2621-28cd-61386caf22d0.png)

z/OSMFの各種オペレーションが行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f29d44f5-aa91-8ac1-9421-5cf1295e35f1.png)

## VS Code

VS Codeからz/OSへの接続構成の詳細は以下の記事もご参照ください。
参考: [VS Code - z/OS接続構成 (Zowe CLI V2編)](https://qiita.com/tomotagwork/items/e48be1114a5fca77d976)

接続構成例:

```json: zowe.config.user.json
{
    "$schema": "./zowe.schema.json",
    "profiles": {
        "isecloud_wazi01": {
            "properties": {
                "host": "wazi01"
            },
            "profiles": {
                "zosmf": {
                    "type": "zosmf",
                    "properties": {
                        "port": 10443
                    }
                },
                "ssh": {
                    "type": "ssh",
                    "properties": {
                        "port": 22,
                        "privateKey": "C:\\xxx\\id_rsa_wazi"
                    }
                }
            },
            "secure": [
                "user",
                "password"
            ]
        },
        "base": {
            "type": "base",
            "properties": {
                "rejectUnauthorized": false
            }
        }
    },
    "defaults": {
        "zosmf": "wazi01.zosmf",
        "base": "base"
    },
    "autoStore": true
}
```


## IDz

IDzからz/OSへの接続構成の詳細は以下の記事もご参照ください。

参考: [Eclipseを使用したメインフレーム・アプリケーション開発 - (2)z/OS基本操作 - RSE接続での操作 - 接続構成](https://qiita.com/tomotagwork/items/67e7faac4ec30198f1d3#%E6%8E%A5%E7%B6%9A%E6%A7%8B%E6%88%90-1)

接続構成例:

リモート・システム・ビューの 新規接続 - z/OSを右クリック - 新規接続を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fe1ab0c6-54a2-4818-e064-d95d1b0698a2.png)

ホスト名、接続名を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8c8cf186-8b2f-d391-46c3-c0055eb37c4e.png)

デーモン・ポートに`8137`を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/83042542-60cb-a92f-219b-2a9abfe12a6c.png)


## ファイル転送

Wazi aaSではFTPサーバーも自動で起動しますが、AT-TLSによる通信が行われるよう構成されているため、TLS対応のFTPクライアントから接続する必要があります。また、浮動IPを使用したポートごとのアクセス制御の場合、FTPのデータ通信用のポートが動的にアサインされたりするのでちょっとその辺りの考慮が面倒です(Windows標準のFTPクライアントではPassiveモードの通信やTLS通信ができないらしい)。
...と思っていたら、PCOMのFTPクライアント機能を使うとPassiveモード、かつTLS通信ができるということを教えていただきました。

ここでは、PCOMのFTPクライアント機能、および、Wazi aaSのStock Imageのデフォルト環境で利用できるFTP以外のデータ転送方法を記載します。

### PCOMのFTPクライアントによる通信

まず、事前にWazi aaS側でFTPサーバーのカスタマイズをしてPassiveモードのデータ通信用ポートのレンジを絞っておきます。そのうえで、IBM Cloudの仮想サーバーとしてそのポートレンジの通信を受け付けるようネットワークの設定をしておきます。例えば、セキュリティー・グループでポート範囲を絞っている場合は、Passiveモードのデータ通信用ポート・レンジを許可しておきます。

参考: FTPサーバーのPassiveモードのデータ通信用ポート設定例 → [Wazi aaS: クラウド上でのメインフレーム開発環境構築 - (6) Stock Iamge基本操作/カスタマイズ - FTPカスタマイズ](https://qiita.com/tomotagwork/items/0f2e914fd6263f2b40db#ftp%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA)

参考: セキュリティー・グループ設定例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b81cec0a-afa7-3542-dc16-1bb75e4ab91a.png)

次にPCでPCOMのFTPクライアントを起動します。
※FTPではAT-TLSの通信が行われます。上のPCOM(TN3270)接続設定例に示したCA証明書の登録は完了している前提です。

メニューバーから、通信 - 構成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/537f4e3c-a276-210c-a587-fdde208a6b56.png)

"接続"タブにてホスト名、ポートを指定し、データ接続モードとしてパッシブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/92cea806-9e25-3ad6-ab25-b08ba0a488a2.png)

"SSL"タブにて、"セキュリティーを有効にする"にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f8bcc4ec-8a34-3bcb-e4af-86ab8e5aa330.png)

ユーザーID、パスワードを指定して接続ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f4348e52-be69-43e4-144d-37c4f72bfe4f.png)

これでFTP通信が行えるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3346c385-c6f5-7638-42b9-5913df9d5c0a.png)

MVSデータセット、USSいずれもファイル転送可能です。

### WinSCPによるFTP通信

WinSCPでもパッシブモード、TLS通信はできるので、PCOMのFTPクライアントと同様FTP通信ができました。
ただし、WinSCPの場合MVSデータセットとのファイル転送は無理そうです(USSのみ)。

設定例:
明示的なTLS/SSL暗号化を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6d41667b-2c3f-8b63-6d8e-98f2737239fb.png)
設定にて、パッシブモード接続でIPアドレスを強制するをオンに指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f63248e0-907b-14fe-cd55-906d2341630a.png)

接続画面イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cd87ea41-471e-316c-6984-93b94fba4a66.png)






### OpenSSHベースの通信
OpenSSHをベースとしてファイル転送の仕組みです。SSHのポートが使われるのでネットワーク構成としては楽です。

#### sftp
参考: [Configuring sftp](https://www.ibm.com/docs/en/zos/2.4.0?topic=client-configuring-sftp)

sftpプロトコルを使用してUSS上のファイルを送受信できます。ただし基本的に"バイナリモード"での送受信となりますので、コード変換が必要な場合は個別にiconvなどで手動で実施する必要があります。

#### scp
参考: [Configuring scp](https://www.ibm.com/docs/en/zos/2.4.0?topic=client-configuring-scp)

scpプロトコルを使用してUSS上のファイルを送受信できます。ただし基本的に"テキストモード"での送受信となりますので、ASCII-EBCDIC変換が必ず発生します。USS側のコードページはロケールに依存しますが、ネットワーク上を流れるデータとしては一旦ISO8859-1(ISO Latin 1)に変換されることになりますので、日本語(DBCS)を含むデータは正しく変換されません。
※ただし、scpクライアントのバージョンがOpenSSH_9.0以上の場合は内部的にsftpプロトコルが使用されてしまうためバイナリでの転送になるようです。その場合`-O`オプションを使用することで従来通りのscpの挙動となります。
詳細は以下の記事もご参照ください。
[z/OSのSSH, SCP, SFTPのEBCDIC-ASCII変換について。SCPでEBCDIC-ASCII変換が行われないとき。](https://qiita.com/tiue/items/81ffe444ff06a56d1d91)

### z/OSMF + Zowe CLI
z/OSMFではMVSデータセットやUSSファイルを操作するためのREST APIが提供されていますので、そちらを利用することができます。
参考:[z/OS data set and file REST interface](https://www.ibm.com/docs/en/zos/2.4.0?topic=services-zos-data-set-file-rest-interface)

ただ、これらをそのままREST APIとして使用するのは使い勝手が悪いので、この仕組みを利用したZowe CLIというツール(OSS)が提供されています。
これは専用のCLI(Commannd Level Interface)が提供されるので、コマンドでデータの送受信が行えます。
USS上のファイルだけでなくMVSデータセットの送受信も行えます。また、バイナリーモード/テキストモードの制御や、日本語のコードページも対応しているので日本語(DBCS)を含むコード変換にも対応しています。

参考: 
[Zowe CLI quick start](https://docs.zowe.org/stable/getting-started/cli-getting-started)
[zowe › zos-files](https://docs.zowe.org/stable/web_help/index.html?p=zowe_zos-files)

#### zowe cliコマンド使用例

データセットのメンバー表示例

```
c:\>zowe zos-files list all-members IBMUSER.JCL --host wazi01 --port 10443 --user IBMUSER --password xxxxx
APPLY
HZSALLCP
RACFCERT
RECIEVE
RRSCOLD
SADMPDS
SADMPOSG
SSHKYCP
TRSDUMP
TRSREST
```

USS上のファイル表示例

```
c:\>zowe zos-files list uss-files /u/ibmuser --host wazi01 --port 10443 --user IBMUSER --password xxxxx
.                         drwxr-xr-x 8192   BPXROOT
..                        dr-xr-xr-x        BPXROOT
.ansible                  drwx------ 8192   BPXROOT
.ssh                      drwx------ 8192   BPXROOT
common_cacert             -rw------- 1387   BPXROOT
.sh_history               -rw------- 2482   BPXROOT
.dbb                      drwx------ 8192   BPXROOT
.bashrc                   -rw-r--r-- 158    BPXROOT
env-overrides             -rw------- 16     BPXROOT
.cache                    drwxr-xr-x 8192   BPXROOT
.bash_history             -rw------- 23     BPXROOT
Util                      drwxr-xr-x 8192   BPXROOT
shutsys                   -rw-r--r-- 2386   BPXROOT
.gitconfig                -rw-r--r-- 149    BPXROOT
.profile                  -rw-r--r-- 82     BPXROOT
JCL                       drwxr-xr-x 8192   BPXROOT
Git                       drwxr-xr-x 8192   BPXROOT
dbb-zappbuild             drwxr-xr-x 8192   BPXROOT
private_common_properties drwx------        BPXROOT
```