基于Micronaut+GraalVM+Kotlin的S3触发Lambda函数报'Unconvertible input: null'
解决Micronaut Kotlin Lambda处理S3事件时的"Unconvertible input: null"错误
问题根源
你的代码存在两个核心问题:
- AbstractMicronautLambdaRuntime泛型参数不匹配:错误使用了API网关事件的泛型类型(
APIGatewayProxyRequestEvent/APIGatewayProxyResponseEvent),但你的函数是处理S3事件的,这会导致Lambda运行时无法正确解析输入事件。 - Lambda Handler配置错误:自定义运行时的Handler应该指向继承
AbstractMicronautLambdaRuntime的类,而非MicronautRequestHandler实现类。
修复步骤
1. 修正FunctionLambdaRuntime的泛型参数
修改FunctionLambdaRuntime.kt,将泛型参数替换为适配S3事件的类型:
package com.example import com.amazonaws.services.lambda.runtime.RequestHandler import com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification import io.micronaut.function.aws.runtime.AbstractMicronautLambdaRuntime import java.net.MalformedURLException class FunctionLambdaRuntime : AbstractMicronautLambdaRuntime<Void?, Void?, S3EventNotification, Void?>() { override fun createRequestHandler(vararg args: String?): RequestHandler<S3EventNotification, Void?> { return FunctionRequestHandler() } companion object { @JvmStatic fun main(vararg args: String) { try { FunctionLambdaRuntime().run(*args) } catch (e: MalformedURLException) { e.printStackTrace() } } } }
2. 修正Lambda Handler配置
在AWS Lambda控制台的函数配置中,将Handler设置为:
com.example.FunctionLambdaRuntime
3. 重新构建并部署
执行构建命令重新生成原生镜像包:
./gradlew buildNativeLambda
将新生成的压缩包重新上传至Lambda函数。
验证测试
使用你提供的S3测试事件再次测试,此时函数应该能正常打印Hello, world!,不再出现"Unconvertible input: null"错误。真实的S3通知事件也能正确触发函数执行。
内容的提问来源于stack exchange,提问作者Phrixus
相关产品推荐
相关产品推荐

