

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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) 환경으로 마이그레이션할 때 데이터를 현대화하는 것이 가장 중요한 작업 중 하나입니다. 메인프레임에서 데이터는 일반적으로 확장 이진 코드 십진 교환 코드(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>

**사전 조건 **
+ 활성 상태의 계정
+ EBCDIC 입력 파일 및 해당 COBOL(공용 비즈니스 지향 언어) 카피북. 샘플 EBCDIC 파일 및 COBOL 카피북은 [mainframe-data-utilities](https://github.com/aws-samples/mainframe-data-utilities) GitHub 리포지토리에 포함되어 있습니다. COBOL 카피북에 대한 자세한 내용은 IBM 웹사이트의 [zEnterprise COBOL for z/OS 6.4 프로그래밍 가이드](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 카피북

**대상 기술 스택**
+ Virtual Private Cloud(VPC)의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스
+ Amazon Elastic Block Store(Amazon EBS)
+ Python과 그 필수 패키지, JavaScript 객체 표기법(JSON), sys 및 datetime
+ 최신 애플리케이션에서 읽을 수 있거나 관계형 데이터베이스 테이블에 로드할 수 있는 ASCII 플랫 파일

**대상 아키텍처**

![\[Python 스크립트와 COBOL 카피북을 사용하여 EC2 인스턴스에서 EBCDIC 데이터를 ASCII로 변환했습니다.\]](http://docs.aws.amazon.com/ko_kr/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 Command Line Interface(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(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 Command Line Interface(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/ko_kr/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/ko_kr/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/ko_kr/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/ko_kr/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/ko_kr/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/ko_kr/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/ko_kr/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 설명서)
+ [Linux 인스턴스에 연결](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 Blog 게시물)
+ [Amazon S3 트리거를 사용하여 Lambda 함수 간접 호출](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)(AWS Lambda 설명서)