2

我需要构建一个 CI/CD 管道来更新使用控制台创建的现有 Lambda 函数的代码。创建一个新的不是一种选择!

我在部署阶段使用 CloudFormation 成功部署了代码,但是它只能更新使用 CloudFormation/SAM 创建的 Lambda 函数的代码。当我在 template.yaml 文件中指定 Lambda 的名称和现有 Lambda 时,它会尝试创建它并告诉我它已经存在!

我尝试的第二种方法是使用 CodeDeploy 进行部署,但出现此错误:-“BundleType must be either YAML or JSON”

该线程提供了解决此问题的方法,但我无法将其应用于我的案例: CodePipeline: CodeDeploy 报告“BundleType must be either YAML or JSON”

是否有任何其他方法可以制作仅更新 Lambda 函数代码的适当 CI/CD 管道?

4

2 回答 2

0

从 CloudFormation 更新 Lambda 代码的一种方法是将您的 Lambda 代码存储在启用版本控制的 S3 中。

这里:https ://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html

在堆栈更新期间不会自动检测到对 Amazon S3 中的部署包的更改。要更新功能代码,请更改模板中的对象键或版本。

因此,管道可能类似于:

  • 1) 从存储库中签出 Lambda 代码。或者
  • 2) 将新的 zip 文件上传到版本化的 S3 存储桶。
  • 如果是 1),则压缩内容并将其上传到版本化的 S3 存储桶。
  • 完成后,您将拥有一个新的版本化对象来调用 CloudFormation(您将需要使用此新版本更新您的 template.yml 文件,这可以使用 CLI 检索此新对象版本来完成)并且可以按照中所述进行更新文档。

希望有帮助。

于 2020-02-26T14:05:39.617 回答
0

我也遇到了类似的问题。我的要求有点不同。我将解释我们使用的问题和解决方案,以便对其他人有所帮助。我从@marianogg9 解释的方法开始。

在我们的例子中,我使用 github 作为源尝试部署一个包含 lambda 函数的堆栈集。所以我在 github 中有一个 lambda python 文件和模板 yml 文件。为了部署,我使用以下步骤遇到了问题,即即使每次部署堆栈集后 lambda 函数也没有得到更新。

  1. 从 github 获取文件
  2. 压缩 lambda python 文件并上传到 s3 存储桶(现有存储桶)。
  3. yml 模板包含此存储桶路径和预定义的 s3key。所以每次我们在执行代码管道后覆盖 s3 lambda 文件。但根据 aws 文档

在堆栈更新期间不会自动检测到对 Amazon S3 中的部署包的更改。要更新功能代码,请更改模板中的对象键或版本。

这意味着您需要使用新存储桶或每次都使用新版本。因此,为此,首先我为 s3 存储桶启用了版本控制。然后我在模板文件中创建了一个参数 versionId。所以我的想法是将zip文件上传到s3,然后使用cli命令获取最新版本id,然后使用create stack instances cli命令的参数覆盖属性覆盖versionid参数。由于我必须创建一个堆栈集和代码管道,如果操作提供程序是 cloudformation 堆栈集,默认情况下将不支持参数覆盖选项。因此,我不再使用代码构建阶段,然后使用 cli 命令创建堆栈集,然后创建堆栈实例。

于 2021-01-13T10:51:36.777 回答