我正在尝试使用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团队,如果您正在阅读本文,这是不可接受的。修好它。
这篇文章已经过时了。我在这里更新它,以便其他人可以看到自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版本控制。
不要让上面为那个人写的过时的“最佳答案”像我一样把你扔进兔子洞。
不客气。
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的信息
我有一个类似的用例(需要使用CloudFormation来管理CloudFront中@edge要使用的lambda函数,始终需要特定的lambda函数版本,而不是$LATEST
),我的搜索首先让我回答了这个问题,但经过进一步挖掘,我很高兴地发现,现在有了AWS无服务器应用程序模型的新AutoPublishAlias
功能对自动lambda版本控制的本机支持(基本上是为您的CloudFormation模板提供的一组可选的额外高级构造)。
在此宣布:https://github.com/awslabs/serverless-application-model/issues/41#issuecomment-347723981
详情请参阅:
本质上,您包括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本机映像时,我会收到以下警告: 警告:正在中止独立映像生