Lambda调用SNS发送邮件遇ConnectTimeoutError求助
Lambda调用SNS超时问题排查与修复
遇到的错误
"errorMessage": "Connect timeout on endpoint URL: "https://sns.us-west-1.amazonaws.com/"",
"errorType": "ConnectTimeoutError"
核心修改点与排查方向
1. 网络配置(最可能的根因)
- 如果Lambda部署在VPC内:
- VPC内的Lambda默认无公网访问权限,无法调用SNS公网端点,需二选一解决:
- 给Lambda所在子网配置NAT网关,确保子网路由表指向NAT网关访问公网。
- 在VPC中创建SNS的接口型VPC端点,让Lambda通过内网访问SNS服务。
- VPC内的Lambda默认无公网访问权限,无法调用SNS公网端点,需二选一解决:
- 若Lambda无需访问VPC内资源(比如你的Redshift是公网可访问状态),可直接将Lambda移出VPC,默认即可访问公网SNS端点。
2. 代码逻辑与语法修复
- SQL语法错误:原查询中
so.isclosed as cls后缺少逗号,导致表关联逻辑失效,必须修复:-- 错误代码段 so.isclosed as cls salesforce.opportunity so -- 修改后 so.isclosed as cls, salesforce.opportunity so - 数据读取逻辑冗余:
for row in cur:后调用cur.fetchall()会跳过第一行数据,应直接读取所有结果:cur.execute(sql_query) rows = cur.fetchall() if rows: df = pd.DataFrame.from_records(rows, columns=[desc[0] for desc in cur.description]) df['Time_Stamp'] = pd.to_datetime('now', utc=True) df['ca_active_hosts'] = df['ca_active_hosts'].astype('Int64', errors='ignore') df['ca_active_hosts'].fillna(0, inplace=True) if (df['ca_active_hosts'] >= 0).all(): print('准备发送通知') response = client2.publish( TopicArn='arn:aws:sns:us-west-1:##########:email-data-lake', Message=f'Warning User active_hosts is {df["Time_Stamp"].iloc[0]}', Subject='User Warning' ) else: print('不符合通知条件') else: print('查询无结果') - 显式指定SNS区域:初始化客户端时明确指定区域,避免自动识别出错:
client2 = boto3.client('sns', region_name='us-west-1') - 添加异常捕获:增加错误处理便于排查问题:
try: response = client2.publish(...) print(f'SNS发送成功: {response}') except Exception as e: print(f'SNS发送失败: {str(e)}') raise e
3. 权限与配置验证
- 确认Lambda角色的信任策略允许Lambda服务扮演该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } - 调整Lambda执行超时时间:建议设置为10-15秒,避免因数据库查询耗时过长中断流程。
- 核对SNS Topic ARN:确认账号ID、区域、Topic名称与控制台完全一致。
内容的提问来源于stack exchange,提问作者Dinho
相关产品推荐
相关产品推荐

