为了账号安全,请及时绑定邮箱和手机立即绑定

掌握您的AWS无服务器运行时:如何使用AWS SAM构建和部署自定义AWS Lambda层

标签:
云计算 AWS

Chipmunks在AWS云里,[Bishr Tabbaa作品,来源:Poe.com]

概述

我已经与使用 AWS 的客户合作了几年,处理他们的无服务器工作负载,其中一个有趣的角度是关于在生产环境中设计和操作无服务器工作负载时如何有效地管理长期变更。虽然 AWS API Gateway、AWS Lambda 和 Amazon DynamoDB 可以分别管理核心的网络、计算和数据库基础设施,但仍然存在管理应用程序代码和数据变更的必要任务。在深入探讨 Lambda 等具体层时,仍然存在实际的限制,例如并发性、CPU、内存、配额等。甚至您的代码所依赖的 Lambda 运行环境 也具有生命周期,因此在特定时间只会支持少数几个运行环境。截至本文撰写时(2024年8月),Lambda 提供了 Python(5)、NodeJS(3)、Java(2)、C#(2)和 Ruby(2)的托管运行环境,如果您需要对操作系统和语言有更多的控制,还有适用于 仅操作系统运行环境 的选项。例如,您可能会注意到,在旧版本的 Python(如运行时 v3.7 中的 requests)中可用的库会被逐渐弃用,并且在 新版本 中不再可用,这是为了满足性能、安全性和可扩展性的要求。一个特定的运行环境可能持续数年,并且它被弃用通常会提前一年宣布,以给予充分的警告和时间来做出下游更改。

本文是一个两部分的博客系列,目的是向您展示如何通过打包应用程序所需的库文件来有效地管理Lambda运行时的生命周期变化,不论何时发生Lambda运行时生命周期的变化,您都可以快速适应,而无需过多麻烦。本博客的第一部分将介绍如何构建和打包自定义库作为AWS Lambda层,然后使用AWS无服务器应用程序模型(SAM)部署Lambda函数。第二部分将介绍如何将整个函数及其依赖项打包为Docker容器,然后使用SAM部署函数。如果函数相对较小,依赖项较小,并且在开发过程中需要使用AWS Lambda代码编辑器,则可能更适合采用第一个基于AWS Lambda层的方法。另一方面,如果您需要更多控制库以及应用程序所需的自定义组件和配置,则可能更倾向于选择第二个基于Docker容器的方法。如果您已经使用容器处理工作负载并经常管理应用程序可用的库作为容器层,则第二种方法可能更适合。

AWS Lambda 层

关于 AWS Lambda 层

AWS Lambda 层(Layers)(来自AWS)

AWS Lambda 层是一个 .zip 归档文件,其中包含额外的代码或数据。层通常包含库依赖项、自定义运行时,或配置文件等。Lambda 层具有以下优势:

  • 减小部署包的大小
  • 将核心功能逻辑与依赖项分开
  • 在多个函数间共享依赖项
  • 使用Lambda控制台中的代码编辑器

当您为函数添加一个层时,Lambda 会将层的内容提取到函数执行环境的 /opt 目录中,并且所有原生支持的 Lambda 运行时都将 /opt 目录下的层子文件夹包含到 PATH 环境变量中。您可以为每个函数添加最多 五个 层。要创建一个层,可以将依赖项打包成一个 .zip 文件存档。由于 Lambda 函数运行在 Amazon Linux 上,该层必须能够在 Linux 环境中进行编译和构建。然后在 Lambda 中创建该层。最后,将该层添加到您的函数中。由于层是经过版本控制的,您必须在函数中指定要使用的具体层版本。

情景设定

最近我不得不重写我的SageMaker成本优化Lambda函数,以添加对MLflow的支持。此功能在Lambda默认的Python运行时中尚不可用,但在AWS发布的最新boto3库中可用。当我最初编写该函数时,它运行得很好,因为我安装了最新版本的boto3,但无法在Lambda Python 3.12运行时中运行。因此,我打包了boto3库,创建了一个自定义的Lambda层,然后使用AWS SAM重新部署来简化整个过程。

SageMaker 成本优化 SAM 应用程序(来源:Bishr Tabbaa)

构建并部署 Lambda 层

     mkdir python  # 创建名为python的目录
    cd python  # 进入python目录
    pip3 install boto3 -t .  # 在当前目录安装boto3库
    cd ..  # 返回上级目录
    zip -r my-aws-lambda-python-boto3-layer.zip python  # 将python目录打包为zip文件
    aws lambda publish-layer-version - region us-east-1 - layer-name my-aws-lambda-python-boto3-layer - zip-file fileb://my-aws-lambda-python-boto3-layer.zip  # 发布AWS Lambda层版本
    aws lambda list-layers - region us-east-1  # 列出us-east-1区域的AWS Lambda层

构建并部署Lambda函数

sam validate - region us-east-1  
sam deploy - guided - region us-east-1 - stack-name AwsSageMakerCostOptimizationAppStack - capabilities CAPABILITY_NAMED_IAM  

配置 SAM 部署  
====================  
查找配置文件 [samconfig.toml] : 找到  
读取默认参数 : 成功  
设置 'sam deploy' 的默认参数  
=====================================  
堆栈名称 [AwsSageMakerCostOptimizationAppStack]: AwsSageMakerCostOptimizationAppStack  
AWS 区域 [us-east-1]: us-east-1  
参数 Lambda 函数名称 [AwsSagemakerCostOptimizationFunction]: AwsSageMakerCostOptimizationFunction  
参数 LambdaLayerARN []: arn:aws:lambda:us-east-1:267680945830:layer:my-aws-lambda-python-boto3-layer:1  
参数 LambdaRoleARN []:  
参数 LambdaEventCronSchedule [cron(0 23 * * ? *)]:  
参数 LambdaTimeout [900]:  
#显示将要部署的资源变更,并需要一个 'Y' 来确认部署  
部署前确认变更 [Y/n]: Y  
#SAM 需要权限来创建角色以连接到您的模板中的资源  
允许 SAM CLI 创建 IAM 角色 [Y/n]: Y  
#在操作失败时保留先前预置的资源状态  
禁用回滚 [Y/n]: Y  
将参数保存到配置文件 [Y/n]: Y  
SAM 配置文件 [samconfig.toml]:  
SAM 配置环境 [default]:
通过在 GitHub 上创建帐户,你可以为 bishrtabbaa/aws-sagemaker-成本优化-app 的开发贡献力量。
总结

Lambda 层(Lambda Layers)是管理 Lambda 函数和无服务器应用程序中依赖项的简单有效机制。如果你需要在多个函数间共享代码,并且需要使用 AWS Lambda 代码编辑器时,我特别推荐它们。希望你对 Lambda Layers 有了新的了解,并且期待 AWS 无服务器社区的反馈。

喜欢这篇文章吗?使用了code_?可以在MediumTwitter 上关注我,获取更多更新._

参考资料
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消