使用跨栈引用的S3与Lambda SAM代码部署失败排查求助
可以通过AWS SAM结合跨栈引用创建S3和Lambda资源,以下是错误修复方案
错误原因
AWS::Serverless-2016-10-31 is null 报错的核心问题在于:你使用了CloudFormation原生的AWS::CloudFormation::Stack嵌套栈来部署包含SAM Transform的lambda.yaml模板。CloudFormation服务本身无法直接处理SAM的Transform语法,必须通过SAM CLI预编译将SAM资源转换为原生CloudFormation资源后才能部署。
修复方案(最优解)
将根模板改为SAM模板,使用SAM的AWS::Serverless::Application类型来嵌套子模板,让SAM CLI自动处理所有模板的转换和部署逻辑:
1. 修改root-template.yaml
添加SAM Transform,并将嵌套栈类型替换为AWS::Serverless::Application:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Parameters: BucketName: Type: String Description: "The name of the S3 Bucket" FunctionName: Type: String Description: "The name of the Lambda function" FunctionTimeout: Type: Number Description: "The maximum time in seconds that the function can run before it is stopped" Default: 3 FunctionMemorySize: Type: Number Description: "The size of the memory in MB allocated per invocation of the function" Resources: S3Stack: Type: AWS::Serverless::Application Properties: Location: ./s3.yaml Parameters: BucketName: !Ref BucketName LambdaStack: Type: AWS::Serverless::Application DependsOn: - S3Stack Properties: Location: ./lambda.yaml Parameters: FunctionName: !Ref FunctionName FunctionTimeout: !Ref FunctionTimeout FunctionMemorySize: !Ref FunctionMemorySize Outputs: S3BucketName: Description: Name of the S3 bucket Value: !GetAtt S3Stack.Outputs.S3BucketName S3BucketArn: Description: "S3 Bucket ARN" Value: !GetAtt S3Stack.Outputs.S3BucketArn MyS3LambdaFunctionArn: Description: "The ARN of the Lambda Function" Value: !GetAtt LambdaStack.Outputs.MyS3LambdaFunctionArn
2. 使用SAM CLI部署
确保本地安装了最新版本的AWS SAM CLI,执行以下命令部署:
sam deploy --template-file templates/root-template.yaml --config-file parameters/samconfig.yaml --stack-name your-preferred-stack-name
跨栈引用的有效性确认
你的跨栈引用逻辑是正确的:
s3.yaml通过Export导出了存储桶名称和ARNlambda.yaml通过!ImportValue引用这些导出值LambdaStack设置了DependsOn: S3Stack,保证S3栈先完成部署,确保导出值可用
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

