## 视频
<video src="https://dev-media.amazoncloud.cn/30-LibaiGenerate/31-LiBaiRebrandingVideo/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT_-LBrebrandingWCaptionCN.mp4" class="bytemdVideo" controls="controls"></video>
## 导读
您是否正在使用 Python 开发Amazon Lambda 函数?总是在寻找使您更高效的工具?如果您可以直接从从业者那里听到呢?本论坛涵盖 Python 项目设置、测试、分析、部署和操作的固执己见的方法。了解许多开源工具,包括用于Amazon Lambda 的 Powertools,这是一个可以帮助您实现 Serverless 最佳实践并提高开发人员速度的工具包。加入以发现使用 Python 进行有效的 Serverless 开发的工具和模式。为了最大限度地提高学习体验,本论坛包括一个实现所描述内容的示例应用程序。
## 演讲精华
<font color = "grey">以下是小编为您整理的本次演讲的精华,共1500字,阅读时间大约是8分钟。如果您想进一步了解演讲内容或者观看演讲全文,请观看演讲完整视频或者下面的演讲原文。</font>
穆罕默德与罗恩在re:Invent上以专业的方式分享了关于构建[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)应用程序的过程。作为亚马逊云科技的Power Tools首席架构师,穆罕默德对那些在早上8点参加关于“实用的[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)Python开发者”的开源讲座的70到80名与会者表示感谢。他强调,在繁忙的re:Invent日程中,他们的时间是非常宝贵的。
罗恩,他在CyberArk担任专注于亚马逊云科技和[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)的首席软件架构师,也参与了分享。CyberArk依赖于亚马逊云科技在全球范围内安全地提供其特权访问管理解决方案。
穆罕默德解释了实用主义的核心概念,即根据独特的背景做出实际决策,而不是盲目遵循通用的“最佳实践”。团队的技能、可用的工具以及项目环境的特定因素都会影响正确的技术选择和架构。适用于一个团队的建议可能对另一个团队无效,尽管看起来像是“正确”的处方。
穆罕默德介绍了他们在实用主义方面的工作,包括三个关键领域:
1)解释实用主义的本质及其重要性
2)将实用主义应用于同步API使用案例
3)将实用主义应用于异步基于事件的处理
他指出,他们将重点介绍四个相关的开源工具,虽然有许多优秀的选项:
1)MkDocs - 被超过100,000个开源项目使用的文档系统
2)PyTest - 一个广泛使用的Python测试框架
3)Identic - 提供数据验证功能
4)Power Tools for Amazon Web Services Lambda - 亚马逊内部使用的实用主义加速器
在解释从开源中学到的经验时,穆罕默德描述了一个常见的GitHub工作流程。新贡献者需要入门检查代码,设置本地环境,安装依赖项,通过提交钩子,等等。开源项目适应不同的技能水平,因此他们在提交阶段就包含了对安全性、凭证和治理的基线检查。在拉取请求合并之前,还会验证文档链接是否有效。
梅赫梅特强调在技术实践中应遵循经过验证的方法,而非盲目采用开源解决方案。他以持续集成为例,指出需要根据技术栈和业务逻辑进行定制。明智地运用开源意味着要充分了解自身的特定环境。
在介绍如何使用案例的过程中,梅赫梅特阐述了构建具备创建、读取、更新和删除功能的API的过程。这个过程包括了使用API Gateway、Lambda函数和DynamoDB的同步流程,以及利用EventBridge处理大量事件的异步部分。尽管API模式较为常见,但事件驱动的架构也带来了独特的设计挑战。
在概述这些概念后,梅赫梅特让罗恩上台,展示如何实际操作同步API部分。
罗恩强调了[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)应用的四要素:基础设施代码、领域逻辑代码、测试和生产就绪性。他指出,Lambda函数包含了与DynamoDB等预留资源互动的业务领域代码。测试涵盖了基础设施和领域逻辑两层。生产就绪性则涉及诸如自动扩展、安全和备份等功能。例如,客户可以使用亚马逊云科技的Lambda进行扩展,DynamoDB进行存储,并使用CloudWatch进行指标。
罗恩提倡开发者应对整个栈拥有所有权,以便更快速地交付业务价值。为了实现清晰的代码组织,他建议在项目中设立单独的文件夹,分别用于领域代码、基础设施设置、测试和生产配置。
关于依赖项,罗恩推荐使用单个pyproject.toml文件,以便于测试和本地执行。
对于基础设施即代码,罗恩偏爱使用亚马逊云科技的CDK,通过封装相关资源和配置的领域驱动构造来实现。客户可以创建一个“订单API”构造,它连接了所需的Lambda函数、API Gateway和DynamoDB表。
在展示一个创建产品的示例Lambda函数的实现策略时,罗恩展示了两种实施方案。直接的方案是将所有逻辑都放在处理器中——输入验证、数据库调用和响应序列化;而更灵活的方案则是将逻辑分解为独立的函数或组件。
尽管起初非常简单,但随着功能复杂性的增加,这也带来了维护方面的问题。罗恩通过将核心领域逻辑提取至单独的层次,展示了如何处理程序的关键职责的更干净分离。这样的分离使得处理程序之间的代码重用大幅增加,同时使测试更具隔离性。
罗恩强调了从处理程序中分离数据访问代码的集成层的重要性。这个集成层实现了通用接口,同时将业务逻辑与底层数据存储隔离开来。
为了展示这种灵活性,罗恩提供了一个从DynamoDB切换到[Amazon Aurora](https://aws.amazon.com/cn/rds/aurora/?trk=cndc-detail)的实际案例,只需更改注入的数据访问实现即可。领域层在此过程中保持稳定。
这种方法提供了卓越的灵活性,并提高了各个层次的可测试性。客户可以轻松地更换数据库或数据模型,而无需重写业务逻辑。
在测试方面,罗恩的目标是为开发者提供高效且无需离开IDE的开发体验。他希望开发者能够本地调试Lambda函数,设置断点,并从他们的编辑器中使用真实的云资源。
罗恩概述了经典的测试金字塔,从底部模块和函数的快速单元测试开始。他分享了一些在没有依赖任何亚马逊云科技的情况下检验域逻辑的PyTest示例。
位于金字塔中间的集成测试需要在部署一个用于真实云连接的栈的同时,在本地运行。它们可以调用模拟输入的函数,但在调用处理程序时需要使用真实的云资源。
罗恩使用了Power Tools工具来生成API Gateway式的测试事件。他展示了如何使用模拟输入调用本地处理程序并设置断点,以及如何调用DynamoDB并断言HTTP响应。
采用这种驱动测试的方法可以提高信心,并在部署之前预防配置问题。客户也可以使用类似的方式进行测试驱动的开发。
端到端测试位于金字塔的顶部,完全在亚马逊云科技中运行。这些测试验证了生产环境和工作流程是否正常运行。
罗恩展示了如何通过调用实时API并在云中断言响应来进行端到端测试。他还强调了测试错误输入和安全场景的重要性,以便在生产之前发现并解决问题。
穆罕默德详细研究了罗恩提供的关于项目结构、处理器、域逻辑、集成层和测试方面的实用建议。随后,他对异步、事件驱动架构的特殊考虑进行了深入的探讨。尽管项目的整体布局依然保持不变,但通过使用不同的事件类型和lambda处理器,可以实现更简单的设计。与封装逻辑不同的是,穆罕默德采用了异步处理器,它将事件处理器作为依赖项注入到领域层中,并在测试过程中允许控制调用。为了实现集成层,他们创建了一个事件提供器抽象,以便在不同传输选项(如EventBridge或SNS)之间发送标准化的事件。穆罕默德还分享了他如何将领域模型中的事件转换为标准结构,并添加必要的元数据,以便在其他团队、服务和应用程序中进行调试。事件提供者会处理将错误适当地包装,以针对特定的传递机制(如EventBridge)进行优化,并简化了在未来客户需求发生变化时切换到其他传输方式的过程。在进行异步流程测试时,穆罕默德强调传统模拟和支架方法并不足够。他建议使用假的事件处理器捕获内存中的事件以进行断言的方法。通过生成测试事件,初始化假处理器,调用他的lambda函数,并在假处理器中接收的事件上进行断言。此外,假处理器还可以使用Python魔法方法(如__len__)简化断言过程。为了测试整个异步流程,穆罕默德还设置了自定义的EventBridge规则,将测试事件路由到DynamoDB进行验证。这样可确保事件能够从实时lambda函数正确发出。近期,穆罕默德推出了一款名为亚马逊云科技集成应用测试工具包的新产品,该工具可以自动处理之前需要自定义代码的测试基础设施供应问题。在向生产就绪状态过渡的过程中,穆罕默德强调了Power Tools所提供的相关功能,包括验证、密钥管理、批处理等。他还使用了Tunal来可视化导入依赖项并识别昂贵的模块。Pyinstrument可以帮助分析代码的特定部分,以发现优化的机会。此外,他还推荐使用自动化性能测试来防止性能退化,并通过增加内存实现冷启动速度提高70%。这些工具都有助于客户优化他们的[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)应用程序。
在总结中,穆罕默德详细阐述了实用主义的五大支柱,包括项目结构、处理过程、领域逻辑、集成层和测试。他强调了在采用开源解决方案或架构模式时,要充分考虑其独特的上下文和需求的重要性。
穆罕默德和罗恩共同开发了一款新的项目模板,内置了这些最佳实践,旨在帮助团队节省大量时间。演讲结束后,穆罕默德邀请与会者继续在展台与他们交流,并期待对实用主义哲学的反馈。
**下面是一些演讲现场的精彩瞬间:**
领导者承认,在启动新项目时,开发者通常会面临如何选择合适技术和架构的困境。
![](https://d1trpeugzwbig5.cloudfront.net/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT_/images/rebranded/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT__0.png)
在本次会议上,开源工具得到了广泛推广,使得编写文档、进行测试以及[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)应用的开发变得更加简单且愉悦。
![](https://d1trpeugzwbig5.cloudfront.net/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT_/images/rebranded/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT__1.png)
演讲者强调了预提交检查、预请求检查和拉取请求检查在亚马逊云科技项目中安全性和管理方面的关键作用。
![](https://d1trpeugzwbig5.cloudfront.net/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT_/images/rebranded/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT__2.png)
演讲者展示了一个简单的Lambda函数是如何通过创建新的依赖项和使用事件源来进行测试的,这个函数是基于业务逻辑来触发事件的。
![](https://d1trpeugzwbig5.cloudfront.net/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT_/images/rebranded/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT__3.png)
演讲者强调了事件提供者如何屏蔽服务间的差异,使得在不同的事件服务(如EventBridge和SNS)之间轻松切换成为可能。
![](https://d1trpeugzwbig5.cloudfront.net/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT_/images/rebranded/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT__4.png)
演讲者邀请观众提供反馈,以便帮助他们改进未来的会议。
![](https://d1trpeugzwbig5.cloudfront.net/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT_/images/rebranded/OPN305-R-The_pragmatic_serverless_Python_developer__REPEAT__5.png)
## 总结
演讲者在探讨如何利用Python构建实用[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)应用方面提供了见解。他们认为在编写代码时应根据具体情境进行判断,而非盲目遵循所谓的最佳实践。首先,他们概述了一种结构化的项目架构,将处理程序、业务逻辑和集成划分为不同层次。这种划分有助于提高代码的重用性和可测试性。接下来,他们还展示了如何进行有效测试的方法,包括单元测试、集成测试和端到端测试。单元测试旨在检验组件的独立性;集成测试则通过从本地IDE调用在云端部署的资源以提高信任度;而端到端测试则是为了验证整个系统的完整部署。最后,他们通过使用分析工具来监控应用的运行状况,从而帮助优化性能。同时,遵循开源的原则也通过广泛测试提升了稳定性。总之,要构建实用的[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)应用,需要对诸如框架、设计模式和测试策略等多种选项进行评估。并没有一种通用的最优解。关注目标和要求,选择最适合您及团队的具体方案是关键。
## 演讲原文
## 想了解更多精彩完整内容吗?立即访问re:Invent 官网中文网站!
[2023亚马逊云科技re:Invent全球大会 - 官方网站](https://webinar.amazoncloud.cn/reInvent2023/?s=8739&smid=19458 "2023亚马逊云科技re:Invent全球大会 - 官方网站")
[点击此处](https://aws.amazon.com/cn/new/?trk=6dd7cc20-6afa-4abf-9359-2d6976ff9600&trk=cndc-detail "点击此处"),一键获取亚马逊云科技全球最新产品/服务资讯!
[点击此处](https://www.amazonaws.cn/new/?trk=2ab098aa-0793-48b1-85e6-a9d261bd8cd4&trk=cndc-detail "点击此处"),一键获取亚马逊云科技中国区最新产品/服务资讯!
## 即刻注册亚马逊云科技账户,开启云端之旅!
[【免费】亚马逊云科技“100 余种核心云服务产品免费试用”](https://aws.amazon.com/cn/campaigns/freecenter/?trk=f079813d-3a13-4a50-b67b-e31d930f36a4&sc_channel=el&trk=cndc-detail "【免费】亚马逊云科技“100 余种核心云服务产品免费试用“")
[【免费】亚马逊云科技中国区“40 余种核心云服务产品免费试用”](https://www.amazonaws.cn/campaign/CloudService/?trk=2cdb6245-f491-42bc-b931-c1693fe92be1&sc_channel=el&trk=cndc-detail "【免费】亚马逊云科技中国区“40 余种核心云服务产品免费试用“")