如何在没有内联代码的情况下使用 lambda 函数部署 cloudformation?
How do you deploy cloudformation with a lambda function without inline code?
lambda 函数大小超过 4096 个字符,因此我无法将 lambda 函数部署为 cloudformation 模板中的内联代码。
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::Function
的 Code
属性,但请参阅 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.yaml
与 aws 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
lambda 函数大小超过 4096 个字符,因此我无法将 lambda 函数部署为 cloudformation 模板中的内联代码。
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::Function
的 Code
属性,但请参阅 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.yaml
与 aws 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