AWS CloudFormation部署失败求助:Lambda序列化异常问题
问题分析与解决方案
错误核心原因
这个异常是Jackson序列化机制触发的:
ResourceModel$ResourceModelBuilder类没有可被Jackson识别的序列化属性- CloudFormation Lambda Handler默认开启了
FAIL_ON_EMPTY_BEANS序列化特性,当尝试序列化包含该Builder实例的CallbackContext(嵌套在ProgressEvent中)时,直接抛出异常导致部署失败回滚。
排查与解决步骤
1. 替换CallbackContext中的Builder实例
Builder类是临时构建对象,不适合序列化存储。修改CallbackContext代码,将其中的ResourceModelBuilder替换为已构建完成的ResourceModel对象:
// 错误写法:持有Builder实例 public class CallbackContext { private ResourceModel.ResourceModelBuilder resourceModelBuilder; } // 正确写法:持有构建完成的ResourceModel public class CallbackContext { private ResourceModel resourceModel; }
2. 禁用Jackson的FAIL_ON_EMPTY_BEANS特性
如果必须保留Builder实例,在Lambda Handler的序列化配置中关闭该特性:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import software.amazon.cloudformation.LambdaWrapper; public class Handler extends LambdaWrapper<ResourceModel> { @Override protected ObjectMapper createObjectMapper() { ObjectMapper objectMapper = super.createObjectMapper(); objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); return objectMapper; } }
3. 标记Builder字段为序列化忽略
在CallbackContext的resourceModelBuilder字段上添加@JsonIgnore注解,阻止Jackson尝试序列化该字段:
import com.fasterxml.jackson.annotation.JsonIgnore; public class CallbackContext { @JsonIgnore private ResourceModel.ResourceModelBuilder resourceModelBuilder; }
4. 排查依赖冲突
检查Lambda部署包的依赖树,确认Jackson Databind与AWS CloudFormation Java SDK版本兼容:
- 使用Maven的
mvn dependency:tree或Gradle的./gradlew dependencies命令查看依赖关系 - 确保没有引入多个版本的Jackson库,优先使用AWS SDK自带的Jackson版本
5. 验证部署包一致性
虽然你提到未修改代码,但需确认部署包是否与之前成功版本一致:
- 检查CI/CD流程是否意外引入依赖更新
- 对比本地构建包与Lambda部署包的内容差异
内容的提问来源于stack exchange,提问作者Darshan Ambhaikar
相关产品推荐
相关产品推荐

