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

AWS SAM CLI部署后解析Secrets Manager SecretString出现JSONDecodeError问题

问题产生原因

这个JSONDecodeError是传入json.loads()的内容为空、或不符合JSON格式导致的,本地和云端运行结果不一致的核心原因是两端运行环境的配置差异,常见触发场景如下:

  • Lambda执行角色缺少secretsmanager:GetSecretValue权限,导致get_secret()调用失败返回空值/错误信息而非预期的JSON字符串,本地测试时使用的个人AWS凭证具备对应密钥的读取权限因此可以正常运行。
  • Lambda部署的区域、使用的密钥名称和本地测试不一致,无法找到对应密钥,返回空结果。
  • 若Lambda部署在VPC内,没有配置NAT网关或Secrets Manager VPC端点,无法访问Secrets Manager服务,调用超时后返回空值。
  • get_secret()函数逻辑问题:部分版本的AWS示例代码会直接返回boto3调用的完整响应字典,而非直接返回SecretString字段,本地测试可能因为提前做了字段提取可以正常运行,云端部署时代码逻辑不一致导致传入了字典而非字符串到json.loads()。
解决方案
  1. 首先添加调试日志定位问题,在json.loads()前打印返回内容的类型和原始值,查看CloudWatch日志确认异常:
login_details = get_secret("pg_srdataset_login_details")
# 新增调试日志
print(f"密钥返回值类型:{type(login_details)},原始内容:{repr(login_details)}")
y = json.loads(login_details)
  1. 配置Lambda执行角色权限,附加对应IAM策略,示例如下:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "你的Secrets Manager密钥ARN"
        }
    ]
}
  1. 确认云端Lambda的运行区域、密钥名称配置和本地完全一致,若通过环境变量传递密钥名称,需确认SAM部署时环境变量已正确注入。
  2. 若Lambda部署在VPC内,要么为子网配置公网NAT网关,要么在VPC中创建Secrets Manager的接口端点,保证网络连通性。
  3. 调整密钥返回值处理逻辑,若get_secret()返回完整响应字典,需先提取SecretString字段再解析:
secret_resp = get_secret("pg_srdataset_login_details")
login_details = secret_resp['SecretString']
y = json.loads(login_details)
  1. 增加容错校验逻辑,避免空值或非法内容传入解析:
login_details = get_secret("pg_srdataset_login_details")
if not isinstance(login_details, str) or len(login_details.strip()) == 0:
    raise ValueError("获取到的密钥内容为空,请检查权限、网络或密钥配置")
try:
    y = json.loads(login_details)
except json.JSONDecodeError as e:
    print(f"密钥解析失败,原始内容:{repr(login_details)},错误信息:{str(e)}")
    raise

内容的提问来源于stack exchange,提问作者user2594200

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 15:57:03