AWS CloudFormation更新Lambda代码以在S3存储桶中使用最新版本

汤姆·史瑞克

我正在尝试创建一个支持Lambda Function和AWS CodeBuild项目的CloudFormation模板,以将.netcore源代码构建到S3存储桶中已部署的zip文件中。详情如下:

  • 将具有多个Lambda函数的GitHub mono-repo用作.netcore解决方案中的不同项目
  • 每个Lambda函数(也称为.netcore项目)都有一个CloudFormation YAML文件,该文件生成一个包含Lambda函数本身和CodeBuild项目的堆栈。
  • CodeBuild项目是从GitHub Web钩子启动的,该Web钩子从GitHub子项目中检索代码,并使用其buildspec.yaml来控制构建的方式。
  • buildspec使用.netcore来构建项目,然后将输出文件压缩并复制到目标S3存储桶
  • Lambda函数指向S3存储桶以获取源代码

这一切都很好。我正在努力的是如何更新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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

AWS Lambda:如何使用Java从Lambda函数访问S3存储桶

如何将AWS CLI升级到最新版本?

AWS S3 Java SDK-ListVersionsRequest仅获取最新版本

使用AWS CLI在S3存储桶中下载最新文件?

如何使用CLI在AWS S3中删除版本存储桶?

通过CloudFormation的AWS Lambda S3存储桶通知

AWS S3存储桶加密

配置AWS Lambda以访问S3存储桶

AWS Cloudformation | 将Lambda配置为在S3存储桶中使用最新版本的代码

aws lambda-如果手动创建s3存储桶,如何使用cloudformation添加s3触发器

如何使用Cloudformation从S3存储桶中的代码创建AWS Codecommit存储库

如何使用aws cli获取最新版本的s3对象?

AWS S3存储桶删除

如何在React js项目中使用npm更新/升级到aws-sdk的最新版本?

将对象上传到S3存储桶时,如何触发AWS Cloudformation堆栈的更新?

如何将参数从CloudFormation传递到存储在S3存储桶中的AWS Lambda函数

从S3存储桶以AWS Lambda函数代码导入库

AWS Lambda使用listBuckets()列出S3存储桶无效

如何在不删除Amazon S3存储桶旧文件的情况下,使用文件的最新版本创建新文件夹?

AWS Lambda Java,写入S3存储桶

AWS S3 存储桶策略

AWS 版本控制 - 如何仅保留 10 个最新版本

presto/aws athena - 选择记录的最新版本

AWS S3 存储桶中对象更新的问题

在 AWS Lambda 上安装更新版本的 sqlite3

使用python删除s3存储桶内容的AWS lambda函数

每天更新 S3 存储桶的最佳 AWS 方式?

AWS:使用 lambda 函数读取 Amazon S3 存储桶中的所有文件

适用于 AWS 云搜索访问策略的最新版本是什么?