使用Terraform/CloudFormation/其他工具有效地部署lambda(仅部署更改的lambda)

使用Terraform/CloudFormation/其他工具有效地部署lambda(仅部署更改的lambda),lambda,continuous-integration,amazon-cloudformation,terraform,Lambda,Continuous Integration,Amazon Cloudformation,Terraform,到目前为止,我一直在使用CloudFormation部署我的Lambda。我发现这个过程非常缓慢和低效,例如,它可能需要几分钟,但如果它只是部署1功能,它应该只需要几秒钟?大多数功能都不会改变,但我相信CloudFormation没有区别,无论如何都会部署所有功能。有没有一种方法可以让我做得更有效?比如,检查发生了什么变化,然后只部署这些变化 另一个好处是我可以有更少的版本,也许 您可以使用aws\u lambda\u函数资源的源代码散列让地形检查lambda函数是否已更改。如果没有任何更改,则

到目前为止,我一直在使用CloudFormation部署我的Lambda。我发现这个过程非常缓慢和低效,例如,它可能需要几分钟,但如果它只是部署1功能,它应该只需要几秒钟?大多数功能都不会改变,但我相信CloudFormation没有区别,无论如何都会部署所有功能。有没有一种方法可以让我做得更有效?比如,检查发生了什么变化,然后只部署这些变化


另一个好处是我可以有更少的版本,也许

您可以使用
aws\u lambda\u函数
资源的
源代码散列
让地形检查lambda函数是否已更改。如果没有任何更改,则不会上载新版本,并且您的计划也不会显示要进行的更改

这是以以下形式给出的:


我在gitlab管道中使用aws cli在提交时部署和更新lambda

我压缩了内容。将其上传到S3,并在S3上使用新工件触发函数更新

这比运行云形成模板快得多:

# Filename
FILENAME="${ARTIFACT_ID}-${version}-$BUILD_NUMBER.zip"
zip -r -D $FILENAME ./*
# Copy the bundle to s3
aws s3 cp $FILENAME "s3://$S3_BUCKET/$FILENAME"
# Trigger update of lambda function
aws lambda update-function-code --function-name $LAMBDA_FUNCTION_NAME --s3-bucket $S3_BUCKET --s3-key $FILENAME
我希望这能有所帮助。

我创建Terraform模块就是为了解决这个问题。即使设置源代码散列也不够,因为在创建ZIP时,它们通常包含一些文件系统元数据。对于我的模块,散列应该是稳定的(只有在源更改时才会更改)。该模块特定于Python,但哈希稳定性可以应用于任何运行时。

试试看。易于lambda函数部署,而且您还可以使用几行代码创建其他资源,如dynamodb或s3 bucket

1) 创建无服务器项目

serverless create --template aws-nodejs --path my-service
2) 在handler.js文件中编写函数登录并部署

serverless deploy 
3) 您可以在一个服务中创建多个功能。此外,您可以选择只部署一个函数

serverless deploy // for all the functions in one service
serverless deploy function -f functionName //deploy function with name 'functionName'
你也可以从终端观看日志,无服务器框架也有插件支持,例如,你可以用typescript编写源代码,其余的由typescript的无服务器插件自己完成。
我使用serverless已经有一段时间了,这是我找到的最好的持续集成解决方案。值得一试。

您是否尝试过通过Jenkins之类的CI运行它并检查是否进行了任何提交?@BeshoyHanna,但通常CI是由新提交触发的,在我看来这是不够的,因为新提交可能仅更改1个函数。或者CI可能同时部署infra和代码。有时只有基础设施的变化(例如地形/云形成),所以我不需要部署我的代码。是的,我想你是对的,但我是在暗示可能每个功能都有sepreate repos?@BeshoyHanna,但这意味着需要大量的repos:(@Jiew Meng你能提供一些示例代码吗?我不确定我做的是否正确,但我注意到,即使源代码已经更改,并且我执行了
terraform apply
,新的源代码也不会被应用。terraform似乎更新了上次更新时间和哈希,但没有上载新的zip?这可能值得编辑你的que继续显示您尝试了什么,以及尝试让Terraform更新Lambda函数代码所遵循的步骤。查看
aws\u Lambda\u函数
资源的源代码,它从aws获取函数包哈希,并根据提供的
source\u哈希
独立检查,因此它不应该是posTerraform可以忽略对包的更改,只更新自己的状态文件。如果使用版本化的lambda函数,则需要在
aws\u lambda\u函数
资源上设置
publish=true
serverless deploy // for all the functions in one service
serverless deploy function -f functionName //deploy function with name 'functionName'