我正在尝试创建一个支持Lambda Function和AWS CodeBuild项目的CloudFormation模板,以将.netcore源代码构建到S3存储桶中已部署的zip文件中。详情如下:
这一切都很好。我正在努力的是如何更新Lambda函数以在S3存储桶中使用更新的已编译源代码。
这是CloudFormation模板的子集:
Resources:
Lambda:
Type: AWS::Lambda::Function
Properties:
FunctionName: roicalculator-eventpublisher
Handler: RoiCalculator.Serverless.EventPublisher::RoiCalculator.Serverless.EventPublisher.Function::FunctionHandler
Code:
S3Bucket: deployment-artifacts
S3Key: RoiCalculatorEventPublisher.zip
Runtime: dotnetcore2.1
CodeBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Name: RoiCalculator-EventPublisher-Master
Artifacts:
Location: deployment-artifacts
Name: RoiCalculatorEventPublisher.zip
Type: S3
Source:
Type: GITHUB
Location: https://github.com/XXXXXXX
BuildSpec: RoiCalculator.Serverless.EventPublisher/buildspec.yml
这是buildspec.yaml的子集:
phases:
install:
runtime-versions:
dotnet: 2.2
commands:
dotnet tool install -g Amazon.Lambda.Tools
build:
commands:
- dotnet restore
- cd RoiCalculator.Serverless.EventPublisher
- dotnet lambda package --configuration release --framework netcoreapp2.1 -o .\bin\release\netcoreapp2.1\RoiCalculatorEventPublisher.zip
- aws s3 cp .\bin\release\netcoreapp2.1\RoiCalculatorEventPublisher.zip s3://deployment-artifacts/RoiCalculatorEventPublisher.zip
您可以看到在buildspec(用于生成和复制)和CloudFormation模板(用于Lambda函数的源代码)中使用了相同的工件名称(RoiCalculatorEventPublisher.zip)和S3存储桶(部署工件)。
由于我正在使用Lambda使用的相同文件名覆盖S3存储桶中的应用程序代码,为什么Lambda不会被最新代码更新?
版本号如何工作?是否可以有一个包含工件名称(文件名+版本号)的“系统变量”,并在buildspec AND CloudFormation模板中访问相同的“系统变量” ?
利用CloudFormation模板使用CodeBuild以及消耗所生成代码的更新Lambda函数来生成源代码(通过buildspec)的秘诀是什么?
谢谢。
不幸的是,除非您在每次更新时都更改“ AWS :: Lambda :: Function”资源上的“ S3Key”,否则CloudFormation不会将其视为更改(它将不会在压缩代码中查找更改)。
选项:
选项1)每次上传时更新S3密钥
选项2)建议的建议是使用AWS SAM编写Lambda模板,然后使用“ cloudformation package”命令打包该模板,这将为S3创建唯一密钥并将文件上传到存储桶。此处的详细信息:https : //docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-deploying.html
编辑1:
为了回应您的评论,让我添加一些SAM方法的详细信息:
要将CloudFormation用作管道中Lambda函数的部署工具。部署Lambda函数的基本思路如下:
1)为您的Lambda函数创建一个SAM模板
2)基本的SAM模板如下所示:
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
FunctionName:
Type: 'AWS::Serverless::Function'
Properties:
Handler: index.handler
Runtime: nodejs6.10
CodeUri: ./code
3)添加目录“代码”,并将lambda代码文件保留在此目录中
4)安装SAM Cli [1]
5)运行命令打包并上传:
$ sam package --template-file template.yaml --output-template packaged.yaml --s3-bucket {your_S3_bucket}
6)部署程序包:
$ aws cloudformation deploy --template-file packaged.yaml --stack-name stk1 --capabilities CAPABILITY_IAM
您可以将模板代码(步骤1-2)保留在CodeCommit / Github中,并在代码构建步骤中执行步骤4-5。对于Step6,我建议通过CodePipeline中的CloudFormation操作将输入“ packaged.yaml”文件作为输入工件进行操作。
另请参见[2]。
参考文献:
[1]在Linux上安装AWS SAM CLI- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install-linux.html
[2]构建一个持续交付管道与AWS CodePipeline拉姆达应用- https://docs.aws.amazon.com/en_us/lambda/latest/dg/build-pipeline.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句