如何使用dotnet lambda package-ci打包arm64架构Lambda部署包
问题描述
- 尝试使用
dotnet lambda package-ci命令打包适配arm64架构的AWS Lambda函数部署包 - 查阅
dotnet lambda package --help文档可知,package命令提供-farch | --function-architecture参数用于指定Lambda函数的运行架构,合法取值为x86_64或arm64,默认值为x86_64 - 查阅
dotnet lambda package-ci --help文档时,未找到对应的架构配置开关 - 先后尝试执行三类命令完成arm64打包,均未生成符合要求的产物:
dotnet lambda package-ci ... --runtime linux-arm64dotnet lambda package-ci ... --function-architecture arm64 --msbuild-parameters "--arch linux-arm64"dotnet lambda package-ci ... --function-architecture arm64
- 所有尝试的执行过程中,自动生成的publish命令均指定
--runtime linux-x64参数,部分命令直接返回执行错误,自动生成的publish命令示例如下:
dotnet publish --output "/codebuild/output/src054284391/src/bbapi/WebApi/./bin/Release/net6.0/publish" --configuration "Release" --framework "net6.0" /p:GenerateRuntimeConfigurationFiles=true --runtime linux-x64 --self-contained false
解决方案
dotnet lambda package-ci 未在CLI命令层暴露架构配置参数,所有架构相关配置默认从项目根目录的aws-lambda-tools-defaults.json文件读取,未读取到对应配置时会强制 fallback 到x86_64默认值,这是手动传参不生效的核心原因。正确操作步骤如下:
- 先升级全局安装的Lambda工具到最新稳定版,规避低版本存在的arm64适配bug:
dotnet tool update -g Amazon.Lambda.Tools
- 在Lambda项目的csproj文件同级目录,找到或新建
aws-lambda-tools-defaults.json配置文件,添加以下两项配置:
{ "function-architecture": "arm64", "msbuild-parameters": "--runtime linux-arm64 --self-contained false" }
配置注意事项:两个配置项必须同时填写。仅配置
function-architecture只会标记部署阶段的函数架构,不会修改dotnet publish阶段的运行时参数,仍会输出x64产物;仅配置msbuild-parameters里的runtime会导致打包产物架构和部署时识别的函数架构不匹配,触发部署错误。
- 配置完成后直接执行常规
dotnet lambda package-ci命令即可,不需要额外在命令行追加架构相关参数,工具会自动读取配置文件中的值,自动生成的publish命令会正确替换为--runtime linux-arm64参数,输出适配arm64架构的部署包。
历史命令失效原因说明
- 直接传入
--runtime linux-arm64:package-ci没有定义该顶层CLI参数,传入后会被直接忽略,不会透传到内部执行的publish步骤 - 直接传入
--function-architecture arm64:低版本工具不识别package-ci命令下的该参数,会直接报参数不存在的错误;高版本即使识别该参数,也不会自动映射为publish步骤的runtime参数,仍会默认使用linux-x64 - msbuild-parameters中传入
--arch linux-arm64:dotnet publish不存在--arch这个运行时指定参数,正确的运行时参数为--runtime(短名-r),错误参数名会被直接忽略,不生效。
内容的提问来源于stack exchange,提问作者Tim Bassett
相关产品推荐
相关产品推荐

