使用 pytest 框架在 AWS Glue 中对 Python ETL 作业运行单元测试 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 pytest 框架在 AWS Glue 中对 Python ETL 作业运行单元测试

代码存储库:aw s-glue-jobs-unit-testing

环境:生产

技术: 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 或更高版本

  • Pytest

  • 用于测试 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 流程的单元测试

图表显示了以下工作流:

  1. 在源代码阶段, CodePipeline 使用 CodeCommit 存储库存储源代码,包括示例 Python ETL 作业 (sample.py)、单元测试文件 (test_sample.py) 和 AWS CloudFormation 模板。然后,将最新的代码从主分支 CodePipeline 传输到 CodeBuild 项目以进行进一步处理。

  2. 在构建和发布阶段,在 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文件。

  3. 在部署阶段, CodeBuild 项目启动并发布到亚马逊简单存储服务 (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 是一个用于编写小型单元测试的框架,单元测试可扩展以支持应用程序和库的复杂功能测试。

  • 适用于 AWS Glue 的 Pyth@@ on ETL 库是 Python 库的存储库,这些库用于本地开发 AWS Glue 的 PySpark 批处理作业。

代码

此模式的代码可在 GitHub aws-glue-jobs-unit- testing 存储库中找到。存储库包含以下资源:

  • 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 事件

操作说明

任务描述所需技能

准备代码存档以进行部署。

  1. code.zip从 GitHub aws-glue-jobs-unit- testing 存储库下载,或者使用命令行工具自己创建.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. 登录 Amazon Web Services Management Console并选择您选择的 Amazon Web Services Region。

  3. 创建 S3 存储桶,然后将 .zip 压缩包和(之前已下载的)code.zip 文件上传到您创建的 S3 存储桶。

DevOps 工程师

创建 CloudFormation 堆栈。

  1. 登录 AWS 管理控制台,然后打开CloudFormation 控制台

  2. 选择创建堆栈,然后选择使用现有的资源(导入资源)

  3. 在 “创建堆栈” 页面的 “指定模板” 部分,选择 “上传模板文件”,然后选择 pipeline.yml 模板(从存储库下载)。 GitHub 然后选择下一步

  4. 对于堆栈名称,请输入 glue-unit-testing-pipeline,或者选择您选择的堆栈名称。

  5. 对于ApplicationStack名称,请使用预先填充的 g lue-codepipeline-app 名称。这是管道创建的 CloudFormation 堆栈的名称。

  6. 对于 BranchName,请使用预先填充的主名称。这是在 CodeCommit 存储库中创建的分支的名称,用于签入 S3 存储桶的.zip 文件中的代码。

  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,请使用预先填充的 g lue-unittest- report 名称。这是为存储单元 CodeBuild 测试报告而创建的测试报告组的名称。

  11. 选择下一步,然后在配置堆栈选项页面上再次选择下一步

  12. 在 “查看” 页面的 “能力” 下,选择 “我确认 CloudFormation 可能会使用自定义名称创建 IAM 资源” 选项。

  13. 选择提交。堆栈创建完成后,您可以在资源选项卡上看到已创建的资源。创建堆栈需要约 5-7 分钟的时间。

堆栈会自动创建一个 CodeCommit 存储库,其中包含从.zip 文件中签入并上传到 S3 存储桶的初始代码。此外,堆栈使用 CodeCommit 存储库作为源来创建 CodePipeline 视图。在上面的步骤中, CodeCommit 存储库是 aws-glue-unit-test,而管道是 aws-glue-unit-test-pipel ine。

AWS DevOps, DevOps 工程师

在环境中清理资源。

为避免额外的基础设施成本,请务必在尝试此模式中提供的示例后删除堆栈。

  1. 打开CloudFormation 控制台,然后选择您创建的堆栈。

  2. 选择删除。这将删除您的堆栈创建的所有资源,包括 CodeCommit 存储库、AWS Identity and Access Management (IAM) 角色或策略以及 CodeBuild 项目。

AWS DevOps, DevOps 工程师
任务描述所需技能

运行管线中的单元测试。

  1. 要测试已部署的管道,请登录 AWS 管理控制台,然后打开CodePipeline 控制台

  2. 选择 CloudFormation 堆栈创建的管道,然后选择 Rele ase change。管道开始运行(使用 CodeCommit 存储库中的最新代码)。

  3. Test_and_Build 阶段完成后,选择详细信息选项卡,然后检查日志。

  4. 选择报告选项卡,然后从报告历史记录中选择测试报告以查看单元测试结果。

  5. 部署阶段完成后,在 AWS Glue 控制台上运行和监控已部署的 AWS Glue 作业。有关更多信息,请参阅 AWS Glue 文档中的监控 AWS Glue

AWS DevOps, DevOps 工程师

故障排除

问题解决方案

带有 Amazon S3、Amazon ECR 或 CodeCommit 源的管道不再自动启动

如果您更改了使用 Amazon 中的事件规则 EventBridge 或 CloudWatch 事件进行更改检测的操作的任何配置设置,AWS 管理控制台可能无法检测到源标识符相似且初始字符相同的更改。由于新的事件规则不是由控制台创建的,因此管道不再自动启动。

例如,将 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) Line Interface 或 CloudFormation AWS 来创建和更新您的变更检测事件规则。有关为 Amazon S3 源操作创建事件规则的说明,请参阅 Amazon S3 源操作和 CloudWatch 事件。有关为 Amazon ECR 操作创建事件规则的说明,请参阅 Amazon ECR 源操作和 CloudWatch 事件。有关为操作创建事件规则的 CodeCommit 说明,请参阅CodeCommit 源操作和 CloudWatch 事件。在控制台中编辑操作配置后,接受控制台创建的已更新的更改检测资源。

相关资源

其他信息

此外,您可以使用 AWS CLI 部署 AWS CloudFormation 模板。有关更多信息,请参阅 CloudFormation 文档中的使用转换快速部署模板