首页 > 解决方案 > 如何在没有内联代码的情况下使用 lambda 函数部署 cloudformation?

问题描述

lambda 函数大小超过 4096 个字符,因此我无法将 lambda 函数部署为 cloudformation 模板中的内联代码。

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

压缩文件

您的源代码最多可以包含 4096 个字符。对于 JSON,您必须使用反斜杠转义引号和特殊字符,例如换行符 (\n)。

我必须先压缩它,上传到一个 s3 存储桶,在 cloudformation 中设置 s3 存储桶和文件详细信息,然后部署它。

我找不到使用一个命令进行部署的方法。如果我更新 lambda 代码,我必须重复上述步骤

但是使用 AWS SAM 或无服务器框架,他们可以部署 lambda 函数而无需内联代码。

唯一的问题是,AWS SAM 或无服务器框架默认创建 API 网关,我不需要创建它

对我有什么解决方案或建议吗?

标签: aws-lambdaamazon-cloudformationserverless-frameworkserverlessaws-sam

解决方案


如果您使用普通的 CloudFormation 和命令行界面来管理您的部署,您可以使用生成“打包”模板进行部署aws相对轻松地处理这个问题。aws cloudformation package

aws cloudformation package接受可以使用本地路径写入某些属性的模板,从本地文件系统压缩内容,上传到指定的 S3 存储桶,然后输出一个新模板,其中重写了这些属性以引用 S3 上的位置而不是本地文件系统。Code在您的情况下,它可以将该点的属性重写为AWS::Lambda::Function本地目录,但请参阅aws cloudformation package help支持属性的完整列表。您确实需要提前设置一个 S3 存储桶来存储您的资产,但您可以在多个 CloudFormation 项目中重复使用同一个存储桶。

所以,假设你有一个类似的input.yaml东西:

  MyLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      Code: my-function-directory

您可以将其打包为:

aws cloudformation package \
    --template-file input.yaml \
    --s3-bucket my-packaging-bucket \
    --s3-prefix my-project/ \
    --output-template-file output.yaml

这会产生output.yaml类似这样的东西:

  MyLambdaFunction:
    Properties:
      Code:
        S3Bucket: my-packaging-bucket
        S3Key: my-project/0123456789abcdef0123456789abcdef
    Type: AWS::Lambda::Function

然后您可以使用output.yamlwith aws cloudformation deploy(或任何其他aws cloudformation接受模板的命令)。

要真正“使用一个命令进行部署”并确保始终始终如一地进行部署,您可以将这两个命令组合成一个脚本Makefile,或类似的东西。


推荐阅读