pytest 프레임워크를 사용하여 AWS Glue에서 Python ETL 작업에 대한 유닛 테스트 실행 - AWS 권장 가이드

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

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 이상

  • Pytest

  • 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 프로세스의 유닛 테스트

이 다이어그램은 다음 워크플로를 보여줍니다.

  1. 소스 단계에서 샘플 Python ETL job (sample.py), 단위 테스트 파일 (test_sample.py), AWS CloudFormation 템플릿을 비롯한 소스 코드용 CodeCommit 리포지토리를 CodePipeline 사용합니다. 그런 다음 추가 처리를 위해 메인 브랜치에서 CodeBuild 프로젝트로 최신 코드를 CodePipeline 전송합니다.

  2. 빌드 및 게시 스테이지에서는 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

  3. 배포 단계에서 CodeBuild 프로젝트가 시작되고 모든 테스트를 통과하면 Amazon Simple Storage Service (Amazon S3) 버킷에 코드를 게시합니다.

  4. 사용자는 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 이벤트 모니터링을 참조하십시오.

에픽

작업설명필요한 기술

배포할 코드 아카이브를 준비하십시오.

  1. GitHubaws-glue-jobs-unit-testing code.zip 리포지토리에서 다운로드하거나 명령줄 도구를 사용하여.zip 파일을 직접 생성하십시오. 예를 들어 터미널에서 다음 명령을 실행하여 Linux 또는 Mac에서.zip 파일을 만들 수 있습니다.

    git clone https://github.com/aws-samples/aws-glue-jobs-unit-testing.git cd aws-glue-jobs-unit-testing git checkout master zip -r code.zip src/ tests/ deploy/
  2. AWS Management Console에 로그인하고 원하는 AWS 리전을 선택합니다.

  3. S3 버킷을 생성한 다음 생성한 S3 버킷에.zip 패키지 및 code.zip 파일(이전에 다운로드함)을 업로드합니다.

DevOps 엔지니어

CloudFormation 스택을 만드세요.

  1. AWS 관리 콘솔에 로그인한 다음 CloudFormation 콘솔을 엽니다.

  2. 스택 페이지에서 스택 생성을 선택한 다음 기존 리소스 사용(리소스 가져오기)를 선택합니다.

  3. 스택 생성 페이지의 템플릿 지정 섹션에서 템플릿 파일 업로드를 선택한 다음, Pipeline.yml 템플릿 (리포지토리에서 다운로드) 을 선택합니다. GitHub 그리고 다음을 선택합니다.

  4. 스택 이름glue-unit-testing-pipeline을 입력하거나 원하는 스택 이름을 선택합니다.

  5. ApplicationStack이름에는 미리 채워진 글루-코드-파이프라인-앱 이름을 사용합니다. 파이프라인에서 생성된 스택의 CloudFormation 이름입니다.

  6. 에는 BranchName미리 채워진 마스터 이름을 사용하십시오. S3 버킷의.zip 파일에서 코드를 체크인하기 위해 CodeCommit 리포지토리에 생성된 브랜치의 이름입니다.

  7. 에는 BucketName미리 채워진 aws-glue-artifacts-us-east-1 버킷 이름을 사용하십시오. 이것은.zip 파일이 들어 있는 S3 버킷의 이름이며, 파이프라인에서 코드 아티팩트를 저장하는 데 사용됩니다.

  8. CodeZip파일의 경우 미리 채워진 code.zip 값을 사용합니다. 이것은 샘플 코드 S3 객체의 키 이름입니다. 객체는 .zip 파일이어야 합니다.

  9. 에는 미리 RepositoryName채워진 aws-glue-unit-testing 이름을 사용하십시오. 스택에서 생성된 리포지토리의 이름입니다. CodeCommit

  10. TestReportGroupName경우에는 미리 채워진 glue-unittest-report 이름을 사용하십시오. 유닛 테스트 보고서를 저장하기 위해 만든 CodeBuild 테스트 보고서 그룹의 이름입니다.

  11. 다음을 선택한 후 스택 옵션 구성 페이지에서 다시 다음을 선택합니다.

  12. 검토 페이지의 기능에서 사용자 지정 이름으로 IAM 리소스를 생성할 CloudFormation 수 있음을 인정합니다. 옵션을 선택합니다.

  13. 제출을 선택합니다. 스택 생성이 완료되면 리소스 탭에서 생성된 리소스를 볼 수 있습니다. 스택 생성에는 약 5~7분 가량 걸립니다.

스택은.zip 파일에서 체크인되어 S3 버킷에 업로드된 초기 코드로 CodeCommit 리포지토리를 자동으로 생성합니다. 또한 스택은 CodeCommit 리포지토리를 소스로 사용하여 CodePipeline 뷰를 생성합니다. 위 단계에서 CodeCommit 리포지토리는 AWS-글루-유닛-테스트이고 파이프라인은 AWS-글루-유닛-테스트-파이프라인입니다.

AWS DevOps, DevOps 엔지니어

환경에서 리소스를 정리합니다.

추가 인프라 비용을 피하려면 이 패턴에 제공된 예제를 시험해 본 후 스택을 삭제해야 합니다.

  1. CloudFormation 콘솔을 열고 생성한 스택을 선택합니다.

  2. 삭제를 선택합니다. 이렇게 하면 CodeCommit 리포지토리, AWS Identity 및 Access Management (IAM) 역할 또는 정책, 프로젝트를 포함하여 스택에서 생성한 모든 리소스가 삭제됩니다. CodeBuild

AWS DevOps, DevOps 엔지니어
작업설명필요한 기술

파이프라인에서 유닛 테스트를 실행하십시오.

  1. 배포된 파이프라인을 테스트하려면 AWS Management 콘솔에 로그인한 다음 CodePipeline 콘솔을 엽니다.

  2. CloudFormation 스택에서 생성한 파이프라인을 선택한 다음 Release change를 선택합니다. 파이프라인이 실행되기 시작합니다 ( CodeCommit 리포지토리의 최신 코드 사용).

  3. Test_and_Build 단계가 끝나면 세부 정보 탭을 선택한 다음 로그를 검사합니다.

  4. 보고서 탭을 선택한 다음, 보고서 기록에서 테스트 보고서를 선택하여 유닛 테스트 결과를 확인합니다.

  5. 배포 단계가 완료되면 AWS Glue 콘솔에서 배포된 AWS Glue 작업을 실행하고 모니터링합니다. 자세한 내용은 AWS Glue 설명서의 AWS Glue 모니터링을 참조하십시오.

AWS DevOps, DevOps 엔지니어

문제 해결

문제Solution

Amazon S3, Amazon ECR 또는 CodeCommit 소스를 사용하는 파이프라인은 더 이상 자동으로 시작되지 않습니다.

변경 감지를 위해 Amazon EventBridge 또는 CloudWatch Events의 이벤트 규칙을 사용하는 작업의 구성 설정을 변경하는 경우, AWS Management Console은 소스 식별자가 유사하고 첫 문자가 동일한 경우 변경을 감지하지 못할 수 있습니다. 콘솔에서 새 이벤트 규칙을 생성하지 않으므로 파이프라인이 더 이상 자동으로 시작되지 않습니다.

예를 들어 CodeCommit 브랜치 이름을 에서 MyTestBranch-1 로 변경하는 MyTestBranch-2 것은 사소한 변경입니다. 브랜치 이름 끝에 변경 사항이 적용되므로 소스 작업의 이벤트 규칙이 업데이트되지 않거나 새 소스 설정에 대한 규칙이 생성되지 않을 수 있습니다.

이는 변경 감지를 위해 이벤트의 CloudWatch 이벤트를 사용하는 다음 소스 작업에 적용됩니다.

  • 소스 작업이 Amazon S3에 있을 때의 S3 버킷 이름 및 S3 객체 키 파라미터 또는 콘솔 식별자

  • 소스 작업이 Amazon ECR에 있을 때의 리포지토리 이름 및 이미지 태그 키 파라미터 또는 콘솔 식별자

  • 소스 작업이 실행될 때의 리포지토리 이름 및 분기 이름 매개 변수 또는 콘솔 식별자 CodeCommit

이 문제를 해결하려면 다음 중 한 가지를 사용하십시오.

  • Amazon S3, Amazon ECR 또는 CodeCommit 에서 구성 설정을 변경하여 파라미터 값의 시작 부분이 변경되도록 하십시오. 예를 들어, 브랜치 이름을 release-branch에서 2nd-release-branch로 변경합니다. 이름 끝부분을 release-branch-2처럼 변경하지 마십시오.

  • Amazon S3, Amazon ECR 또는 CodeCommit 각 파이프라인의 구성 설정을 변경합니다. 예를 들어, 브랜치 이름을 myRepo/myBranch에서 myDeployRepo/myDeployBranch로 변경합니다. 이름 끝부분을 myRepo/myBranch2처럼 변경하지 마십시오.

  • AWS 관리 콘솔을 사용하는 대신, AWS 명령줄 인터페이스 (AWS CLI) 또는 CloudFormation AWS를 사용하여 변경 감지 이벤트 규칙을 생성하고 업데이트하십시오. Amazon S3 소스 작업에 대한 이벤트 규칙을 생성하는 방법에 대한 지침은 Amazon S3 소스 작업 및 CloudWatch 이벤트를 참조하십시오. Amazon ECR 작업에 대한 이벤트 규칙을 생성하는 방법에 대한 지침은 Amazon ECR 소스 작업 및 CloudWatch 이벤트를 참조하십시오. CodeCommit 작업에 대한 이벤트 규칙을 생성하는 방법에 대한 지침은 CodeCommit 소스 작업 및 CloudWatch 이벤트를 참조하십시오. 콘솔에서 작업 구성을 편집한 후에는 콘솔에서 생성한 업데이트된 변경 감지 리소스를 수락하합니다.

관련 리소스

추가 정보

또한, AWS CLI를 사용하여 AWS CloudFormation 템플릿을 배포할 수 있습니다. 자세한 내용은 설명서의 변환이 포함된 템플릿의 빠른 배포를 참조하십시오. CloudFormation