기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
pytest 프레임워크를 사용하여 AWS Glue에서 Python ETL 작업에 대한 유닛 테스트 실행
코드 리포지토리: aws-glue-jobs-unit-testing | 환경: 프로덕션 | 기술:; 빅 데이터; 소프트웨어 개발 및 테스트 DevOps |
AWS 서비스: AWS CloudFormation, AWS, AWS CodeBuild, AWS CodeCommit CodePipeline, AWS Glue |
요약
로컬 개발 환경에서 AWS Glue의 Python 추출, 변환 및 로드 (ETL) 작업에 대한 단위 테스트를 실행할 수 있지만 DevOps 파이프라인에서 이러한 테스트를 복제하는 것은 어렵고 시간이 많이 걸릴 수 있습니다. 유닛 테스트는 AWS 기술 스택에서 메인프레임 ETL 프로세스를 현대화할 때 특히 어려울 수 있습니다. 이 패턴은 기존 기능을 그대로 유지하고, 새 기능을 출시할 때 주요 애플리케이션 기능이 중단되지 않도록 하고, 고품질 소프트웨어를 유지하면서 유닛 테스트를 간소화하는 방법을 보여줍니다. 이 패턴의 단계와 코드 샘플을 사용하여 AWS의 pytest 프레임워크를 사용하여 AWS Glue에서 Python ETL 작업에 대한 단위 테스트를 실행할 수 있습니다. CodePipeline 또한 이 패턴을 사용하여 여러 AWS Glue 작업을 테스트하고 배포할 수 있습니다.
사전 조건 및 제한 사항
사전 조건
활성 상태의 AWS 계정
Amazon ECR 퍼블릭 갤러리
에서 다운로드한 AWS Glue 라이브러리의 Amazon Elastic Container Registry(Amazon ECR) 이미지 URI 대상 AWS 계정 및 AWS 리전에 대한 프로필이 있는 Bash 터미널(모든 운영 체제)
파이썬 3.10
이상 AWS 서비스 테스트를 위한 Moto
Python 라이브러리
아키텍처
기술 스택
Amazon Elastic Container Registry (Amazon ECR)
AWS CodeBuild
AWS CodeCommit
AWS CodePipeline
Glue
Pytest
Python
AWS Glue용 Python ETL 라이브러리
대상 아키텍처
다음 다이어그램은 Python을 기반으로 하는 AWS Glue ETL 프로세스의 단위 테스트를 일반적인 엔터프라이즈 규모의 AWS DevOps 파이프라인에 통합하는 방법을 설명합니다.
![AWS Glue ETL 프로세스의 유닛 테스트](images/pattern-img/82781ca8-4da0-4df0-bf23-32992fece231/images/bb4d67e8-cefb-4018-aef3-44d655adf705.png)
이 다이어그램은 다음 워크플로를 보여줍니다.
소스 단계에서 샘플 Python ETL job (
sample.py
), 단위 테스트 파일 (test_sample.py
), AWS CloudFormation 템플릿을 비롯한 소스 코드용 CodeCommit 리포지토리를 CodePipeline 사용합니다. 그런 다음 추가 처리를 위해 메인 브랜치에서 CodeBuild 프로젝트로 최신 코드를 CodePipeline 전송합니다.빌드 및 게시 스테이지에서는 AWS Glue 퍼블릭 Amazon ECR 이미지를 사용하여 이전 소스 단계의 최신 코드를 유닛 테스트합니다. 그런 다음 테스트 보고서가 CodeBuild 보고서 그룹에 게시됩니다. AWS Glue 라이브러리용 퍼블릭 Amazon ECR 리포지토리의 컨테이너 이미지에는 로컬에서 AWS Glue에서 실행하는 데 필요한 모든 바이너리와 단위 테스트 PySpark기반
ETL 작업이 포함되어 있습니다. 퍼블릭 컨테이너 리포지토리에는 AWS Glue에서 지원하는 버전마다 하나씩, 총 3개의 이미지 태그가 있습니다. 데모를 위해 이 패턴은 glue_libs_4.0.0_image_01
이미지 태그를 사용합니다. 에서 CodeBuild 이 컨테이너 이미지를 런타임 이미지로 사용하려면 사용하려는 이미지 태그에 해당하는 이미지 URI를 복사한 다음 리소스의 GitHub 리포지토리에서pipeline.yml
파일을 업데이트하십시오.TestBuild
배포 단계에서 CodeBuild 프로젝트가 시작되고 모든 테스트를 통과하면 Amazon Simple Storage Service (Amazon S3) 버킷에 코드를 게시합니다.
사용자는
deploy
폴더의 CloudFormation 템플릿을 사용하여 AWS Glue 작업을 배포합니다.
도구
AWS 도구
Amazon Elastic Container Registry(Amazon ECR)는 안전하고 확장 가능하고 신뢰할 수 있는 관리형 컨테이너 이미지 레지스트리 서비스입니다.
CodeBuildAWS는 소스 코드를 컴파일하고, 단위 테스트를 실행하고, 배포할 준비가 된 아티팩트를 생성하는 데 도움이 되는 완전관리형 빌드 서비스입니다.
CodeCommitAWS는 자체 소스 제어 시스템을 관리할 필요 없이 Git 리포지토리를 비공개로 저장하고 관리할 수 있는 버전 제어 서비스입니다.
AWS는 소프트웨어 릴리스의 여러 단계를 신속하게 모델링 및 구성하고 소프트웨어 변경 사항을 지속적으로 릴리스하는 CodePipeline 데 필요한 단계를 자동화하도록 지원합니다.
AWS Glue는 완전 관리형 ETL 서비스입니다. 이를 통해 데이터 스토어와 데이터 스트림 간에 데이터를 안정적으로 분류, 정리, 보강하고 이동할 수 있습니다.
기타 도구
Python
은 높은 수준의, 해석된 범용 프로그래밍 언어입니다. Moto는
AWS 서비스를 테스트하기 위한 Python 라이브러리입니다. Pytest
는 애플리케이션 및 라이브러리의 복잡한 기능 테스트를 지원하도록 규모가 조정되는 소규모 유닛 테스트를 작성하기 위한 프레임워크입니다. AWS Glue용 Python ETL 라이브러리는
AWS Glue용 PySpark 배치 작업의 로컬 개발에 사용되는 Python 라이브러리용 리포지토리입니다.
코드
이 패턴의 코드는 GitHub aws-glue-jobs-unit-testing
src
폴더에 있는 샘플 Python 기반 AWS Glue 작업tests
폴더의 관련 유닛 테스트 사례(pytest 프레임워크를 사용하여 구축됨)폴더에 있는 템플릿 (YAML로 작성) CloudFormation
deploy
모범 사례
리소스 보안 CodePipeline
의 파이프라인에 연결되는 소스 리포지토리에 암호화 및 인증을 사용하는 것이 가장 좋습니다. CodePipeline 자세한 내용은 설명서의 보안 모범 사례를 참조하십시오. CodePipeline
CodePipeline 리소스 모니터링 및 로깅
AWS 로깅 기능을 사용하여 사용자가 계정에서 어떤 작업을 수행하고 어떤 리소스를 사용하는지 확인하는 것이 가장 좋습니다. 로그 파일은 다음을 보여 줍니다.
작업의 시간과 날짜
작업의 소스 IP 주소
부족한 권한으로 인해 실패한 작업
로깅 기능은 AWS CloudTrail 및 Amazon CloudWatch 이벤트에서 사용할 수 있습니다. 를 사용하여 CloudTrail AWS 계정에서 또는 AWS 계정을 대신하여 이루어진 AWS API 호출 및 관련 이벤트를 기록할 수 있습니다. 자세한 내용은 CloudTrail CodePipeline 설명서에서 AWS를 사용한 CodePipeline API 호출 로깅을 참조하십시오.
CloudWatch 이벤트를 사용하여 AWS에서 실행되는 AWS 클라우드 리소스 및 애플리케이션을 모니터링할 수 있습니다. CloudWatch Events에서 알림을 생성할 수도 있습니다. 자세한 내용은 CodePipeline 설명서의 CodePipeline 이벤트 모니터링을 참조하십시오.
에픽
작업 | 설명 | 필요한 기술 |
---|---|---|
배포할 코드 아카이브를 준비하십시오. |
| DevOps 엔지니어 |
CloudFormation 스택을 만드세요. |
스택은.zip 파일에서 체크인되어 S3 버킷에 업로드된 초기 코드로 CodeCommit 리포지토리를 자동으로 생성합니다. 또한 스택은 CodeCommit 리포지토리를 소스로 사용하여 CodePipeline 뷰를 생성합니다. 위 단계에서 CodeCommit 리포지토리는 AWS-글루-유닛-테스트이고 파이프라인은 AWS-글루-유닛-테스트-파이프라인입니다. | AWS DevOps, DevOps 엔지니어 |
환경에서 리소스를 정리합니다. | 추가 인프라 비용을 피하려면 이 패턴에 제공된 예제를 시험해 본 후 스택을 삭제해야 합니다.
| AWS DevOps, DevOps 엔지니어 |
작업 | 설명 | 필요한 기술 |
---|---|---|
파이프라인에서 유닛 테스트를 실행하십시오. |
| AWS DevOps, DevOps 엔지니어 |
문제 해결
문제 | Solution |
---|---|
Amazon S3, Amazon ECR 또는 CodeCommit 소스를 사용하는 파이프라인은 더 이상 자동으로 시작되지 않습니다. | 변경 감지를 위해 Amazon EventBridge 또는 CloudWatch Events의 이벤트 규칙을 사용하는 작업의 구성 설정을 변경하는 경우, AWS Management Console은 소스 식별자가 유사하고 첫 문자가 동일한 경우 변경을 감지하지 못할 수 있습니다. 콘솔에서 새 이벤트 규칙을 생성하지 않으므로 파이프라인이 더 이상 자동으로 시작되지 않습니다. 예를 들어 CodeCommit 브랜치 이름을 에서 이는 변경 감지를 위해 이벤트의 CloudWatch 이벤트를 사용하는 다음 소스 작업에 적용됩니다.
이 문제를 해결하려면 다음 중 한 가지를 사용하십시오.
|
관련 리소스
추가 정보
또한, AWS CLI를 사용하여 AWS CloudFormation 템플릿을 배포할 수 있습니다. 자세한 내용은 설명서의 변환이 포함된 템플릿의 빠른 배포를 참조하십시오. CloudFormation