

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Python を使用して AWS 上で EBCDIC データを ASCII に変換および解凍する
<a name="convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python"></a>

*Luis Gustavo Dantas (Amazon Web Services)*

## 概要
<a name="convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python-summary"></a>

メインフレームは通常、重要なビジネスデータをホストするため、Amazon Web Services（AWS）クラウドやその他の米国情報交換標準コード（ASCII）環境にデータを移行する場合、データを最新化することが最も重要なタスクの 1 つです。メインフレームでは、データは通常、拡張バイナリコード 10 進数交換コード (EBCDIC) 形式でエンコードされます。データベース、仮想ストレージアクセスメソッド (VSAM)、またはフラットファイルをエクスポートすると、通常、圧縮されたバイナリ EBCDIC ファイルが生成され、移行がより複雑になります。最も一般的に使用されるデータベース移行ソリューションはチェンジデータキャプチャ (CDC) で、ほとんどの場合、データエンコーディングを自動的に変換します。ただし、これらのデータベース、VSAM、またはフラットファイルには CDC メカニズムが使用できない場合があります。これらのファイルについては、データを最新化するための代替アプローチが必要です。

このパターンは、EBCDIC データを ASCII 形式に変換して最新化する方法を説明しています。変換後、データを分散データベースにロードしたり、クラウド内のアプリケーションにデータを直接処理させることができます。このパターンは、[mainframe-data-utilities](https://github.com/aws-samples/mainframe-data-utilities) GitHub リポジトリにある変換スクリプトとサンプルファイルを使用します。

## 前提条件と制限
<a name="convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント。
+ EBCDIC 入力ファイルとそれに対応する共通ビジネス指向言語 (COBOL) コピーブック。サンプルの EBCDIC ファイルと COBOL コピーブックは、「[メインフレームデータユーティリティ](https://github.com/aws-samples/mainframe-data-utilities)」の GitHub リポジトリに含まれています。COBOL コピーブックの詳細については、IBM Web サイトの「[z/OS 6.4 プログラミング用エンタープライズ COBOL ガイド](https://publibfp.dhe.ibm.com/epubs/pdf/igy6pg40.pdf)」を参照してください。

**制限事項**
+ COBOL プログラム内で定義されたファイルレイアウトはサポートされていません。これらは別途利用できるようにする必要があります。

**製品バージョン**
+ Python バージョン 3.8 以降

## アーキテクチャ
<a name="convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python-architecture"></a>

**ソーステクノロジースタック**
+ メインフレーム上の EBCDIC データ
+ COBOL コピーブック

**ターゲットテクノロジースタック**
+ 仮想プライベートクラウド (VPC)のAmazon Elastic Compute Cloud (Amazon EC2) インスタンス 
+ Amazon Elastic Block Store (Amazon EBS)
+ Python とそれに必要なパッケージ、JavaScript オブジェクト表記 (JSON)、システム、および日時
+ 最新のアプリケーションですぐに読み込んだり、リレーショナルデータベーステーブルに読み込んだりできる ASCII フラットファイル

**ターゲットアーキテクチャ**

![\[Python スクリプトと COBOL コピーブックを使用して EC2 インスタンス上の EBCDIC データを ASCII に変換しました\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/f5907bfe-7dff-4cd0-8523-57015ad48c4b/images/4f97b1dd-3f20-4966-a291-22180680ea99.png)


アーキテクチャ図は、EC2 インスタンスで EBCDIC ファイルを ASCII ファイルに変換するプロセスを示しています。

1. 「**parse\$1copybook\$1to\$1json.py**」スクリプトを使用して、COBOL コピーブックを JSON ファイルに変換します。

1. JSON ファイルと「**extract\$1ebcdic\$1to\$1ascii.py**」スクリプトを使用して、EBCDIC データを ASCII ファイルに変換します。

**自動化とスケール**

最初の手動ファイル変換に必要なリソースが揃ったら、ファイル変換を自動化できます。このパターンには自動化の指示は含まれていません。変換を自動化する方法は複数あります。以下は、考えられるアプローチの概要です。

1. AWS コマンドラインインターフェイス (AWS CLI) コマンドと Python スクリプトコマンドをシェルスクリプトにカプセル化します。

1. シェルスクリプトジョブを EC2 インスタンスに非同期的に送信する AWS Lambda 関数を作成します。詳細については、「[AWS Lambda を使用した SSH ジョブのスケジュール設定](https://aws.amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/)」を参照してください。

1. レガシーファイルがアップロードされるたびに Lambda 関数を呼び出す Amazon Simple Storage Service (Amazon S3) トリガーを作成します。詳細については、「[チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)」を参照してください。

## ツール
<a name="convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python-tools"></a>

** サービス**
+ 「[Amazon Elastic Compute Cloud (Amazon EC2)](https://docs.aws.amazon.com/ec2/?id=docs_gateway)」は、AWS クラウドでスケーラブルなコンピューティング容量を提供します。仮想サーバーを必要な数だけ起動して、迅速にスケールアップまたはスケールダウンができます。
+ [Amazon Elastic Block Store (Amazon EBS)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html) は、 Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで使用するブロックレベルストレージのボリュームを提供します。
+ 「[AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。
+ 「[AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。

**その他のツール**
+ 「[GitHub](https://github.com/)」は、コラボレーションツールとバージョン管理を提供するコードホスティングサービスです。
+ 「[Python](https://www.python.org/)」は高水準プログラミング言語です。

**コードリポジトリ**

このパターンのコードは、[mainframe-data-utilities](https://github.com/aws-samples/mainframe-data-utilities) GitHub リポジトリで利用できます。

## エピック
<a name="convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python-epics"></a>

### EC2 インスタンスの準備
<a name="prepare-the-ec2-instance"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| EC2 インスタンスの起動 | EC2 インスタンスにはアウトバウンドのインターネットアクセスが必要です。これにより、インスタンスは GitHub にある Python ソースコードにアクセスできるようになります。インスタンスを作成するには[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python.html) | AWS 全般 | 
| Git のインストール | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python.html) | AWS 全般、Linux | 
| Python のインストール | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python.html) | AWS 全般、Linux | 
| GitHub リポジトリのクローンを作成 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python.html) | AWS 全般、GitHub | 

### EBCDIC データから ASCII ファイルを作成します。
<a name="create-the-ascii-file-from-the-ebcdic-data"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| COBOL コピーブックを解析して JSON レイアウトファイルにします。 | `mainframe-data-utilities`フォルダ内で「**parse\$1copybook\$1to\$1json.py**」スクリプトを実行します。この自動化モジュールは COBOL コピーブックからファイルレイアウトを読み取り、JSON ファイルを作成します。JSON ファイルには、ソースファイルからのデータの解釈と抽出に必要な情報が含まれています。これにより、COBOL コピーブックから JSON メタデータが作成されます。次のコマンドは、COBOL コピーブックを JSON ファイルに変換します。<pre>python3 parse_copybook_to_json.py \<br />-copybook LegacyReference/COBPACK2.cpy \<br />-output sample-data/cobpack2-list.json \<br />-dict sample-data/cobpack2-dict.json \<br />-ebcdic sample-data/COBPACK.OUTFILE.txt \<br />-ascii sample-data/COBPACK.ASCII.txt \<br />-print 10000</pre>このスクリプトは受け取った引数を出力します。<pre>-----------------------------------------------------------------------<br />Copybook file...............| LegacyReference/COBPACK2.cpy<br />Parsed copybook (JSON List).| sample-data/cobpack2-list.json<br />JSON Dict (documentation)...| sample-data/cobpack2-dict.json<br />ASCII file..................| sample-data/COBPACK.ASCII.txt<br />EBCDIC file.................| sample-data/COBPACK.OUTFILE.txt<br />Print each..................| 10000<br />-----------------------------------------------------------------------</pre>引数に関する詳細は、GitHub リポジトリの「[README ファイル](https://github.com/aws-samples/mainframe-data-utilities/blob/main/README.md)」を参照してください。 | AWS 全般、Linux | 
| JSON レイアウトファイルを調べてください。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python.html)<pre> "input": "extract-ebcdic-to-ascii/COBPACK.OUTFILE.txt",<br /> "output": "extract-ebcdic-to-ascii/COBPACK.ASCII.txt",<br /> "max": 0,<br /> "skip": 0,<br /> "print": 10000,<br /> "lrecl": 150,<br /> "rem-low-values": true,<br /> "separator": "|",<br /> "transf": [<br /> {<br /> "type": "ch",<br /> "bytes": 19,<br /> "name": "OUTFILE-TEXT"<br /> } </pre>JSON レイアウトファイルの最も重要な属性は次のとおりです。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python.html)JSON レイアウトファイルの詳細については、GitHub リポジトリの「[README ファイル](https://github.com/aws-samples/mainframe-data-utilities/blob/main/README.md)」を参照してください。 | AWS 全般、JSON | 
| ASCII ファイルを作成します。 | クローニングされた GitHub リポジトリに含まれている 「**extract\$1ebcdic\$1to\$1ascii.py**」スクリプトを実行します。このスクリプトは EBCDIC ファイルを読み取り、変換されて読み取り可能な ASCII ファイルを書き込みます。<pre>python3 extract_ebcdic_to_ascii.py -local-json sample-data/cobpack2-list.json</pre>このスクリプトは EBCDIC データを処理するときに、10,000 レコードのバッチごとにメッセージを出力します。次の例を参照してください。<pre>------------------------------------------------------------------<br />2023-05-15 21:21:46.322253 | Local Json file   | -local-json | sample-data/cobpack2-list.json<br />2023-05-15 21:21:47.034556 | Records processed | 10000<br />2023-05-15 21:21:47.736434 | Records processed | 20000<br />2023-05-15 21:21:48.441696 | Records processed | 30000<br />2023-05-15 21:21:49.173781 | Records processed | 40000<br />2023-05-15 21:21:49.874779 | Records processed | 50000<br />2023-05-15 21:21:50.705873 | Records processed | 60000<br />2023-05-15 21:21:51.609335 | Records processed | 70000<br />2023-05-15 21:21:52.292989 | Records processed | 80000<br />2023-05-15 21:21:52.938366 | Records processed | 89280<br />2023-05-15 21:21:52.938448 Seconds 6.616232</pre>印刷頻度を変更する方法については、GitHub リポジトリの「[README ファイル](https://github.com/aws-samples/mainframe-data-utilities/blob/main/README.md)」を参照してください。 | AWS 全般 | 
|  ASCII ファイルを検証します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python.html)提供されているサンプル EBCDIC ファイルを使用した場合、ASCII ファイルの最初のレコードは次のようになります。<pre>00000000: 2d30 3030 3030 3030 3030 3130 3030 3030  -000000000100000<br />00000010: 3030 307c 3030 3030 3030 3030 3031 3030  000|000000000100<br />00000020: 3030 3030 3030 7c2d 3030 3030 3030 3030  000000|-00000000<br />00000030: 3031 3030 3030 3030 3030 7c30 7c30 7c31  0100000000|0|0|1<br />00000040: 3030 3030 3030 3030 7c2d 3130 3030 3030  00000000|-100000<br />00000050: 3030 307c 3130 3030 3030 3030 307c 2d31  000|100000000|-1<br />00000060: 3030 3030 3030 3030 7c30 3030 3030 7c30  00000000|00000|0<br />00000070: 3030 3030 7c31 3030 3030 3030 3030 7c2d  0000|100000000|-<br />00000080: 3130 3030 3030 3030 307c 3030 3030 3030  100000000|000000<br />00000090: 3030 3030 3130 3030 3030 3030 307c 2d30  0000100000000|-0<br />000000a0: 3030 3030 3030 3030 3031 3030 3030 3030  0000000001000000<br />000000b0: 3030 7c41 7c41 7c0a                      00|A|A|.</pre> | AWS 全般、Linux | 
| EBCDIC ファイルを評価してください。 | Amazon EC2 コンソールで、次のコマンドを入力します。EBCDIC ファイルの最初のレコードが開きます。<pre>head sample-data/COBPACK.OUTFILE.txt -c 150 | xxd</pre>サンプルの EBCDIC ファイルを使用した場合、結果は次のようになります。<pre> 00000000: 60f0 f0f0 f0f0 f0f0 f0f0 f1f0 f0f0 f0f0 `...............<br /> 00000010: f0f0 f0f0 f0f0 f0f0 f0f0 f0f0 f1f0 f0f0 ................<br /> 00000020: f0f0 f0f0 f0f0 f0f0 f0f0 f0f0 f0f0 f1f0 ................<br /> 00000030: f0f0 f0f0 f0f0 d000 0000 0005 f5e1 00fa ................<br /> 00000040: 0a1f 0000 0000 0005 f5e1 00ff ffff fffa ................<br /> 00000050: 0a1f 0000 000f 0000 0c10 0000 000f 1000 ................<br /> 00000060: 0000 0d00 0000 0000 1000 0000 0f00 0000 ................<br /> 00000070: 0000 1000 0000 0dc1 c100 0000 0000 0000 ................<br /> 00000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................<br /> 00000090: 0000 0000 0000 ......</pre>ソースファイルとターゲットファイルの同等性を評価するには、EBCDIC に関する包括的な知識が必要です。たとえば、サンプル EBCDIC ファイルの最初の文字はハイフン (`-`) です。EBCDIC ファイルの 16 進数表記ではこの文字は`60`で表され、ASCII ファイルの 16 進表記ではこの文字は`2D`で表されます。EBCDIC から ASCII への変換表については、IBM ウェブサイトの「[EBCDIC から ASCII へ](https://www.ibm.com/docs/en/iis/11.3?topic=tables-ebcdic-ascii)」を参照してください。 | AWS 全般、Linux、EBCDIC | 

## 関連リソース
<a name="convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python-resources"></a>

**リファレンス**
+ [EBCDIC 文字セット](https://www.ibm.com/docs/en/zos-basic-skills?topic=mainframe-ebcdic-character-set) (IBM ドキュメント)
+ [EBCDIC から ASCII への変換](https://www.ibm.com/docs/en/iis/11.3?topic=tables-ebcdic-ascii) (IBM ドキュメント)
+ [COBOL](https://www.ibm.com/docs/en/i/7.1?topic=languages-cobol) (IBM ドキュメント)
+ [JCL の基本的な概念](https://www.ibm.com/docs/en/zos-basic-skills?topic=collection-basic-jcl-concepts) (IBM ドキュメント)
+ [Amazon Linux EC2 インスタンスに接続](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)（Amazon EC2 ドキュメント）

**チュートリアル**
+ [AWS Lambda を使用して SSH ジョブをスケジューリングする](https://aws.amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/) (AWS ブログ記事)
+ [Amazon S3 トリガーを使用して Lambda 関数を呼び出す](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html) (AWS Lambda ドキュメント)