我们在进行AWS Lambda开的的时候,除了关心代码本身的业务逻辑外,有时也需要考虑自己代码在AWS Lambda上的运行效率和单位成本。AWS Lambda同时提供X64和ARM64两种CPU架构平台的运行环境供开发者选择,其中ARM64平台是采用AWS自研的Graviton CPU驱动,在和X64运行平台相比单位成本会低20%,绝大部分情况下的性能会更好,AWS官方评估后认为从X86切换到ARM64综合性价比最高会提升30%以上。
但是,我们开发者手中的电脑目前应该主要是Windows/X64、MacOS/ARM64、Linux/X64,而AWS Lambda的运行平台主要是Linux/X64,Linux/ARM64。那么我们怎么处理好跨OS,跨CPU架构的lambda软件开发呢?
解决的方式主要是2种
- 搭建CICD系统,在DevOps侧同时准备
Linux/ARM64、Linux/X64的编译&打包环境,在CICD系统内完成跨OS、跨CPU架构的代码集成,代码测试,代码编译&打包操作。 - 在自己的本地开发环境完成跨平台的开发,主要基于虚拟化技术,比如
VM,Docker等。
本文主要是讲的第二种方式,也就是结合Docker和AWS SAM高效的完成跨OS、跨CPU架构的lambda代码开发。至于为什么环境的统一这么重要,哪怕是Python3、Nodejs这类解释学语言也是如此的原因,主要是当本地开发环境和实际的运行环境不一致时,本地打包的Python代码会依赖第三方的底层库,这些库可能是使用C/C++等语言写的,在跨OS跨CPU架构的环境中摇要么不能运行要么能运行但是运行效率不高。
关于AWS Lambda的执行环境请看:Lambda runtimes,里面梳理了详细的OS环境,支持的语言,支持的CPU架构和支持周期等信息。
环境要求
跨环境构建
进行实验必须先在本地安装好Docker和AWS SAM,本次的代码样例在serverless-way/aws-lambda/sam-samples/hello-world
配置的关键在2个地方,首先是samconfig.toml里面需要设置好是有容器环境进行编译,例如我这里通过设置use_container = true来开启。
然后在我们的template.yaml里面设置本次lambda将要运行的环境,这里你可以按照自己的喜好设置x86_64或者arm64。如果是lambda函数那么你只能选择其中一个,如果是Lambda Layer你可以按照你的依赖自身的CPU兼容情况选择其中一个或者2个都选择。比如我现在的开发环境是MacOS/ARM64,那么以上的配置会为我编译好Linux/X64环境中运行的Lambda代码,并正确的管理依赖,我只需要执行sam build命令即可,因为它会先下载对应的Docker image然后在容器环境中完成编译和打包,而不是普通的在本地环境进行编译和打包。
实验论证
我们前面执行sam build命令完成了跨环境的打包工作,那么现在直接执行sam build进行部署;部署完成后我们在AWS网页控制台上可以看到我们完成了跨环境的部署
并且程序可以完全正确的运行
总结
通过Docker我们可以在本地环境模拟实际的线上运行环境,通过AWS SAM帮我们简化这些跨环境的构建流程,我们可以轻松的进行具体的设置后,快速的完成跨OS,跨CPU架构的Lambda代码开发,它可以有效的避免程序因环境不一致导致的运行性能下降或者运行错误问题。