如何将AWS Lambda代码“注入”到CloudFormation中

47次阅读
没有评论

问题描述

想要在CloudFormation中不使用S3存储桶来引用Lambda函数的代码。他想知道是否有办法在运行单元测试后,从文件系统中注入代码,甚至只注入编译后的二进制文件。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在CloudFormation模板中嵌入源代码。
在我的ec2-start-stop演示项目中,我就是这样做的。你可以在ec2-start-stop.template.yml文件中看到以下代码:

StartStopLambda:
  Type: AWS::Lambda::Function
  Properties:
    ...
    Runtime: python3.6
    Code:
      ZipFile:
        Fn::Join:
          ...
          - - "%%{ec2-start-stop.lambda.py}%%"

然后,我在%%{ec2-start-stop.lambda.py}%%中引用了实际的Python脚本,并使用一个简单的import-files.py脚本将Python文件嵌入到yaml文件中,创建一个包含Lambda代码的有效独立CloudFormation模板。
请注意,你的Lambda代码限制为4096个字节,包括换行符。

方案2

使用aws cloudformation package / deploy命令。
如果你的Lambda函数更复杂,需要外部库或不适合4kB的限制,你可以使用aws cloudformation packageaws cloudformation deploy命令来简化CI/CD部署。
在这种情况下,你的模板中的Lambda资源指向一个本地目录,例如lambda/package命令将目录的内容打包成zip文件,并将其上传到提供的S3存储桶中,并生成一个包含上传文件链接的更新后的CFN模板。aws cloudformation deploy命令接受模板,创建一个变更集并应用更改,从而更新Lambda函数。
我在CI/CD流水线中使用过这两种方法,因为源文件在部署之前都是分开保存的,所以两种方法都很好用。
希望对你有所帮助 :)

方案3

使用Terraform等其他工具。
如果你不想使用CloudFormation,还可以考虑使用其他基础设施即代码工具,如Terraform。这些工具提供了更多的灵活性和抽象层,可以更好地满足你的需求。
请注意,使用其他工具可能需要学习新的语法和概念,因此在选择之前请确保你对工具的了解程度。

正文完