本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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
或更新版本 測試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 管道。
該圖顯示以下工作流程:
在來源階段, CodePipeline 會使用原始程式碼的 CodeCommit 儲存庫,包括範例 Python ETL任務 (
sample.py
)、單位測試檔案 (test_sample.py
) 和AWS CloudFormation 範本。然後,將最新的程式碼從主分支 CodePipeline 傳輸到 CodeBuild 專案以進行進一步處理。在建置和發佈階段,上一個來源階段的最新程式碼會在 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
檔案。在部署階段, CodeBuild 專案會啟動,如果所有測試都通過,專案會將程式碼發佈到 Amazon Simple Storage Service (Amazon S3) 儲存貯體。
使用者使用
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 事件。
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
準備要部署的程式碼封存。 |
| DevOps 工程師 |
建立 CloudFormation 堆疊。 |
堆疊會自動建立儲存 CodeCommit 庫,其中包含從 .zip 檔案簽入並上傳至 S3 儲存貯體的初始程式碼。此外,堆疊會使用 CodeCommit 儲存庫作為來源來建立 CodePipeline 檢視。在上述步驟中, CodeCommit 儲存庫為 aws-glue-unit-test,管道為 aws-glue-unit-test-pipeline 。 | AWS DevOps, DevOps 工程人員 |
清除環境中的資源。 | 為了避免額外的基礎設施成本,請務必在實驗此模式中提供的範例後刪除堆疊。
| AWS DevOps, DevOps 工程人員 |
任務 | 描述 | 所需的技能 |
---|---|---|
在管道中執行裝置測試。 |
| AWS DevOps, DevOps 工程人員 |
故障診斷
問題 | 解決方案 |
---|---|
具有 Amazon S3ECR、Amazon 或 CodeCommit 來源的管道不再自動啟動 | 如果您變更在 Amazon EventBridge 或 CloudWatch Events 中使用事件規則進行變更偵測的動作的任何組態設定,AWS則 Management Console 可能不會偵測到來源識別符相似且具有相同初始字元的變更。由於主控台不會建立新的事件規則,因此管道不會再自動啟動。 例如,將 CodeCommit 分支名稱從 這適用於下列來源動作,這些動作會在 CloudWatch 事件中使用事件進行變更偵測:
若要解決問題,請執行下列其中一項操作:
|
相關資源
其他資訊
此外,您可以使用 部署 AWS CloudFormation 範本AWSCLI。如需詳細資訊,請參閱 CloudFormation 文件中的使用轉換快速部署範本。