调用AWSLambda create_function()时Boto3版本不匹配报错排查
编程创建AWS Lambda函数时抛出参数校验异常,报错信息如下:
botocore.exceptions.ParamValidationError: Parameter validation failed:
Unknown parameter in input: "RunTime", must be one of: FunctionName, Runtime, Role, Handler, Code, Description, Timeout, MemorySize, Publish, VpcConfig, PackageType, DeadLetterConfig, Environment, KMSKeyArn, TracingConfig, Tags, Layers, FileSystemConfigs, ImageConfig, CodeSigningConfigArn, Architectures, EphemeralStorage
升级boto3、botocore后,pip查询已安装版本为:
Package Version --------------------- --------- awscli 1.25.8 boto 2.49.0 boto3 1.24.8 botocore 1.27.8
但脚本运行时实际加载的版本为boto3 1.24.4、botocore 1.27.4,与安装版本不匹配。
优先修复直接触发报错的问题
当前报错的核心诱因首先是参数拼写错误:你传入的参数名是RunTime(T大写),而API要求的合法参数名是Runtime(t小写),这个拼写错误和boto3版本无关,修正后即可消除这部分参数校验报错。
解决boto3/botocore版本加载不匹配问题
版本不匹配本质是Python解释器加载包时,优先命中了环境中其他路径下的旧版本包,按以下步骤操作即可强制加载最新版本:
- 第一步:定位旧版本包位置
在脚本开头加入以下代码,打印当前加载的boto3、botocore实际存放路径,确认旧版本来源:import boto3 import botocore print("boto3加载路径:", boto3.__file__) print("botocore加载路径:", botocore.__file__) - 第二步:清理多版本残留,统一环境
绝大多数版本不一致问题是因为执行pip安装的解释器,和运行脚本的解释器不是同一个。先执行以下命令确认两者路径匹配:
如果两个路径不在同一个环境目录下,不要直接用pip命令安装,改用运行脚本的Python解释器全路径执行安装,避免装错环境:# 查看当前默认python路径 which python # 查看当前默认pip路径 which pip
如果是全局环境存在多个版本残留,重复执行卸载命令直到提示包不存在,彻底清除旧版本:# 替换为你的python解释器实际全路径 /your/python/path/python -m pip install --upgrade --force-reinstall boto3 botocorepip uninstall -y boto3 botocore - 第三步:特殊场景下手动指定包加载路径
如果因为系统自带依赖(比如系统预装的awscli依赖旧版boto3)无法修改全局包,可以在脚本最开头,导入boto3之前手动插入新版boto3所在的site-packages路径,让解释器优先加载新版:import sys # 将下方路径替换为你安装新版boto3的site-packages实际路径 sys.path.insert(0, "/your/new/boto3/install/path/site-packages") # 之后再导入boto3即可加载指定版本 import boto3 import botocore # 执行前先验证版本是否符合预期 assert boto3.__version__ == "1.24.8" assert botocore.__version__ == "1.27.8"
内容的提问来源于stack exchange,提问作者BoiteNoire

