当前位置: 首页 > 知识库问答 >
问题:

如何使用CloudFormation创建Lambda函数的新版本?

顾跃
2023-03-14

我正在尝试使用CloudFormation创建Lambda函数的新版本。

我想拥有同一个Lambda函数的多个版本,这样我就可以(a)在不同的版本中指向别名——比如DEV和PROD——并且(b)能够回滚到更早的版本

这是我的Lambda版本的定义:

LambdaVersion:
  Type: AWS::Lambda::Version
  Properties:
    FunctionName:
      Ref: LambdaFunction

运行“aws cloudformation创建堆栈”时会创建一个版本,但后续的“aws cloudformation更新堆栈”命令不会执行任何操作。没有创建新的Lambda版本。

我试图得到一个新版本的Lambda函数创建后,我上传新的zip文件到S3,然后运行"更新堆栈"。我可以用云形成来做吗?AWS::Lambda::版本真的坏了(如这里提到的https://github.com/hashicorp/terraform/issues/6067#issuecomment-211708071)还是我没有得到什么?

更新1/11/17亚马逊支持部门的官方回复:“…对于任何要发布的新版本,您需要定义一个附加(sic)AWS::Lambda::version resource…”

AWS CloudFormation/Lambda团队,如果您正在阅读本文,这是不可接受的。修好它。

共有3个答案

司徒元明
2023-03-14

这篇文章已经过时了。我在这里更新它,以便其他人可以看到自2020年9月6日起版本控制Lambdas的正确解决方案,而不需要额外的自定义版本控制Lambdas。

这:

Description: Lambda Example
Resources:
  Function:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Code:
        ZipFile: |
          'Example Code';
      Runtime: nodejs12.x
      Timeout: 5
Description: Lambda Example
Transform: AWS::Serverless-2016-10-31
Resources:
  Function:
    Type: AWS::Serverless::Function
    Properties:
      AutoPublishAlias: live
      Handler: index.handler
      InlineCode: |
        'Example Code';
      Runtime: nodejs12.x
      Timeout: 5

转换:允许在CloudFormation模板内部使用AWS::Serverless::Function,而CloudFormation模板又支持lambda版本控制。

不要让上面为那个人写的过时的“最佳答案”像我一样把你扔进兔子洞。

不客气。

潘青青
2023-03-14

AWS::Lambda::版本没有用。您必须为每个Lambda版本添加新资源。如果你想为每次云形成更新发布一个新版本,你必须黑进系统。

我解决了这个问题,创建了一个由Lambda支持的自定义资源,每次部署都会触发该资源。在这个Lambda中,我正在为参数中给出的Lambda函数创建一个新版本。

关于拉姆达的来源,你可以检查http://serverless-arch-eu-west-1.s3.amazonaws.com/serverless.zip

下面是使用此部署Lambda函数的云形成示例(您可能需要一些修改):

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "DeploymentTime": {
      "Type": "String",
      "Description": "It is a timestamp value which shows the deployment time. Used to rotate sources."
    }
  },
  "Resources": {
    "LambdaFunctionToBeVersioned": {
      "Type": "AWS::Lambda::Function",
       ## HERE DEFINE YOUR LAMBDA AS USUAL ##
    },
    "DeploymentLambdaRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": [
                  "lambda.amazonaws.com"
                ]
              },
              "Action": [
                "sts:AssumeRole"
              ]
            }
          ]
        },
        "Path": "/",
        "ManagedPolicyArns": [
          "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
        ],
        "Policies": [
          {
            "PolicyName": "LambdaExecutionPolicy",
            "PolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": [
                    "lambda:PublishVersion"
                  ],
                  "Resource": [
                    "*"
                  ]
                }
              ]
            }
          }
        ]
      }
    },
    "DeploymentLambda": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Role": {
          "Fn::GetAtt": [
            "DeploymentLambdaRole",
            "Arn"
          ]
        },
        "Handler": "serverless.handler",
        "Runtime": "nodejs4.3",
        "Code": {
          "S3Bucket": {
            "Fn::Sub": "serverless-arch-${AWS::Region}"
          },
          "S3Key": "serverless.zip"
        }
      }
    },
    "LambdaVersion": {
      "Type": "Custom::LambdaVersion",
      "Properties": {
        "ServiceToken": {
          "Fn::GetAtt": [
            "DeploymentLambda",
            "Arn"
          ]
        },
        "FunctionName": {
          "Ref": "LambdaFunctionToBeVersioned"
        },
        "DeploymentTime": {
          "Ref": "DeploymentTime"
        }
      }
    }
  }
}

(免责声明:此代码是我书的一部分,了解更多关于Lambda的信息

林和煦
2023-03-14

我有一个类似的用例(需要使用CloudFormation来管理CloudFront中@edge要使用的lambda函数,始终需要特定的lambda函数版本,而不是$LATEST),我的搜索首先让我回答了这个问题,但经过进一步挖掘,我很高兴地发现,现在有了AWS无服务器应用程序模型的新AutoPublishAlias功能对自动lambda版本控制的本机支持(基本上是为您的CloudFormation模板提供的一组可选的额外高级构造)。

在此宣布:https://github.com/awslabs/serverless-application-model/issues/41#issuecomment-347723981

详情请参阅:

  • https://github.com/awslabs/serverless-application-model/blob/master/docs/safe_lambda_deployments.rst#instant-使用lambda别名的流量转移

本质上,您包括AutoPublishAlias在您的AWS::Serverless::Function定义:

MyFunction:
  Type: "AWS::Serverless::Function"
  Properties:
    # ...
    AutoPublishAlias: MyAlias

然后在CloudFormation模板的其他地方,您可以引用最新发布的版本,如!参考MyFunction.Version(yaml语法)。

 类似资料:
  • 我从我的帐户中删除了所有现有的lambda函数,并从我现有的贡献中删除了所有的lambda函数。但这并没有解决问题。我还应用了这里提到的修复程序,得到了相同的结果。 你能帮我创建一个新版本或者找到并删除我必须删除的lambda版本吗?

  • AWS CloudFormation模板,包括一个带有敏感环境变量的Lambda函数。我想设置一个KMS密钥并用它加密它们 添加基本的cloudformation来加密密钥,即使使用AWS/Lambda默认加密也可以

  • 我正在尝试将lambda函数自动附加到已经存在的Api网关(未部署在堆栈中)。看起来AWS::ApiGateway::方法是实现这一点的最佳方法,但我似乎可以找到如何获取特定的Api网关RestApiId和ResourceId。我如何“获取”这些信息?有云形成的方法吗?或者我需要使用某种类型的lambda函数吗? 谢谢你帮我解决这个令人沮丧的问题!

  • 我们可以从AWS控制台创建、编辑、删除组来维护DynamoDb表的逻辑分组。我搜索了AWS文档和论坛,但没有找到如何使用CloudFormation创建DynamoDb表组的方法,也没有找到如何使用AWS.NET SDK在组内创建表的方法。这可能吗?

  • 我想创建一个以lambda函数为目标的AWS eventbridge规则。名为“StartInstance”的lambda函数已通过控制台创建。 我创建了一个python脚本,它使用boto3库来创建这个eventbridge规则。我将向该规则传递一个cron表达式,该表达式将在特定日期和时间调用lambda函数。 下面是成功运行的python脚本代码: 如您所见,传递给规则的cron表达式是:,

  • 我试图使用Micronaut、GraalVM和Docker在Java中创建和部署AWS Lambda函数。我正在按照本教程使用GraalVM运行时创建AWS lambda。 我使用命令创建了java项目。然后在不改变代码或配置文件的情况下,尝试用GraalVM本机映像构建Docker映像。在docker build步骤中,当构建graalvm本机映像时,我会收到以下警告: 警告:正在中止独立映像生