由于您似乎在这里询问 Terraform 和无服务器框架,我假设您正在寻找一般答案,而不是具体如何使用特定工具解决此问题。
解决此问题的一种方法是通过在两者之间添加版本选择机制来将构建过程与部署过程分离。这只是意味着在您的系统中的某个地方,您有一个值可以由您的构建过程写入并由您的部署过程读取,这表明您的每个 Lambda 函数的“当前”工件是什么。
当您的构建过程成功完成时,它可以将有关它构建的工件的信息写入适当的位置,然后触发您的部署过程。然后,您的部署过程将读取工件信息并使用它来决定部署什么。
如果您没有对特定功能的当前工件元数据进行任何更改,那么部署过程可以看到这一点并且不做任何事情。如果特定工件在某些方面存在缺陷,并且您仅在部署后才注意到,您可以将工件元数据设置回之前的元数据并重新运行部署过程以回滚。如果您选择保留历史版本的数据存储,您还将拥有对当前工件的更改日志,这可能有助于了解导致事件的情况。
如果不深入细节,很难说更多。特别是对于 Terraform,工件元数据存储应该是 Terraform 可以使用数据源读取的东西。为了展示一个真实的示例,我将任意选择 AWS SSM Parameter Store 作为该工件元数据存储的位置:
data "aws_ssm_parameter" "foo" {
name = "FooFunctionArtifact"
}
locals {
# For this example, we'll assume that the stored parameter is a JSON
# string shaped like this:
# {
# "s3_bucket": "awesomecorp-app-artifacts"
# "s3_key": "/awesomeapp/v1.2.0/function.zip"
# }
foo_artifact = jsondecode(data.aws_ssm_parameter.foo)
}
resource "aws_lambda_function" "foo" {
function_name = "foo"
s3_bucket = local.foo_artifact.s3_bucket
s3_key = local.foo_artifact.s3_key
# etc, etc
}
根据您的技术选择,这方面的技术细节会有很大差异。如果您不使用 Terraform,那么您将在其他工具中使用类似于数据源的功能,或者您将编写一些包装胶水代码,该代码本身可以检索必要的信息并将其作为参数传递给工具。
无论技术选择如何,主要的事情是在某处明确记录每个功能的最新工件是什么,该工件由您的构建步骤更新并由您的部署步骤读取。这种模式也可以应用于其他工件类型,例如 EC2 的 AMI、docker 映像等。