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

AWS Lambda(Python)调用Redshift发邮件触发ValueError求助

问题分析与解决方案

核心错误原因

你遇到的ValueError是因为在if条件中直接使用了Pandas Series的比较结果:df['ca_active_hosts'] > 0返回的是布尔值Series(每一行对应一个True/False),Python无法直接判断整个Series的"真值",因此抛出歧义错误。

分步修复方案

1. 修正条件判断逻辑

根据业务需求二选一:

  • 若只要有一行ca_active_hosts大于0就触发告警:使用.any()
  • 若所有行ca_active_hosts都大于0才触发告警:使用.all()

示例代码:

# 任意一行满足条件则执行后续逻辑
if (df['ca_active_hosts'] > 0).any():
    # SNS发送逻辑

2. 移除冗余循环

原代码中for row in cur:会先读取游标第一行数据,后续cur.fetchall()只能获取剩余行,导致数据丢失。直接删除该循环,直接读取所有结果:

with con.cursor() as cur:
    cur.execute(sql_query)
    # 直接获取所有查询结果转为DataFrame
    df = pd.DataFrame.from_records(cur.fetchall(), columns=[desc[0] for desc in cur.description])
    df['Time_Stamp'] = pd.to_datetime('now')

3. 处理数据类型(建议操作)

如果ca_active_hosts字段不是数值类型,先转换为数值类型避免比较错误:

# 转换为数值类型,无法转换的填充为0
df['ca_active_hosts'] = pd.to_numeric(df['ca_active_hosts'], errors='coerce').fillna(0)

4. 修复SNS消息拼接错误

直接拼接Series会报错,需根据需求选择消息格式:

  • 发送汇总信息:
active_count = df[df['ca_active_hosts'] > 0].shape[0]
latest_time = df['Time_Stamp'].iloc[0]
message = f'Warning: {active_count} users have active hosts. Latest check time: {latest_time}'
  • 逐行发送单条告警:
for idx, row in df.iterrows():
    if row['ca_active_hosts'] > 0:
        message = f'Warning: User has {row["ca_active_hosts"]} active hosts at {row["Time_Stamp"]}'
        # 执行SNS发送

5. 优化SNS客户端初始化

将boto3.client('sns')放在函数开头,避免重复初始化:

# 函数开头初始化SNS客户端
client2 = boto3.client('sns')

# 后续逻辑中直接调用
response = client2.publish(
    TopicArn='arn:aws:sns:us-west-1:151316834390:email-data-lake',
    Message=message,
    Subject='User Warning'
)

完整修正后的代码片段

# 函数开头初始化SNS客户端
client2 = boto3.client('sns')

con = psycopg2.connect(conn_string)    
filename = '/tmp/Processlist.csv'
with con.cursor() as cur:
    cur.execute(sql_query)
    # 获取所有查询结果并转为DataFrame
    df = pd.DataFrame.from_records(cur.fetchall(), columns=[desc[0] for desc in cur.description])
    df['Time_Stamp'] = pd.to_datetime('now')
    
    # 转换为数值类型并处理空值
    df['ca_active_hosts'] = pd.to_numeric(df['ca_active_hosts'], errors='coerce').fillna(0)
    
    # 判断是否有满足条件的记录
    if (df['ca_active_hosts'] > 0).any():
        # 构造汇总告警消息
        active_count = df[df['ca_active_hosts'] > 0].shape[0]
        latest_time = df['Time_Stamp'].iloc[0]
        message = f'Warning: {active_count} users have active hosts. Latest check time: {latest_time}'
        
        # 发送SNS邮件
        response = client2.publish(
            TopicArn='arn:aws:sns:us-west-1:151316834390:email-data-lake',
            Message=message,
            Subject='User Warning'
        )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:57:14