2

我正在处理一个基础设施,并试图弄清楚如何从 CI/CD 管道部署单个 lambda。

假设在一个 repo 中,您有 20 个 lambda,并且您对一个 lambda 进行了更改,而不是部署所有这些,我只想部署更改后的一个,从而缩短部署时间。

我有一个想法,比如检查与 git 的区别并找出哪些发生了更改,然后只部署那部分功能,但这似乎不是正确的方法。相信有更合适的方法来做到这一点。

我现在正在使用 terraform(转向无服务器框架)我知道 terraform 和无服务器框架在 s3 存储桶上保持状态。但是在我的情况下,当我通过管道运行它时,eventhogh 有一个 terraform 状态并且状态没有变化,它仍然按照实现的方式部署整个事情(我可能错了)。我只是想理清思路,看看人们是如何用他们的管道做到这一点的。

4

2 回答 2

3

由于您似乎在这里询问 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 映像等。

于 2019-08-05T17:13:30.000 回答
0

似乎您添加了terraformserverless-framework (I called it sls)和的标签aws-lambda。所以他们都为你工作。

  • terraform- Terraform 本身会处理 lambda 需要更新的差异。但如果您需要安装相关的软件包,它对 lambda 不友好。

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

SLS 将负责安装相关软件包。

不好的部分是,sls 无法diff部署和计划资源。

  • cloudformation- 这是 AWS 拥有的Infrastructure as Code (IaC)用于管理 aws 资源的工具,您应该可以使用它来管理 lambda 资源。您将遇到与 Terraform 相同的问题,即您必须在部署堆栈之前安装相关软件包。

不好的部分是,cfn(cloudformation)也没有diff功能,此外,它没有适当的工具来管理其 aws cli 命令,您必须使用其他工具,例如 shell 脚本、Ansible 甚至 Terraform 来管理 coudformation模板更新。

  • aws cdk- 最新的使用方式aws-cdk,它确实有cdk diff最适合你当前工作的diff功能,但它是一个非常新的项目,很多功能还在等待开发。

你可以拿这些和思考your team's skill sets。始终选择您和您的团队最有信心的工具。

于 2019-08-05T01:18:51.143 回答