You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

额外检查点

  1. 字段名匹配确认:你返回的字典键是API_KEY,和模型中的字段名完全一致,这是正确的——不需要加dummy_前缀(前缀是给环境变量用的,自定义源直接映射模型字段名)。
  2. 源的优先级顺序:你在customise_sources中返回的顺序是init_settings → env_settings → 自定义源 → file_secret_settings,这个顺序没问题,自定义源会在环境变量之后生效,不会覆盖已有的环境变量值。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:55:28