使用CloudFormation部署Lambda时动态配置CodeUri报错的问题咨询
动态配置Lambda函数CodeUri的CloudFormation报错解决
问题场景
使用AWS::Serverless-2016-10-31转换创建Lambda函数时,尝试通过参数动态指定代码存储的S3桶名,原模板如下:
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Parameters: LambdaBucketName: Type: String Description: The name S3 Bucket of the lambda function code Resources: FUNC: Type: 'AWS::Serverless::Function' Properties: FunctionName: 'my-lambda-func' Handler: index.handler Runtime: nodejs18.x CodeUri: FunctionCode: Bucket: !Ref LambdaBucketName Key: my-lambda-func.zip etc...
部署时触发错误:
ROLLBACK_IN_PROGRESS : 'CodeUri' requires Bucket and Key properties to be specified.
尝试静态S3 URI(如CodeUri: s3://my-bucket/my-lambda-func.zip)可正常部署,但动态引用桶名时遇到格式问题;直接配置CodeUri的Bucket和Key又提示格式错误。
解决方案
方法1:直接配置CodeUri的Bucket和Key属性
AWS::Serverless::Function的CodeUri支持直接接收包含Bucket和Key的对象,不需要嵌套FunctionCode(这是原生AWS::Lambda::Function的属性格式,Serverless Transform不兼容这种嵌套写法)。修正后的代码:
Resources: FUNC: Type: 'AWS::Serverless::Function' Properties: FunctionName: 'my-lambda-func' Handler: index.handler Runtime: nodejs18.x CodeUri: Bucket: !Ref LambdaBucketName Key: my-lambda-func.zip
方法2:使用!Sub拼接S3 URI
通过字符串拼接生成完整的S3路径,这种写法更简洁,也能实现动态桶名配置:
Resources: FUNC: Type: 'AWS::Serverless::Function' Properties: FunctionName: 'my-lambda-func' Handler: index.handler Runtime: nodejs18.x CodeUri: !Sub s3://${LambdaBucketName}/my-lambda-func.zip
说明
AWS::Serverless::Function的CodeUri有两种合法格式:
- 静态/动态拼接的S3 URI字符串(如
s3://bucket/key) - 包含
Bucket和Key字段的对象(无需嵌套FunctionCode)
错误原因是混淆了原生Lambda资源和Serverless Transform资源的属性格式,Serverless Transform对CodeUri的格式要求更简洁,不需要FunctionCode嵌套层。
内容的提问来源于stack exchange,提问作者Kenobi
相关产品推荐
相关产品推荐

