AWS 云形成 |配置 Lambda 以使用 S3 存储桶中的最新版本代码
Posted
技术标签:
【中文标题】AWS 云形成 |配置 Lambda 以使用 S3 存储桶中的最新版本代码【英文标题】:AWS Cloudformation | Configure Lambda to Use Latest Version of Code in S3 Bucket 【发布时间】:2019-01-23 07:08:51 【问题描述】:我在 AWS 上使用 codepipeline、codebuild 和 cloudformation。
我的流程是:
-
将提交推送到 github,这会触发代码管道
Codebuild 将 lambda 函数上传(压缩)到 S3 存储桶
Cloudformation 配置 lambda 函数
Cloudformation(简化版):
CreateDoctorLambda:
Type: AWS::Lambda::Function
Properties:
Runtime: python3.6
Handler: lambda_function.lambda_handler
Role:
Fn::GetAtt:
- LambdaExecutionRole
- Arn
Code:
S3Bucket: !Ref LambdaFunctionS3Bucket
S3Key: CreateDoctor.zip
S3ObjectVersion: Latest <-- This value is invalid
问题:当我更新 lambda 函数的代码时(此新代码在代码构建期间被压缩并上传到 S3 存储桶),更改不会部署到现有的 lambda 函数。
据AWS documentation:
更新源代码位于 Amazon S3 中的 Lambda 函数 存储桶,您必须通过更新 S3Bucket、S3Key 或 S3ObjectVersion 属性。单独更新源代码不会 更新函数。
问题:有没有办法告诉 Cloudformation 使用存储在 S3 中的最新版本的代码?使用S3ObjectVersion: Latest
将导致错误。
【问题讨论】:
嗨,我也对同一个用例感到震惊。您是否能够找出S3ObjectVersion
的值以便 lambda 获得最新的 s3 zip 文件?
@Private 不幸的是没有。
好的,感谢您的回复。我也在aws论坛上问过同样的问题,希望我能得到任何积极的回应。
@Private 如果您找到解决方案,请考虑分享:-)
当然。我会分享..
【参考方案1】:
它只是一种替代工作流程,但也许它会解决您的问题:
-
您必须配置 CodePipeline 或 CodeBuild 以根据(例如)部署时间为工件生成不同的名称,而不是使用相同的名称保存工件;
在您的 CloudFormation 操作中,您将工件名称作为模板 (https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-parameter-override-functions.html) 的参数传递,它将根据新代码重新部署函数。
【讨论】:
【参考方案2】:如果您的 CF 堆栈中有大量 lambda,因此您想手动选择要从源中更新的 lambda,并让 lambda 代码在多个运行时下同样有效,那么这种快速破解非常有效。只需更改堆栈中的运行时版本(例如从“运行时:nodejs8.10”更改为“运行时:nodejs10.x”。CodePipeline/CloudFormation 将只更新该函数。
【讨论】:
【参考方案3】:S3ObjectVersion 可以提取到Parameters
部分,最新版本可以动态传递给它。
下面是org-babel
版本,但是可以转成shell脚本代替。
#+name: latest-lambda-version
#+BEGIN_SRC sh :results output :var bucket=artifact-bucket-name
aws s3api list-object-versions --bucket $bucket --prefix lambda-function.zip --query 'Versions[?IsLatest].[VersionId]' --output text
#+END_SRC
#+BEGIN_SRC sh :results verbatim silent :var version=latest-lambda-version
aws cloudformation deploy --template-file stack.yml \
--stack-name FooStack \
--capabilities CAPABILITY_IAM \
--parameter-overrides LambdaVersion="$version" \
--no-execute-changeset
#+END_SRC
【讨论】:
以上是关于AWS 云形成 |配置 Lambda 以使用 S3 存储桶中的最新版本代码的主要内容,如果未能解决你的问题,请参考以下文章
如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?
AWS CloudFormation 更新 Lambda 代码以在 S3 存储桶中使用最新版本
使用 VPC 配置添加 AWS Lambda 会导致访问 S3 时超时