使用 pytest 架構在 AWS Glue 中執行 Python ETL任務的單位測試 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 pytest 架構在 AWS Glue 中執行 Python ETL任務的單位測試

由 Praveen Kumar Jeyarajan (AWS) 和 Vaidy Sankaran (AWS) 建立

程式碼儲存庫: aws-glue-jobs-unit- 測試

環境:生產

技術: DevOps;大數據; DevelopmentAndTesting

AWS 服務:AWS CloudFormation;AWS CodeBuild;AWS CodeCommit;AWS CodePipeline;AWSGlue

Summary

您可以在本機開發環境中執行 Glue 的 Python AWS 擷取、轉換和載入 (ETL) 任務的單元測試,但在 DevOps 管道中複寫這些測試可能既困難又耗時。當您在AWS技術堆疊上現代化大型主機ETL程序時,單元測試特別具有挑戰性。此模式說明如何簡化單元測試,同時保持現有功能完整,避免在您發行新功能時中斷關鍵應用程式功能,以及維護高品質軟體。您可以使用此模式中的步驟和程式碼範例,透過使用 中的 pytest 架構,在 AWS Glue 中執行 Python ETL任務的單位測試AWS CodePipeline。您也可以使用此模式來測試和部署多個 AWS Glue 任務。

先決條件和限制

先決條件

  • 作用中AWS帳戶

  • 從 Amazon Public Gallery 下載URI的 AWS Glue 程式庫的 Amazon Elastic Container Registry (Amazon ECR) 映像 ECR

  • 具有目標AWS帳戶和AWS區域設定檔的 Bash 終端 (在任何作業系統上)

  • Python 3.10 或更新版本

  • Pytest

  • 測試AWS服務的 Moto Python 程式庫

架構

技術堆疊

  • Amazon Elastic Container Registry (Amazon ECR)

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • AWS Glue

  • Pytest

  • Python

  • Glue 的 Python AWS ETL程式庫

目標架構

下圖說明如何將以 Python AWS 為基礎的 Glue ETL 程序單元測試納入典型的企業規模AWS DevOps 管道。

Glue AWS 程序的單位測試 ETL

該圖顯示以下工作流程:

  1. 在來源階段, CodePipeline 會使用原始程式碼的 CodeCommit 儲存庫,包括範例 Python ETL任務 (sample.py)、單位測試檔案 (test_sample.py) 和AWS CloudFormation 範本。然後,將最新的程式碼從主分支 CodePipeline 傳輸到 CodeBuild 專案以進行進一步處理。

  2. 在建置和發佈階段,上一個來源階段的最新程式碼會在 Glue AWS 公有 Amazon ECR映像的協助下進行單元測試。然後,測試報告會發佈至 CodeBuild 報告群組。公用 Amazon Glue AWS 儲存ECR庫中的容器映像包含 AWSGlue 本機執行和單位測試PySpark型ETL任務所需的所有二進位檔案。公有容器儲存庫有三個映像標籤,一個適用於 Glue AWS 支援的每個版本。為了示範目的,此模式會使用glue_libs_4.0.0_image_01映像標籤。若要在 中使用此容器映像作為執行期映像 CodeBuild,請複製URI對應至您要使用之映像標籤的映像,然後更新TestBuild資源儲存 GitHub 庫中的pipeline.yml檔案。

  3. 在部署階段, CodeBuild 專案會啟動,如果所有測試都通過,專案會將程式碼發佈到 Amazon Simple Storage Service (Amazon S3) 儲存貯體。

  4. 使用者使用 deploy 資料夾中的 CloudFormation 範本來部署 AWS Glue 任務。

工具

AWS 工具

  • Amazon Elastic Container Registry (Amazon ECR) 是一種受管容器映像登錄服務,安全、可擴展且可靠。

  • AWS CodeBuild 是一項完全受管建置服務,可協助您編譯原始程式碼、執行單位測試,並產生準備好部署的成品。

  • AWS CodeCommit 是一種版本控制服務,可協助您私有儲存和管理 Git 儲存庫,而無需管理您自己的來源控制系統。

  • AWS CodePipeline 可協助您快速建模和設定軟體版本的不同階段,並自動執行持續發行軟體變更所需的步驟。

  • AWS Glue 是完全受管ETL的服務。它可協助您在資料存放區和資料串流之間可靠地分類、清除、擴充和移動資料。

其他工具

  • Python 是一種高階、解譯的一般用途程式設計語言。

  • Moto 是用於測試 AWS 服務的 Python 程式庫。

  • Pytest 是一種用於撰寫小型單位測試的架構,可進行擴展以支援應用程式和程式庫的複雜功能測試。

  • Python ETL Library for AWS Glue 是 Python Library 的儲存庫,用於 Glue AWS PySpark 批次任務的本機開發。

Code

此模式的程式碼可在 GitHubaws-glue-jobs-unit測試儲存庫中使用。儲存庫包含下列資源:

  • src 資料夾中以 Python 為基礎的 AWS Glue 任務範例

  • tests 資料夾中相關聯的單位測試案例 (使用 pytest 架構建置)

  • deploy 資料夾中的 CloudFormation 範本 (寫入於 YAML)

最佳實務

CodePipeline 資源的安全性

最佳實務是對連線至 中管道的來源儲存庫使用加密和身分驗證 CodePipeline。如需詳細資訊,請參閱 CodePipeline 文件中的安全最佳實務

資源的監控和記錄 CodePipeline

最佳實務是使用AWS記錄功能來判斷使用者在帳戶中採取的動作,以及他們使用的資源。日誌檔案顯示以下內容:

  • 動作的時間和日期

  • 動作的來源 IP 地址

  • 哪些動作因許可不足而失敗

記錄功能可在 AWS CloudTrail 和 Amazon CloudWatch Events 中使用。您可以使用 CloudTrail 來記錄由 帳戶或代表AWS您的帳戶進行的AWSAPI呼叫和相關事件。如需詳細資訊,請參閱 CodePipeline 文件中的使用 記錄 CodePipeline API通話AWS CloudTrail

您可以使用 CloudWatch Events 來監控在 上執行的AWS雲端資源和應用程式AWS。您也可以在 CloudWatch Events 中建立提醒。如需詳細資訊,請參閱 CodePipeline 文件中的監控 CodePipeline 事件

史詩

任務描述所需的技能

準備要部署的程式碼封存。

  1. code.zip 從 GitHubaws-glue-jobs-unit測試儲存庫下載,或使用命令列工具自行建立 .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 管理主控台,然後選擇您選擇的AWS區域。

  3. 建立 S3 儲存貯體 ,然後將 .zip 套件和code.zip檔案 (先前已下載) 上傳到您建立的 S3 儲存貯體。

DevOps 工程師

建立 CloudFormation 堆疊。

  1. 登入 AWS 管理主控台,然後開啟CloudFormation 主控台

  2. ChooseCreate 堆疊 ,然後選擇使用現有資源 (匯入資源)

  3. 建立堆疊頁面的指定範本區段中,選擇上傳範本檔案 ,然後選擇pipeline.yml 範本 (從 GitHub 儲存庫下載)。然後選擇下一步

  4. 對於堆疊名稱 ,輸入 glue-unit-testing-pipeline或選擇您選擇的堆疊名稱。

  5. 對於 ApplicationStackName,請使用預先填入glue-codepipeline-app的名稱。這是管道建立的 CloudFormation 堆疊名稱。

  6. 對於 BranchName,請使用預先填入的主名稱。這是在 CodeCommit 儲存庫中建立的分支名稱,用於從 S3 儲存貯體的 .zip 檔案檢查程式碼。

  7. 對於 BucketName,請使用預先填入的 aws-glue-artifacts-us-east-1 儲存貯體名稱。這是 S3 儲存貯體的名稱,其中包含 .zip 檔案,且由管道用來存放程式碼成品。

  8. 對於 CodeZipFile,請使用預先填入的 code.zip 值。這是範例程式碼 S3 物件的金鑰名稱。物件應為 .zip 檔案。

  9. 對於 RepositoryName,請使用預先填入aws-glue-unit-testing的名稱。這是堆疊建立的 CodeCommit 儲存庫名稱。

  10. 對於 TestReportGroupName,請使用預先填入glue-unittest-report的名稱。這是為存放單位 CodeBuild 測試報告而建立的測試報告群組名稱。

  11. ChooseNext ,然後在設定堆疊選項頁面上再次選擇下一步

  12. 檢閱頁面的功能 下,選擇我確認 CloudFormation 可能會使用自訂名稱選項建立IAM資源

  13. 選擇提交。堆疊建立完成後,您可以在資源索引標籤上看到建立的資源。建立堆疊大約需要 5-7 分鐘。

堆疊會自動建立儲存 CodeCommit 庫,其中包含從 .zip 檔案簽入並上傳至 S3 儲存貯體的初始程式碼。此外,堆疊會使用 CodeCommit 儲存庫作為來源來建立 CodePipeline 檢視。在上述步驟中, CodeCommit 儲存庫為 aws-glue-unit-test,管道為 aws-glue-unit-test-pipeline

AWS DevOps, DevOps 工程人員

清除環境中的資源。

為了避免額外的基礎設施成本,請務必在實驗此模式中提供的範例後刪除堆疊。

  1. 開啟CloudFormation 主控台 ,然後選取您建立的堆疊。

  2. 選擇 刪除 。這將刪除堆疊建立的所有資源,包括 CodeCommit 儲存庫、 AWS Identity and Access Management (IAM) 角色或政策,以及 CodeBuild 專案。

AWS DevOps, DevOps 工程人員
任務描述所需的技能

在管道中執行裝置測試。

  1. 若要測試部署的管道,請登入 AWS 管理主控台,然後開啟CodePipeline 主控台

  2. 選取 CloudFormation 堆疊建立的管道,然後選擇釋放變更 。管道開始執行 (使用 CodeCommit 儲存庫中最新的程式碼)。

  3. 測試_和_建置階段完成後,選擇詳細資訊索引標籤,然後檢查日誌。

  4. 選擇報告索引標籤,然後從報告歷史記錄中選擇測試報告,以檢視單位測試結果。

  5. 部署階段完成後,請在 AWS Glue 主控台上執行並監控部署的 Glue AWS 任務。如需詳細資訊,請參閱 AWS Glue 文件中的監控 AWS Glue。

AWS DevOps, DevOps 工程人員

故障診斷

問題解決方案

具有 Amazon S3ECR、Amazon 或 CodeCommit 來源的管道不再自動啟動

如果您變更在 Amazon EventBridge 或 CloudWatch Events 中使用事件規則進行變更偵測的動作的任何組態設定,AWS則 Management Console 可能不會偵測到來源識別符相似且具有相同初始字元的變更。由於主控台不會建立新的事件規則,因此管道不會再自動啟動。

例如,將 CodeCommit 分支名稱從MyTestBranch-2 變更為 MyTestBranch-1是次要變更。由於變更位於分支名稱的結尾,因此來源動作的事件規則可能不會更新或建立新來源設定的規則。

這適用於下列來源動作,這些動作會在 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 CLI) 或 AWS CloudFormation 來建立和更新變更偵測事件規則,而不是使用 AWS 管理主控台。如需為 Amazon S3 來源動作建立事件規則的指示,請參閱Amazon S3 來源動作和 CloudWatch 事件 。如需為 Amazon ECR動作建立事件規則的指示,請參閱Amazon ECR來源動作和 CloudWatch 事件 。如需為 CodeCommit 動作建立事件規則的指示,請參閱CodeCommit 來源動作和 CloudWatch 事件 。在主控台中編輯動作組態後,請接受主控台建立的更新變更偵測資源。

相關資源

其他資訊

此外,您可以使用 部署 AWS CloudFormation 範本AWSCLI。如需詳細資訊,請參閱 CloudFormation 文件中的使用轉換快速部署範本