VS2022中AWS Serverless.template发布后被覆盖的问题求助
问题背景
使用VS2022+AWS Toolkit开发Lambda项目时,执行「Publish to AWS Lambda」操作后,serverless.template(包括复制后的serverless2.template)会被重置为默认47行内容,所有自定义函数配置丢失,原文件从145行被缩减。重置后的默认模板内容如下:
{ "AWSTemplateFormatVersion": "2010-09-09", "Transform": "AWS::Serverless-2016-10-31", "Description": "TCR Manager API This template is partially managed by Amazon.Lambda.Annotations (v1.5.0.0).", "Resources": { "TcrManagerLambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } }, "ManagedPolicyArns": [ "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole" ], "Policies": [ { "PolicyName": "lambdaPolicyAllowSecretsManager", "PolicyDocument": { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "*" } } } ] } } }, "Outputs": { "ApiURL": { "Description": "API endpoint URL for Prod environment", "Value": { "Fn::Sub": "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/" } } } }
核心原因
问题源于项目中使用的Amazon.Lambda.Annotations包,该工具会根据代码中的注解自动生成/更新serverless.template,发布操作触发了模板的自动重置,覆盖了自定义配置。
解决方法
1. 禁用Annotations自动生成模板
在项目的.csproj文件中添加如下配置,阻止Annotations自动覆盖模板:
<PropertyGroup> <LambdaAnnotationsGenerateServerlessTemplate>false</LambdaAnnotationsGenerateServerlessTemplate> </PropertyGroup>
添加后保存项目,重新发布时工具将不再自动生成或修改模板文件,自定义配置得以保留。
2. 使用分层模板分离自定义配置
保留Annotations生成的基础模板,将自定义的函数配置、资源定义放到独立的CloudFormation模板文件(比如custom-resources.template)中,通过嵌套栈合并到主模板:
在serverless.template的Resources节点下添加:
"CustomLambdaResources": { "Type": "AWS::CloudFormation::Stack", "Properties": { "TemplateURL": "custom-resources.template" } }
这种方式既保留了Annotations自动管理基础资源(如执行角色)的能力,又能确保自定义配置不会被覆盖。
3. 修改发布向导配置
在VS2022的Lambda发布向导中:
- 取消勾选「Generate serverless template」选项
- 选择「Use existing template」,指定你修改后的模板文件路径
- 完成发布配置后保存,后续发布将使用指定的现有模板,不再触发重置。
4. 修正自定义模板的项目关联
如果已经将模板复制为serverless2.template,需要更新项目的配置文件lambda-tools-defaults.json,将template字段的值改为自定义模板的名称:
{ // 其他配置... "template": "serverless2.template" }
同时确保发布向导中指定的模板路径与该配置一致,避免工具继续使用默认的serverless.template。
内容的提问来源于stack exchange,提问作者Ray

