本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 pytest 框架在 AWS Glue 中对 Python ETL 作业运行单元测试
代码存储库:aw | 环境:生产 | 技术: DevOps; 大数据; 软件开发和测试 |
AWS 服务:AWS CloudFormation;AWS CodeBuild;AWS;AWS CodeCommit CodePipeline;AWS Glue |
Summary
您可以在本地开发环境中为 AWS Glue 的 Python 提取、转换和加载 (ETL) 作业运行单元测试,但是在 DevOps 管道中复制这些测试可能既困难又耗时。在 AWS 技术堆栈上对大型机 ETL 流程进行现代化改造时,单元测试可能特别具有挑战性。此模式向您展示了如何简化单元测试,同时保持现有功能完好无损,在发布新功能时避免中断关键应用程序功能,并维护高质量的软件。您可以使用此模式中的步骤和代码示例,通过使用 AWS 中的 pytest 框架,在 AWS Glue 中为 Python ETL 作业运行单元测试。 CodePipeline您也可以使用此模式来测试和部署多个 AWS Glue 作业。
先决条件和限制
先决条件
一个有效的 Amazon Web Services account
AWS Glue 库的 Amazon Elastic Container Registry (Amazon ECR) 映像 URI,从 Amazon ECR 公开映像浏览馆
下载 带有目标 Amazon Web Services account 和 Amazon Web Services Region 配置文件的 Bash 终端(在任何操作系统上)
Python 3.10
或更高版本 用于测试 AWS 服务的 Moto
Python 库
架构
技术堆栈
Amazon Elastic Container Registry (Amazon ECR)
AWS CodeBuild
AWS CodeCommit
AWS CodePipeline
AWS 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)
图表显示了以下工作流:
在源代码阶段, CodePipeline 使用 CodeCommit 存储库存储源代码,包括示例 Python ETL 作业 (
sample.py
)、单元测试文件 (test_sample.py
) 和 AWS CloudFormation 模板。然后,将最新的代码从主分支 CodePipeline 传输到 CodeBuild 项目以进行进一步处理。在构建和发布阶段,在 AWS Glue 公共 Amazon ECR 映像的帮助下,对上一个源代码阶段的最新代码进行了单元测试。然后,将测试报告发布到 CodeBuild 报告组。AWS Glue 库的 Amazon ECR 公共存储库中的容器镜像包括本地在 AWS Glue 中运行所需的所有二进制文件和PySpark基于
单元测试的 ETL 任务。公共容器存储库有三个映像标签,AWS Glue 支持的每个版本各有一个映像标签。出于演示目的,此模式使用了 glue_libs_4.0.0_image_01
映像标签。要在中 CodeBuild使用此容器映像作为运行时映像,请复制与您要使用的图像标签相对应的图像 URI,然后更新TestBuild
资源 GitHub 存储库中的pipeline.yml
文件。在部署阶段, CodeBuild 项目启动并发布到亚马逊简单存储服务 (Amazon S3) 存储桶(如果所有测试都通过)。
用户使用
deploy
文件夹中的 CloudFormation 模板部署 AWS Glue 任务。
工具
AWS 工具
Amazon Elastic Container Registry (Amazon ECR) 是一项安全、可扩展且可靠的托管容器映像注册表服务。
AWS CodeBuild 是一项完全托管的构建服务,可帮助您编译源代码、运行单元测试和生成可随时部署的项目。
AWS CodeCommit 是一项版本控制服务,可帮助您私下存储和管理 Git 存储库,而无需管理自己的源代码控制系统。
AWS CodePipeline 可帮助您快速建模和配置软件发布的不同阶段,并自动执行持续发布软件变更所需的步骤。
AWS Glue 是一项完全托管的 ETL 服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。
其他工具
代码
此模式的代码可在 GitHub aws-glue-jobs-unit-
src
文件夹中基于 Python 的 AWS Glue 示例作业tests
文件夹中的关联单元测试用例(使用 pytest 框架构建)文件夹中的 CloudFormation 模板(用 YAML 编写)
deploy
最佳实践
CodePipeline 资源安全
最佳做法是对连接到您的管道的源存储库使用加密和身份验证 CodePipeline。有关更多信息,请参阅 CodePipeline 文档中的安全最佳实践。
监控和记录 CodePipeline 资源
最佳做法是使用 AWS 日志记录功能来确定用户在您的账户中执行了哪些操作以及他们使用了哪些资源。日志文件显示以下内容:
操作的时间和日期
操作的源 IP 地址
由于权限不足而失败的操作
AWS CloudTrail 和 Amazon Ev CloudWatch ents 中提供了日志功能。您可以使用 CloudTrail 记录由您的 AWS 账户或代表您的 AWS 账户进行的 AWS API 调用和相关事件。有关更多信息,请参阅 CodePipeline 文档 CloudTrail中的使用 AWS 记录 CodePipeline API 调用。
您可以使用 CloudWatch 事件来监控您的 AWS 云资源和在 AWS 上运行的应用程序。您也可以在 CloudWatch 事件中创建警报。有关更多信息,请参阅 CodePipeline 文档中的监控 CodePipeline 事件。
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
准备代码存档以进行部署。 |
| DevOps 工程师 |
创建 CloudFormation 堆栈。 |
堆栈会自动创建一个 CodeCommit 存储库,其中包含从.zip 文件中签入并上传到 S3 存储桶的初始代码。此外,堆栈使用 CodeCommit 存储库作为源来创建 CodePipeline 视图。在上面的步骤中, CodeCommit 存储库是 aws-glue-unit-test,而管道是 aws-glue-unit-test-pipel ine。 | AWS DevOps, DevOps 工程师 |
在环境中清理资源。 | 为避免额外的基础设施成本,请务必在尝试此模式中提供的示例后删除堆栈。
| AWS DevOps, DevOps 工程师 |
任务 | 描述 | 所需技能 |
---|---|---|
运行管线中的单元测试。 |
| AWS DevOps, DevOps 工程师 |
故障排除
问题 | 解决方案 |
---|---|
带有 Amazon S3、Amazon ECR 或 CodeCommit 源的管道不再自动启动 | 如果您更改了使用 Amazon 中的事件规则 EventBridge 或 CloudWatch 事件进行更改检测的操作的任何配置设置,AWS 管理控制台可能无法检测到源标识符相似且初始字符相同的更改。由于新的事件规则不是由控制台创建的,因此管道不再自动启动。 例如,将 CodeCommit 分支名称从更改 这适用于以下使用事件中的 CloudWatch 事件进行更改检测的源操作:
要解决此问题,可以执行下列操作之一:
|
相关资源
其他信息
此外,您可以使用 AWS CLI 部署 AWS CloudFormation 模板。有关更多信息,请参阅 CloudFormation 文档中的使用转换快速部署模板。