在Localstack中创建dotnetcore3.1运行时Lambda函数失败如何解决
问题产生原因
- Localstack 新版本已取消预装 dotnetcore3.1 运行时:因AWS官方早已终止dotnetcore3.1版本的官方支持,Localstack后续版本不再内置该运行时镜像,创建函数时拉取对应运行时资源失败就会返回500内部错误。
- Lambda入口配置拼写错误:你创建项目时指定的项目名为
Simple.Lambda.DotNet,默认命名空间为Simple开头,但创建函数时的handler参数写为Sample.Lambda.DotNet::Sample.Lambda.DotNet.Function::FunctionHandler,Simple错写为Sample,运行时无法找到入口类触发报错。 - 压缩包结构不符合要求:如果打包后的zip文件内的程序集文件嵌套在子目录中,Lambda执行环境无法在根目录找到对应dll,也会触发内部错误。
- Localstack Lambda服务配置不足:默认配置下Lambda容器拉取镜像超时、网络不通也会导致创建失败返回500。
修复方案
修正handler参数拼写
创建函数时将handler值替换为和项目命名空间一致的配置:Simple.Lambda.DotNet::Simple.Lambda.DotNet.Function::FunctionHandler调整Localstack启动参数,适配dotnetcore3.1运行时
先删除原有Localstack容器,再执行以下命令启动新增适配配置的容器:
docker rm -f localstack_for_lambda docker run --name localstack_for_lambda -p 4566:4566 --platform linux/amd64 -d \ -e SERVICES=sqs,sns,logs,lambda,iam \ -e LAMBDA_RUNTIMES=dotnetcore3.1 \ -e LAMBDA_DOCKER_NETWORK=host \ -e LAMBDA_RUNTIME_ENVIRONMENT_TIMEOUT=120 \ localstack/localstack
校验压缩包结构
执行打包命令前,进入publish目录确认Simple.Lambda.DotNet.dll文件直接在当前目录,再执行打包命令,确保zip文件解压后dll直接在根目录,无嵌套层级。可选:升级运行时版本
如果没有强制使用dotnetcore3.1的需求,建议将项目升级为dotnet6,创建函数时将runtime参数改为dotnet6即可,该版本为AWS和Localstack官方都完整支持的稳定版本,无需额外配置即可运行。
内容的提问来源于stack exchange,提问作者Jacek Kowalski
相关产品推荐
相关产品推荐

