更新AWS Lambda层依赖性

Rus*_*ane 5 layer amazon-web-services aws-cloudformation aws-lambda

情况是,我有大量的lambda函数(使用node js 8.10),它们的功能都非常不同,并且都使用CloudFormation进行了部署。

它们都共享一些非常复杂的功能。

目前,如果通用代码发生更改(这是相当频繁的),我将在每个项目(包括源代码控制)之间复制通用代码,然后重新部署每个功能。一直觉得这是错误的。

现在我们有了lambda图层-是的!还是呀?

太好了,所以现在我可以在单个存储库中维护代码了-滴答声,但是其余过程实际上并没有更好,甚至可能更糟...

如果将图层放入CloudFormation模板中,然后将ARN导出以导入到lambda函数模板中,则导出的ARN仅适用于该图层的版本1。

我可以使用Sub函数形成没有版本的ARN,然后在lamda函数CloudFormation模板中添加版本。但是,只要通用代码发生变化,我仍然需要更新所有下游lambda函数CloudFormation模板以添加最新版本。

我可以编写脚本,但是它仍然是一个庞大的PITA,并不能真正节省很多精力。我需要获取每个lambda函数项目的最新信息以更新版本号,然后重新提交回购协议,pr,merge,等等等等。

有没有其他方法可以始终使用最新版本的图层?

小智 4

使用无服务器部署和 CloudFormation Outputs 可以帮助解决这种情况。

  1. 在它自己的服务中定义您的层。创建输出资源(但不创建导出名称)。
resources:
  Outputs:
    MYOUTPUTNAME:
      Value:
        Ref: MYLAYERLambdaLayer # LambdaLayer is a required suffix
Run Code Online (Sandbox Code Playgroud)
  1. 将输出引用为任何功能需要的层
functions:
  ...other required function keys in serverless
  layers:
    - ${cf:NAME_OF_STACK.MYOUTPUTNAME}
Run Code Online (Sandbox Code Playgroud)
  1. 每当您重新部署该层时,都必须强制重新部署引用该层的整个函数堆栈 ( sls deploy --force)。仅重新部署该函数不会更新输出引用。

注意:如果您使用输出导出名称,则在引用当前版本时重新部署图层服务时将会遇到错误。因此,最好使用对堆栈输出的引用,这样就不会导致此错误。