Aws lambda 从CI/CD管道部署单个Lambda函数

Aws lambda 从CI/CD管道部署单个Lambda函数,aws-lambda,continuous-integration,terraform,serverless-framework,circleci,Aws Lambda,Continuous Integration,Terraform,Serverless Framework,Circleci,我正在处理一个基础架构,并试图找出如何从CI/CD管道中部署单个lambda 假设在回购协议中,您有20个lambda,您对一个lambda进行了更改,而不是部署所有lambda,我只想部署更改后的lambda,因此缩短部署时间 我有一个想法,比如检查和git的区别,找出哪些被更改了,然后只部署这部分功能,但这显然不是正确的方法。相信有更合适的方法去做 我现在正在使用terraform(移动到无服务器框架),我知道terraform和无服务器框架在s3存储桶上保持状态。然而,在我的例子中,当我通

我正在处理一个基础架构,并试图找出如何从CI/CD管道中部署单个lambda

假设在回购协议中,您有20个lambda,您对一个lambda进行了更改,而不是部署所有lambda,我只想部署更改后的lambda,因此缩短部署时间

我有一个想法,比如检查和git的区别,找出哪些被更改了,然后只部署这部分功能,但这显然不是正确的方法。相信有更合适的方法去做


我现在正在使用terraform(移动到无服务器框架),我知道terraform和无服务器框架在s3存储桶上保持状态。然而,在我的例子中,当我通过管道运行它时,即使有一个地形状态,并且状态没有变化,它仍然部署了整个过程(我可能错了)。我只是想弄清楚我的想法,看看人们是如何使用他们的管道来实现这一点的。

似乎您添加了
terraform
无服务器框架(我称之为sls)
,以及
aws lambda
。所以他们都为你工作

  • terraform
    -terraform本身将考虑lambda需要更新的差异。但如果您需要安装相关的软件包,它对lambda并不友好

  • 无服务器框架(sls)
    -使用它来管理lambda函数很好,但作为副作用,它必须与api网关一起管理。我不确定sls团队是否解决了这个问题。需要一些确认

SLS将负责安装相关软件包

糟糕的是,sls无法区分要部署和计划的资源

  • cloudformation
    -这是AWS拥有的
    基础架构作为代码(IaC)
    工具来管理AWS资源,您可以使用它来管理lambda资源。您将遇到与Terraform相同的问题,您必须在部署堆栈之前安装相关软件包
糟糕的是,cfn(cloudformation)也没有
diff
功能,而且,它没有适当的工具来管理其aws cli命令,您必须使用其他工具,例如shell Scripting、Ansible甚至Terraform来管理coudformation模板更新

  • aws cdk
    -最新的方式是使用
    aws cdk
    ,它确实具有diff功能
    cdk diff
    ,最适合您当前的工作,但这是一个非常新的项目,许多功能仍有待开发

你可以拿着这些,用你团队的技能集来思考。始终选择您和您的团队最有信心的工具

既然您似乎在这里询问Terraform和Serverless框架,我假设您正在寻找一个一般性的答案,而不是具体如何使用特定的工具来解决这个问题

解决此问题的一种方法是通过在构建过程和部署过程之间添加版本选择机制,将构建过程与部署过程解耦。这只是意味着在系统中的某个地方有一个值,可以由构建过程写入,也可以由部署过程读取,该值指示每个Lambda函数的“当前”工件

当您的构建过程成功完成时,它可以将关于它构建的工件的信息写入适当的位置,然后触发您的部署过程。然后,您的部署过程将读取工件信息并使用它来决定部署什么

如果您没有对特定函数的当前工件元数据进行任何更改,那么部署过程可以看到这一点,而不做任何事情。如果某个特定工件在某种程度上存在缺陷,并且您仅在部署后才注意到,那么您可以潜在地将工件元数据设置回前一个,并重新运行部署过程以回滚。如果您选择保留历史版本的数据存储,您还将拥有对当前工件的更改日志,这可能有助于理解导致事件的情况

没有具体细节,很难说得更多。特别是对于Terraform,工件元数据存储应该是Terraform可以使用。为了展示一个真实的示例,我将任意选择AWS SSM参数存储作为该工件元数据存储的位置:

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图像等。

您可以尝试使用Cloudformation和Ansible。您可以编写多个剧本,在更新单个lambda时,您的ansible剧本将只更新该cf。