如何在没有内联代码的情况下使用 lambda 函数部署 cloudformation?

How do you deploy cloudformation with a lambda function without inline code?

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

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

ZipFile

Your source code can contain up to 4096 characters. For JSON, you must escape quotes and special characters such as newline (\n) with a backslash.

我得先压缩,上传到s3 bucket,在cloudformation中设置s3 bucket和文件详情,然后部署。

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

但是使用 AWS SAM 或 Serverless Framework,他们可以在没有内联代码的情况下部署 lambda 函数。

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

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

您可以先压缩文件,然后使用 aws cli 更新您的 lambda 函数

zip function.zip lambda_function.py
aws lambda update-function-code --function-name <your-lambda-function-name> --zip-file fileb://function.zip

在 CloudFormation 中(最后 3 行):

  BackupLambda:
    Type: "AWS::Lambda::Function"
    Properties:
      Handler: "backup_lambda.lambda_handler"
      Role: !Ref Role
      Runtime: "python2.7"
      MemorySize: 128
      Timeout: 120
      Code:
        S3Bucket: !Ref BucketWithLambdaFunction
        S3Key: !Ref PathToLambdaFile

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

aws cloudformation package 接受一个模板,其中某些属性可以使用本地路径写入,从本地文件系统压缩内容,上传到指定的 S3 存储桶,然后输出一个新模板,这些属性重写到引用 S3 上的位置而不是本地文件系统。在您的情况下,它可以重写指向本地目录的 AWS::Lambda::FunctionCode 属性,但请参阅 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.yamlaws cloudformation deploy 一起使用(或任何其他接受模板的 aws cloudformation 命令)。

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

回复。您的评论:

The only issue is, aws SAM or serverless framework create API gateway as default, that I don't need it to be created

默认情况下,对于无服务器框架,情况并非如此。默认生成的 serverless.yml 文件包括 Lambda 函数本身的配置,但 API 网关的配置仅作为以下注释部分中的示例提供。

如果您取消注释 http 的 'events' 部分,那么它还会为您的 Lambda 创建一个 API 网关配置,但除非您这样做。

functions:
  hello:
    handler: handler.hello
#    The following are a few example events you can configure
#    NOTE: Please make sure to change your handler code to work with those events
#    Check the event documentation for details
#    events:
#      - http:
#          path: users/create
#          method: get