Pydantic Settings自定义AWS参数存储资源无法正常加载API_KEY的问题
Pydantic Settings自定义AWS参数存储资源无法正常加载API_KEY的问题
看起来你遇到的问题是自定义的AWS参数存储源没有正确给API_KEY字段提供值,导致Pydantic抛出缺失字段的错误。我来帮你分析一下问题所在,以及如何解决。
问题根源:自定义源函数的签名不符合Pydantic要求
在Pydantic v2的customise_sources方法中,每个返回的源函数都需要符合SettingsSourceCallable的规范——也就是必须接受一个BaseSettings类型的参数(即使你实际用不到它)。
你的get_aws_prams_store函数现在的签名是:
def get_aws_prams_store(param_name: str = "/dev/dummy-service/API_KEY"):
但当Pydantic调用这个源函数时,会自动传入当前的DummyConfig实例作为参数,这就导致param_name被错误地赋值为DummyConfig对象,而不是你预设的路径字符串。最终调用AWS SSM时用了错误的参数名,自然拿不到API_KEY的值。
解决方法:修正自定义源函数的签名
把get_aws_prams_store的签名改成接受settings参数(可以忽略不用),同时保留你的参数路径逻辑:
from pydantic_settings import BaseSettings import boto3 def get_aws_prams_store(settings: BaseSettings) -> dict[str, str]: # 固定参数路径,也可以根据需求从settings中动态获取 param_name = "/dev/dummy-service/API_KEY" session = boto3.session.Session( profile_name='my-account', region_name="us-east-1") client = session.client("ssm") response = client.get_parameters( Names=[param_name], WithDecryption=True ) # 解析返回结果,映射为模型字段名: 参数值的字典 params = {param["Name"].split("/")[-1]: param["Value"] for param in response["Parameters"]} return params
额外检查点
- 字段名匹配确认:你返回的字典键是
API_KEY,和模型中的字段名完全一致,这是正确的——不需要加dummy_前缀(前缀是给环境变量用的,自定义源直接映射模型字段名)。 - 源的优先级顺序:你在
customise_sources中返回的顺序是init_settings→env_settings→ 自定义源 →file_secret_settings,这个顺序没问题,自定义源会在环境变量之后生效,不会覆盖已有的环境变量值。 - AWS身份验证:你已经单独测试过
get_aws_prams_store能正常工作,所以权限方面应该没问题,但如果修正后还是有问题,可以再确认一下程序运行时的AWS身份(比如是否使用了正确的profile)。
测试修正后的代码
修改完函数后,再初始化DummyConfig:
config = DummyConfig() print("PARAM1", config.PARAM1) # 输出value1 print("PARAM2", config.PARAM2) # 输出value2 print("API_KEY", config.API_KEY) # 输出从AWS SSM获取的真实值
这样应该就能正确加载API_KEY了!
备注:内容来源于stack exchange,提问作者LearnToGrow
相关产品推荐
相关产品推荐

