问题描述
想要在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 package
和aws cloudformation deploy
命令来简化CI/CD部署。
在这种情况下,你的模板中的Lambda资源指向一个本地目录,例如lambda/
。package
命令将目录的内容打包成zip文件,并将其上传到提供的S3存储桶中,并生成一个包含上传文件链接的更新后的CFN模板。aws cloudformation deploy
命令接受模板,创建一个变更集并应用更改,从而更新Lambda函数。
我在CI/CD流水线中使用过这两种方法,因为源文件在部署之前都是分开保存的,所以两种方法都很好用。
希望对你有所帮助 :)
方案3
使用Terraform等其他工具。
如果你不想使用CloudFormation,还可以考虑使用其他基础设施即代码工具,如Terraform。这些工具提供了更多的灵活性和抽象层,可以更好地满足你的需求。
请注意,使用其他工具可能需要学习新的语法和概念,因此在选择之前请确保你对工具的了解程度。